1. 程式人生 > >直方圖均衡化C++實現

直方圖均衡化C++實現

直方圖均衡化主要是為了增強影象的對比度,是直方圖分佈更加均勻

概念可以參考其他部落格的介紹。

主要分為以下幾個主要步驟:

1.統計每一個灰度級的畫素總數
2.計算每一個灰度級的概率(P(valueNumber)/piexelNumber,該灰度級畫素除以畫素總數)
3.累積概率,例如:p1=0.01,p2=0.01,p3=0.02,則累積概率為p1 p1+p2 p1+p2+p3;
4.將灰度值對映為: 灰度級*該灰度級累積概率值

原圖:
在這裡插入圖片描述
直方圖均衡化之後:
在這裡插入圖片描述
程式碼如下:

#include "opencv2/opencv.hpp"
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp" #include "iostream" using namespace cv; using namespace std; bool EqualizeHist(Mat gray, Mat result) { map<int, int>mp; for (int i = 0; i < gray.rows; i++) { uchar* ptr = (uchar*)gray.data + i * gray.cols; for (int j = 0; j <
gray.cols; j++) { int value = ptr[j]; mp[value]++; } } map<int, double>valuePro; double sumPro = 0.0; int sumPixel = gray.cols*gray.rows; for (int i = 0; i < 256; i++) { sumPro += (1.0*mp[i]) / sumPixel; valuePro[i] = sumPro; } for (int i = 0; i < gray.rows; i++) { uchar*
ptr1 = (uchar*)gray.data + i * gray.cols; for (int j = 0; j < gray.cols; j++) { int value = ptr1[j]; double p = valuePro[value]; result.at<uchar>(i, j) = value * p; } } return true; } int main() { Mat srcImage = imread("IMG4_MRF_focus.tif"); Mat image = imread("IMG4_MRF_focus.tif"); Mat imageRGB[3]; split(srcImage, imageRGB); //Mat image1[3]; for (int i = 0; i < 3; i++) { EqualizeHist(imageRGB[i], imageRGB[i]); } merge(imageRGB,3, srcImage); imshow("原圖", image); imshow("直方圖", srcImage); waitKey(); return 0; }