日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV中直方图均衡化

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV中直方图均衡化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OpenCV中直方圖均衡化

首先知道直方圖是個什么鬼?在一幅圖像中,直方圖所體現的是每個像素值在所有的像素中所占的比例:例值為127的像素點的個數/圖像總的像素點的個數\color{#f00}值為127的像素點的個數/圖像總的像素點的個數127/
根據這個可以想到在比較 暗的圖像中,直方圖主要分布在0的附近,而在比較亮的圖像中,直方圖主要分布在255附近,為了使圖像更加清晰,體現出更多的紋理等,需要將像素均勻的分布在0-255之間,這樣圖像看起來就不會太暗或者太亮,這就是直方圖均衡化的思想。
具體的步驟:
圖片來自:https://blog.csdn.net/macunshi/article/details/79815870
根據這個圖片上所說,我將均衡化分為以下幾個步驟,并在最后根據這個步驟手寫代碼實現直方圖的均衡化:
1、統計各個像素出現的頻率。
2、計算每個像素頻率的向前累積。
3、根據計算的頻率,得到均衡化后的圖像像素值。
4、根據像素值之間的映射將原圖像進行相應的處理。

當然了,我們可以不用這麼麻煩,因為OpenCV再一次給我們了一個方便至極的API函數:

equalizeHist(輸入圖像,要求是但通道灰度圖。輸出圖像。 );

下面看一下手動實現吧!效果沒有使用API來的好,所以推薦使用API,但也要知道如何實現。在一個小白看來API確實開發方便,但如果只是會使用API,而對實現的原理一無所知,不僅API函數用不好,基礎也沒法得到鍛煉。

int a[256][3];//定義一個256行3列的數組,第一列存貯0-255像素值,第二列存儲出 現的次數,第三列存儲均衡化后的像素值。這樣第一列和第三列就構成了原像素到新像素的映射關系。for(int i = 0 ;i < 256;i++){a[i][0] = i;a[i][1] = 0;a[i][2] = 0;}for(int row = 0;row < dst.rows;row++){for(int col = 0;col < dst.cols;col++){a[dst.at<uchar>(row,col)][1] += 1;}}double p[256];//定義一個數組用來存儲每個像素出現的頻率。for(int i = 1;i < 256;i++){p[0] = (float)a[0][1]/(dst.rows*dst.cols);p[i] = (float)a[i][1]/(dst.rows*dst.cols) + p[i-1];a[i][2] = int(p[i]*255+0.5);}for(int row = 0;row < dst.rows;row++){for(int col = 0;col < dst.cols;col++){dst.at<uchar>(row,col) = a[dst.at<uchar>(row,col)][2];//根據映射關系將原像素值由新像素值替代。}}imshow("dst",dst);

以下是完整的代碼:

#include "opencv2/opencv.hpp"using namespace std; using namespace cv;int main() {Mat src = imread("/home/dynamicw/Project/C++_Project/opencvtest/src/lesson01/source/map.png");Mat dst;cvtColor(src,dst,CV_RGB2GRAY);imshow("yuan",dst);equalizeHist(dst,src);imshow("src",src);int a[256][3];for(int i = 0 ;i < 256;i++){a[i][0] = i;a[i][1] = 0;a[i][2] = 0;}for(int row = 0;row < dst.rows;row++){for(int col = 0;col < dst.cols;col++){a[dst.at<uchar>(row,col)][1] += 1;}}double p[256];for(int i = 1;i < 256;i++){p[0] = (float)a[0][1]/(dst.rows*dst.cols);p[i] = (float)a[i][1]/(dst.rows*dst.cols) + p[i-1];a[i][2] = int(p[i]*255+0.5);}for(int row = 0;row < dst.rows;row++){for(int col = 0;col < dst.cols;col++){dst.at<uchar>(row,col) = a[dst.at<uchar>(row,col)][2];}}imshow("dst",dst);waitKey(0);return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的OpenCV中直方图均衡化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。