直方圖均衡化C++實現
阿新 • • 發佈:2018-11-11
直方圖均衡化主要是為了增強影象的對比度,是直方圖分佈更加均勻
概念可以參考其他部落格的介紹。
主要分為以下幾個主要步驟:
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;
}