OpenCV学习(十六)之直方图均衡化并画出直方图

实验环境: 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;

}

实验结果:

原始图像:


原始直方图:



直方图均衡化结果:


均衡化后的直方图:



猜你喜欢

转载自blog.csdn.net/ZYTTAE/article/details/42747661