本文为原创作品,转载请注明出处
欢迎关注我的博客:http://blog.csdn.net/hit2015spring 和 http://www.cnblogs.com/xujianqing/
作者: 晨凫追风
本文的学习是基于冈萨雷斯《数字图像处理第二版》这本专著的对应于书中章节3.3
这一篇文章如题,主要是讲直方图均衡化和匹配的一些基本概念。不涉及很多的技术问题专业数学推导,只是为入门图像处理做一个感性的认识,具体应用请朋友们自己发挥创造,欢迎大家一起来交流。
好了言归正传。
直方图统计的概念很早就已经和我们接触了,今天我们统计的对象是数字图像的像素灰度级,正如上一篇博客中介绍的那样,对图像中的每个灰度级进行投票计数。这里定义几个变量:
OK,从定义就可以得到各个变量之间的关系了:
根据我们就可以得到归一化的灰度级直方图了。
在上一篇博客中提到了,直方图的分布与图像的亮度对比度是息息相关的,高对比度的图像直方图分布会覆盖很宽灰度级,而且直方图的分布比较均匀。低对比度的图像直方图分布比较窄,而且集中于灰度级的一侧,上图瞅一眼:
灰度级分布窄的图片
灰度级分布宽的图片
开胃小菜上完,来干货
直方图均衡化
既然直方图的分布对图像有那么直观的影响,能不能开发出一种函数变换让原来不那么均匀的直方图,变得均匀一点呢?答案是肯定的。那就是直方图均衡化。
把输出图像的灰度级用s表示,变换公式就变成了
s = T(rk)
解释一下:这里的均衡化是像素点到对应的像素点变化如图:
每一点的像素经过T(r),对应的输出就是目标的像素灰度级s。
在书中对T(r)进行了如下两个条件的规定
- T(r)在区间[0,L-1]上是单值且单调递增的
- 当0≤r≤L-1时,0≤T(r)≤L-1
对于(a)的解释是,如果原来的灰度级高,那么变换之后输出的灰度级也应该比较高,否则黑白颠倒,图像将不能看了。(b)的限制也比较直接,输出的灰度级不能乱来,太大太小都不行,必须在原来的范围之内,否则显示图片会出错。
把一幅图像的灰度级(r或s)看成是一个随机变量,用Pr(r)和Ps(s)表示灰度级为r和s的概率密度,
然后呢一个非常牛逼闪闪的公式就产生了
其中,w是积分假变量。公式的右边是随机变量r的累积分布函数,因为概率密度函数总是为正,这样函数下方的积分面积就会随着r增大而增大,就满足了(a),当积分积到上限(L-1)时函数下方的面积就成了1,于是满足条件(b)
其中若知道变换T(r)和Pr(r)则s的概率密度可以用概率论的知识得到。
最后证明出输出级s是在L-1的范围内均匀分布是的具体证明截图如下:
这就证明了利用累积分布函数转换灰度级,输出的灰度级s就在[0,L-1]之间服从均匀分布。
最后呢对牛逼的公式进行离散化(求积分换成求和)处理就得到了如下公式
在这里还要强调一点,由于累积分布函数和输入图像的灰度级相乘,不一定得到一个整数,但是输出的灰度级要求整数,于是我们这里四舍五入取整数灰度级。
这样呢只要一幅输入一幅图像,不需要任何的条件,我们就可以对它进行直方图均衡化,这是一个可以自动的完成的算法。
说了这么多,用一个例题来总结一下直方图均衡化的功能
假设有一个图像4X4的16个像素点,最大灰度级为7,对应的像素点的值如下:
4 |
5 |
6 |
6 |
5 |
4 |
5 |
5 |
6 |
6 |
5 |
5 |
5 |
5 |
5 |
6 |
对其进行直方图均衡化。
步骤如下:
- 统计直方图,
- 求出对应的概率密度
3、求累积分布函数
4、求出每个灰度级对应的输出灰度级
5、映射到新的图像
输入灰度级 |
统计直方图 |
概率密度 |
累积分布函数 |
输出灰度级 |
4 |
2 |
0.125 |
0.125 |
0.875=1 |
5 |
9 |
0.5625 |
0.6875 |
4.8125=5 |
6 |
5 |
0.3125 |
1 |
7 |
最后输出图像为
1 |
5 |
7 |
7 |
5 |
1 |
5 |
5 |
7 |
7 |
5 |
5 |
5 |
5 |
5 |
7 |
直方图匹配
上面介绍了对一幅输入图像的直方图进行均衡化的过程,这是一个对图像操作自动增强的过程,但是有时候我们并不想要一个均衡化的直方图,而是想要一个我们指定的直方图,这时候就需要另外一种方法来满足我们的需要,这就是直方图的匹配。
对于直方图匹配的思想书本中介绍了一些算是比较严谨的推导证明过程,但是对于一般的理解来说会比较困难。那么开始一边推导一边解释吧:
首先定义r 、z分别表示输出图像的灰度级和输出图像的灰度级。
Pz(z)是指定的要输出灰度级的概率密度,它是已知的。定义s和v是一个中间过渡图像的灰度级。则有直方图均衡化的伟大公式
为了建立输入和输出的关系,让s = v(关键就是为啥他们要相等呢?)我们回过头来想想改变直方图的本质就知道了。看图
其实就是把原来的灰度级在新的灰度级坐标轴上面重新排列一下,但是对应的灰度级在哪个地方呢?我们要寻找一个关系来匹配一下,于是呢就联想到了累积分布函数身上来。于是呢我们就得到了求解输出灰度级的一种办法。
- 先求的出输出想要输出的每个灰度级的累积分布函数ZCDF(由于灰度级是离散的,所以呢求解出来就大大的简单了)
- 求出输入图像的灰度级的累积分布函数RCDF,这样也很简单吧
- 用输入图像的累积分布函数RCDF去和目标累积分布函数ZCDF去匹配,这个过程中可能不会有一个百分百的相等,但是我们可以匹配一个最接近的输出灰度级。(哪有完美存在呢?你说是不是)逐个进行之后,就把输入图像的灰度级在目标的坐标轴上排列好了。
-
最后和直方图均衡化的最后一步一样,逐个像素进行映射
完成!
原创作品,如有不足,敬请批评指正!转载请先联系博主!谢谢!