示例程序016--直方图均衡化(单通道)
什么是直方图均衡化?
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法,用来增加许多图像的局部对比度。尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度。
直方图均衡化基本思想:
直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
用到的函数
void cvEqualizeHist( const CvArr* src, CvArr* dst );
此函数只能处理单通道的灰色图像,对于彩色图像,我们可以把每个信道分别均衡化,再Merge为彩色图像。
代码:参考自http://blog.****.net/xiaowei_cqu/article/details/7606607
// 023 直方图均衡化.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<cv.h>
#include<highgui.h>
void ShowHist(char *WinName,IplImage *image)
{
cvNamedWindow(WinName,CV_WINDOW_AUTOSIZE);
// cvNamedWindow("Hist",CV_WINDOW_AUTOSIZE);
IplImage *gray=cvCreateImage(cvGetSize(image),8,1);
cvCvtColor(image,gray,CV_BGR2GRAY);
CvHistogram *hist = 0; //直方图
int hdims=256;
float hranges_arr[] = {0,255};
float* ranges[]={hranges_arr};
hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, ranges, 1 ); //创建直方图
cvCalcHist(&gray,hist,0,0);
cvNormalizeHist(hist,1.0);
int scale = 2;
//创建一张一维直方图的“图”,横坐标为灰度级,纵坐标为像素个数(*scale)
IplImage* hist_image = cvCreateImage(cvSize(hdims*scale,256),8,3);
cvZero(hist_image);
//统计直方图中的最大直方块
float max_value = 0;
cvGetMinMaxHistValue(hist,0,&max_value,0,0);
for(int i=0;i<hdims;i++)
{
float bin_val = cvQueryHistValue_1D(hist,i); //像素i的概率,即第i个直方块的值
int intensity = cvRound(bin_val*256/max_value); //要绘制的高度,四舍五入
cvRectangle(hist_image, //灰度直方图
cvPoint(i*scale,256),
cvPoint((i+1)*scale - 1, 256 - intensity),
CV_RGB(128,128,128));
}
cvShowImage(WinName,hist_image);
}
int main(int argc, char* argv[])
{
IplImage * image= cvLoadImage("baboon.jpg");
//显示原图及直方图
ShowHist("Source",image);
IplImage* eqlimage=cvCreateImage(cvGetSize(image),image->depth,3);
//分别均衡化每个信道
IplImage* redImage=cvCreateImage(cvGetSize(image),image->depth,1);
IplImage* greenImage=cvCreateImage(cvGetSize(image),image->depth,1);
IplImage* blueImage=cvCreateImage(cvGetSize(image),image->depth,1);
cvSplit(image,blueImage,greenImage,redImage,NULL);
cvEqualizeHist(redImage,redImage);
cvEqualizeHist(greenImage,greenImage);
cvEqualizeHist(blueImage,blueImage);
//均衡化后的图像
cvMerge(blueImage,greenImage,redImage,NULL,eqlimage);
ShowHist("Equalized",eqlimage);
cvWaitKey(0);
return 0;
}
运行结果: