上课的时候很不理解为什么累积分布函数可以实现均衡化,百度了很久终于搞懂了,记录一下自己的理解,希望能帮到以后的人

下面没有数学公式推导,希望能帮大家能从图形的角度去理解直方图均衡化的过程
(电脑作图太麻烦了,我直接手画,请谅解哈哈)

直方图均衡化过程

首先,先摆出直方图均衡化的计算过程

  1. 得到原始图片的灰度直方图
  2. 得到各个灰度级对应的概率密度函数
  3. 通过概率密度函数得到累积分布函数
  4. 累计分布函数乘以255,得到每一个灰度级对应的新的灰度
  5. 通过第4步的结果,将旧灰度映射得到新的灰度,即更新整张图片的灰度
要解决的问题

为什么直方图均衡化要用到累积分布函数

直方图想要实现的效果

下面两张图,左上角是原图(对,原本就是灰色的),右上角是经过直方图均衡化处理后的结果,可以发现区别在于:原图比较暗,处理后的图片对比度更强

没错!直方图均衡化做的就是这样一件事情,调整图片的对比度,而要实现这个目标,实际上就是使得图片的亮暗程度增加,因此需要引入灰度直方图(也就是左下角和右下角的直方图)

直方图归一化和直方图均衡化 直方图均衡化流程_直方图归一化和直方图均衡化


灰度范围是[0,255],当为1时,像素的灰度为1时,该像素点为黑色;像素的灰度为0时,该像素点为白色。

所谓的灰度直方图,就是统计图片中所有的像素点在各个灰度级的个数分别为多少,例如,一张图片有总共有9个像素点,灰度为1的有1个像素点,灰度为2的有2个像素点,灰度为3的有3个像素点,灰度为4的有2个像素点,灰度为5的有1个像素点,那么这张图片的灰度直方图应该如下图所示:

直方图归一化和直方图均衡化 直方图均衡化流程_直方图归一化和直方图均衡化_02


如果图片的亮暗程度增加,那就应该扩展灰度范围,因为可能有些图片灰度范围不大,只有[100,200],或者也可能虽然灰度范围大,但主要的像素点都集中在某一个灰度上,不均匀

我们还是回到一开始的图片,对比两个直方图,可以发现均衡化的直方图蓝色向两边扩散,说明有一下一些像素点的灰度发生了变化,更具体的原因:

  1. 灰度低的像素点变多了;
  2. 灰度高的像素点变多了;
  3. 中间原本集中的点,被分散到了其他灰度。

这三个点很重要后面会用到!

直方图归一化和直方图均衡化 直方图均衡化流程_像素点_03


由上述得,只要我们能够找到这样的一个函数,使得旧的灰度直方图发生以上三个变化,那么也就实现对比度的增强

概率密度函数、累积分布函数

首先简单介绍下概率密度函数累积分布函数
概率密度函数,其实就是我们通常所说的概率,在上面的例子中,总共像素点9个,灰度1的像素点只有1个,因此灰度1的概率密度是1/9,同理可得灰度为2、3、4、5各自的概率密度分别为2/9、3/9、2/9、1/9

可以发现,其实概率密度函数是和个数相关的,所以
直方图归一化和直方图均衡化 直方图均衡化流程_直方图归一化和直方图均衡化_04

这个后面会涉及到!

累积分布函数,其实就是概率密度函数的局部积分,即概率密度函数的总0开始到某一点的面积和,若是离散的情况,则是概率密度函数的累加

还是上面那个例子:

灰度1的累积分布值为:1/9

灰度2的累积分布值为:1/9+2/9 = 3/9

灰度3的累积分布值为:1/9+2/9+3/9 = 6/9

灰度4的累积分布值为:1/9+2/9+3/9+2/9 = 8/9

灰度5的累积分布值为:1/9+2/9+3/9+2/9+1/9 = 1

显然,最终的结果必然1

直方图归一化和直方图均衡化 直方图均衡化流程_概率密度函数_05


虽然图片不是很明显,但是我们还是可以发现累积分布函数三个特点:

  1. 累积分布函数是和概率密度函数密切相连的;
  2. 当概率密度最大时,累积分布函数的斜率是最大的,也就是最陡,变化幅度最大;
  3. 累积分布函数的开头和结尾的变化幅度都不大,也就是平缓。

这三个结论也很重要!

下面这样图片会更直观的体现我刚才说到的特点

(这是一个正态分布的连续数据,横轴x代表可能的取值,纵轴y代表每个取值对应的概率密度值,橙色的线代表了每个取值对应的累积分布值,最终累计分布值为1)

直方图归一化和直方图均衡化 直方图均衡化流程_直方图归一化和直方图均衡化_06


(实验来自看见统计

图解均衡化步骤

(实际图片的数据是离散的,下面为了方便作图,我画的是连续的曲线)

  1. 得到原始图片的灰度直方图

其实是为了得到旧图片的概率密度函数

  1. 得到各个灰度级对应的概率密度函数

其实是为了得到旧图片的累积分布函数

  1. 通过概率密度函数得到累积分布函数
  2. 累计分布函数乘以255,得到每一个灰度级对应的新的灰度

其实是为了得到映射所需要的函数
这个函数的横坐标含义是从0到255的所有灰度级,纵坐标的含义是映射后的灰度值,整个函数的含义是旧灰度值的像素点,在新图片中所对应的新灰度值应为多少

这个后面在理解映射的时候会用到!

  1. 通过第4步的结果,将旧灰度映射得到新的灰度,即更新整张图片的灰度

其实是为了完成映射

现在我们假设有一组很极端的数据,大部分都集中在中间,两侧的数据分布特别少,然后我们要对这组数据进行均衡化(也就是映射),使得这组数据的分布变得均匀

下面这张图片是映射的过程,从右下角开始看(跟着箭头走):

直方图归一化和直方图均衡化 直方图均衡化流程_像素点_07

  • 不同图的x,y实际意义不同,在这里仅仅是作为提示观察的角度;
  • 右下角图片①,对应的是旧图片的概率密度函数;
  • 右上角图片②,实际上应为旧图片的累计分布函数乘以 255,但是这里为了方便观它概率密度函数和累计分布函数的关系,所以没有乘以255这个系数,而是用累计分布函数表示;
    (因为只是乘以一个255系数而已,图形是不会变的,变得只是纵坐标轴,在这里的目的是观察曲线形状,所以不影响)
    但图形不变,不代表意义相同,乘以255前,曲线代表的是累计分布函数;乘以255后,曲线代表的是:旧灰度的像素点对应的新灰度应为多少)
  • 左上角图片③,实际上应为均衡化后的灰度直方图,但是这里为了对比均衡化前后概率密度的变化,所以画的是概率密度函数。
    (需要把头转一下,注意坐标轴x,y)
    (别忘了前面!灰度直方图与概率密度函数只是差一个系数,所以图形是一样的!)

所谓映射就是,图片①的数据x值,作为图片②的x值输入,得到图片②的y值,然后将这个y值,作为新图片的x值(即图片③的输入),然后就可以得到新的灰度直方图!

图片②的输出y值实际是对应新的灰度值,因此刚好对应灰度直方图的横坐标,所以可以重新统计,得到新的灰度直方图

那为什么映射之后中间原本密集的数据就变得分散了呢

因为数据最密集的地方(即概率密度函数最大的地方),刚好对应累计分布函数斜率最大的地方(前面的重要结论)
斜率大意味着图片②中的x哪怕只变化一点点,y也会变化的很大,因此原本集中x在某一段区间的数据,变成了y轴的新区间。例如原本在x的区间为[5,6],当y=10*x的时候,就是对应y轴[50,60],区间一下子变大了!
意思就是说,原本在5和6的数据,现在变为50和60,所以数据因此被分散了。

同时要注意的是,因为映射前后数据的数量的不变的(即均衡化前后图片的像素点个数不变),且数据是离散的

所以原本x在5.5的地方数据量为0的话,那么经过y=10*x的映射后,在x=55的数据量依然为零(后面会再次提到这个点)

也可以通过下面这个图来理解,均衡化只是把数据的位置移动了,高度是不会变的

如果原本的灰度直方图高度为10,那么在映射后的直方图高度依然为10!只是位置发生了变化而已!

直方图归一化和直方图均衡化 直方图均衡化流程_像素点_08

下面我们看一下两端的数据,还是刚才的那一张图,我们看一下黑色阴影部分:

直方图归一化和直方图均衡化 直方图均衡化流程_概率密度函数_09


图片①黑色阴影区域的底边长(涵盖的灰度级数多),当它通过图片②的映射时,因为图片②斜率很小的原因,所以哪怕输入x的区间很大,输出y的变化也很小,例如,原本在x的区间为[10,30],当y=0.1*x的时候,就是对应y轴[1,3],y几乎没什么变化!

发现了没有!与上面的例子刚好相反!

直方图归一化和直方图均衡化 直方图均衡化流程_灰度_10

(同理可得,当灰度级高的时候,对应的累计分布函数斜率小,所以映射后也会出现同样的效果)

正是因为,累计分布函数的斜率,在数据集中的地方比较大(即概率密度函数高的地方),在数据量小的地方比较小(即概率密度函数小的地方),从而实现了我们前面提到了想要的效果:

  1. 灰度低的像素点变多了;
  2. 灰度高的像素点变多了;
  3. 中间原本集中的点,被分散到了其他灰度。

下面我们来看看实际的数据,以红色阴影区为例,我们可以发现映射前,作为输入的H1区间为[100, 150],变化范围是50,而映射后,输出H2的区间范围显然大于50,说明映射后的灰度范围变大了

直方图归一化和直方图均衡化 直方图均衡化流程_概率密度函数_11


同时我们可以发现,新的概率密度函数曲线非常多的跳变,不像旧的概率密度函数曲线那么平滑

原因是,正如前面所说,由于映射后范围扩大了,所以原本很接近的数据之间的间隔变大了,例如原本x1=1,x2=2,经过y=3*x的映射,新的x1为3,新的x2为6,中间的4,5因为原本就没有数据,所以是0,所以在绘制新的曲线的时候在3和6之间曲线跌到0那如果原本的数据分布变化了一下会怎么样呢,我们再举一个极端的例子

假如说一开始,旧的概率密度函数曲线往左靠,即大部分像素点都是灰度都很小

直方图归一化和直方图均衡化 直方图均衡化流程_灰度_12


你会发现,咦?好像概率密度的地方对应的斜率也很小,映射后y的变化区域不大啊,怎么回事?

因为图中的累计分布函数是错的!!!那根本不是对应的累计分布函数!!!

别忘了前面的结论,累计分布函数是和概率密度函数相关的,是概率密度的累加,因此实际的累计分布函数应该是如红笔所示:

直方图归一化和直方图均衡化 直方图均衡化流程_像素点_13


图片③中的阴影区域才是真正的映射!别忘了前面所说的累计分布函数的三个特点!更加准确的可以看下面这个图,累计分布函数比之前更快的上升,更快地抵达1

直方图归一化和直方图均衡化 直方图均衡化流程_像素点_14


总结

好了,下面可以总结下为什么用到的是累计分布函数了:
若要提高对比度,要实现下面的目标

  1. 灰度低的像素点变多;
  2. 灰度高的像素点变多;
  3. 中间原本集中的点,被分散到了其他灰度。

而累积分布函数因为可以随概率密度自动调整斜率,使得概率密度函数大的地方(即数据集中的地方)总是接近累积分布函数斜率大的地方,概率密度函数小的地方(即数据量小的地方)总是接近累积分布函数斜率小的地方,从而造成x,y的区间变化不对等,进而实现对数据分布的调整!