一、介绍
1.什么叫直方图
这篇文章出现的有点早,因为要连续介绍图像锐化的方法,我这里就把直方图均衡化也加进来了。直方图均衡化是一个简单好用的函数,但是这里面有两个名词很难理解,什么叫直方图??什么叫直方图均衡化???,这里先简单解释一下相关概念。
直方图,是指对整个图像像在灰度范围内的像素值(0~255)统计出现频率次数,据此生成的一个统计表,称为图像直方图。它是一个统计学概念,可以反映图像灰度的分布情况。
举例说明,我们把 0 - 255 ,一共256个值分为10个等级,其中 0到24是一级,25到50是二级,51到76是三级,77到102是四级,103到128是五级,129到154是六级,155到180是七级,181到206是八级,207到232是九级,233到255是十级。如果有一个9 * 9的灰度图,其具体的数值根据上述分级方法,得到一个级数图是这样的:
注意了:上图中的 1 代表实际灰度图的值在 0 到 24之间,10 就代表实际灰度图的值在 233 到 255之间
根据上图,得到一个级数的统计表,如下图:
这个表用excel中的折线图表示,就是这样的:
2.什么叫直方图均衡化
看上面这个“出现次数”统计表,很明显,等级4、5、6出现的次数较多,也就是原始的灰度图中,像素值在77到102、103到128、129到154中的比较多,其余像素值比较少。整体上看这个灰度图不会太黑,因为等级1、2、3的很少;也不会特别亮,因为等级7、8、9、10的比较少。
直方图均衡化,其实就是将等级4、5、6向两边拉伸,由一个又尖又陡的曲线图,变成平缓一些的曲线图,就像是下图这样:
具体拉伸方法,我也不会,大概意思就是这样,读者们可以自己去找找相关资料。
3.直方图均衡化的作用
直方图均衡化就是让那些较大的亮度在全局图像中更好的分布,一般用来增加图像的全局对比度,对于背景和前景都太亮或者太暗的图像非常有用。
4.直方图均衡化的函数
Emgu CV里面直方图均衡化的函数是EqualizeHist(),函数定义如下:
public static void EqualizeHist(
IInputArray src, //输入图像, 8位单通道的灰度图
IOutputArray dst //输出图像, 也是8位单通道的灰度图
)
二、举例
1.原始素材
原始素材定义为srcMat,如下:
这是个电影里的镜头,下面看一下锐化效果。
2.代码
直方图均衡化代码如下:
Mat tempMat = srcMat.Clone();
Mat dstMat = new Mat(tempMat.Size, tempMat.Depth, 1);
// 彩色图像三通道要专为灰度图,分别对每个通道进行直方图均衡化,再通道合并
CvInvoke.CvtColor(tempMat, tempMat, ColorConversion.Bgr2Gray);
// 直方图均衡化,输出的是单通道灰度图
CvInvoke.EqualizeHist(tempMat, dstMat);
3.运行结果
直方图均衡化的结果,比灰度图要亮很多,看上去就像是白天拍摄的效果。再举个例子大伙儿看看:
看到了吧,直方图均衡化代码简单,就一个函数自动完成计算,也不用输入任何参数,就可以把一副图像变成明暗分布更加均匀。
直方图除了均衡化以外,还有归一化、匹配等功能,讲完图像锐化,接下来就细细地讲它。
原创不易,请勿抄袭。共同进步,相互学习。