实验环境: VS2010 + OpenCV2.4.9.0
#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace std;
using namespace cv;
void showHistogram(Mat &src, int bins,char* wndName)
{
int histSize[] = {bins};
float range[] = {0,bins};
const float* ranges[] = {range};
MatND hist;
int channels[] = {0};
calcHist(&src, 1, channels, Mat(), hist, 1, histSize, ranges, true, false);
double maxVal;
minMaxLoc(hist, 0, &maxVal, 0, 0);
int scale = 2; //histogram size(width)
int histHeight = 256;
Mat histImage = Mat::zeros(histHeight,bins * scale,CV_8UC1);
for(int i = 0; i < bins; i++)
{
float binVal = hist.at<float>(i);
int intensity = cvRound(binVal * histHeight/maxVal);
rectangle(histImage,Point(i * scale,histHeight - 1),
Point((i + 1)*scale - 1,histHeight - intensity),CV_RGB(255,255,255));
}
namedWindow(wndName,CV_WINDOW_AUTOSIZE);
imshow(wndName,histImage);
}
int main(int argc,char** argv)
{
Mat src,dst;
char* source_window = "Source Image";
char* equalized_window = "Equalized Image";
src = imread("lena.jpg");
if(!src.data)
{
cerr << "Read Image Failed!" << endl;
exit(1);
}
cvtColor(src,src,CV_BGR2GRAY);
equalizeHist(src,dst);
namedWindow(source_window,CV_WINDOW_AUTOSIZE);
imshow(source_window,src);
namedWindow(equalized_window,CV_WINDOW_AUTOSIZE);
imshow(equalized_window,dst);
//show the histogram
int bins = 256;
showHistogram(src, bins,"Original Image Hist");
showHistogram(dst, bins,"Equalized Image Hist");
waitKey(0);
return 0;
}
实验结果:
原始图像:
原始直方图:
直方图均衡化结果:
均衡化后的直方图: