图像的直方图显示与直方图均衡处理

一.直方图概念

        直方图其实就是一副图像的灰度级统计,设一副图像的灰度级为[0,L-1],则可以建立一个二维坐标系(x,y),x取值[0,L-1],y取值为相应灰度级的像素数量。如果是归一化直方图,则y代表该灰度级在图像中的出现概率


二.基于opencv的直方图显示

      相较于matlab ,opencv的直方图显示要麻烦的多,因为它生成的只是一个数组,需要自己手动画出来,这里介绍基于c++ API的显示方法:

       核心函数:

      void calcHist(const Mat*arrays, intnarrays, const int*channels, InputArraymask, OutputArrayhist, intdims, const int*histSize, const float**ranges, booluniform=true, boolaccumulate=false )

      常用参数简介,详细请参考opencv文档:

      arrays:需要显示的图像数组;

      narrays:输入的图像数目,一般都是取1吧;

      channels:输入图像的通道数目,这里比较麻烦,详细参见官方文档,一般取1,也就是单通道灰度图;

      mask:不明,通常取mat();

      hist:输出的直方图数组;

      dims:直方图维度;

      histSize:直方图尺寸,如果是8位深就取256;

      ranges;显示范围

      这里给出一个简单的直方图显示类,将常用参数封装了一下:    

class Histogram
{
public:
	Histogram()
	{
       histSize[0] = 256;
	   hrangee[0] = 0.0;
       hrangee[1] = 255.0;
	   ranges[0]= hrangee;//8位深度,256灰度级
	   channels=0;
	}
	Mat calcHistogram(const Mat& imageGray)//创建直方图显示
	{   
		Mat hist,histImage;	
	    calcHist(&imageGray, 1, 0, Mat(), hist, 1, histSize, ranges);//构建直方图矩阵
		histImage=showHistogarm(hist);//图形显示
		return histImage;

	}
	Mat calcEqualizeHistogram(const Mat& imageGray,Mat& imageGrayEqualize)//直方图均衡化
	{
		Mat hist,histImage;	
		equalizeHist(imageGray,imageGrayEqualize);//直方图均衡
	    calcHist(&imageGrayEqualize, 1, 0, Mat(), hist, 1, histSize, ranges);
		histImage=showHistogarm(hist);
		return histImage;

	}
	~Histogram()
	{

	}
private:
	Mat showHistogarm( Mat& hist)//直方图的图形显示
	{
		Mat histImage = Mat::ones(200, 320, CV_8U)*255;//初始化图像
		normalize(hist, hist, 0, histImage.rows, CV_MINMAX, CV_32F);//归一化
		histImage = Scalar::all(255);

		int binW = cvRound((double)histImage.cols/histSize[0]);//各灰度级显示的宽度

		for( int i = 0; i < histSize[0]; i++ )//灰度256级,依次画出每一级的矩形表示
            rectangle( histImage, Point(i*binW, histImage.rows),
                   Point((i+1)*binW, histImage.rows - cvRound(hist.at<float>(i))),
                   Scalar::all(0), -1, 8, 0 );
		return histImage;
	}
private:
	int histSize[1]; //直方图尺寸
	float hrangee[2];
    const float *ranges[1];//灰度级
	int channels;//通道数
};


三.直方图的简单应用,直方图均衡:

          直方图均衡可以说是最常用也是最基础的图像增强方法了,大致原理既是将图像的灰度范围动态展宽,是所有图像灰度级实现等概率分布。

          假设r为输入图像灰度,s为增强图像灰度值,P(r),P(s)分别为相应的概率密度,设s,r之间存在灰度变换公式:

                                          

         那么通过这样的变换,输出的图像存在怎么的特性呢?这里先给出一个概率变换公式:

                                  

         接下来推倒此公式:

                   

                               

             可以看到,对于任意取值的输出灰度值s,其概率密度都为1,即实现所有灰度的等概率分布,根据上述变换公式得到的图像即所谓的直方图均衡

             通常的直方图均衡都是基于灰度图像的,如果处理通常的rgb彩色图像的话,可以参考2种方法,一种即所有通道单独执行直方图均衡,然后合成图像,第二种可以将图像转换到YUV或者HSI色彩空间,然后只对亮度通道单独处理就可以了。

            opencv中实现直方图均衡倒是很简单,直接调用equalizeHist函数就可以了。


四.实验测试

           实验程序已上传,下载链接:

           http://download.csdn.net/detail/emiyasstar__/3734114

           实验图像是opencv samples里的那只狒狒= =,处理效果还是很明显的,但是直方图显示好像有点问题,欢迎各位指正


          


参考书籍:数字图像处理 冈萨雷斯;

                           opencv 官方文档。             

                           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值