Rumia's blog

layout: post title: “直方图均衡化” subtitle: “ "关于数字图像处理的直方图的理解"” date: 2020-04-24 18:00 author: “Rumia” catalog: true category: blog tags:

- CV

他的与众不同之处在于,是透过光线看阴影还是透过阴影看光线

​ —— 大卫 林赛

1. 什么是直方图均衡化

直方图均衡化本质上属于一种灰度变换与空间滤波技术的范畴,以像素为基本操作单位,对数字图像进行处理。

直方图均衡化,顾名思义,就是对直方图进行均衡的一种算法,是一种对图像对比度进行调整的算法

2. 为什么要进行直方图均衡化

有些时候我们得到的图形会因为一系列原因产生与实际需求相悖的图像,比如下面:

UTOOLS1587724401362.png

这幅图像看起来就像是被蒙上了一层雾,图像的可视性受到了一定的损害,为此,需要对图像进行处理,使之动态范围变大,提高对比度,经过直方图变换后的图像如下:

UTOOLS1587724553810.png

当然这只是对图像进行均衡的其中一个原因,具体的原因需要和实际需求相结合,毕竟,工程领域做什么都要与实际需求结合。

3. 如何进行直方图均衡化

以一个8×8的灰度图像为例:

UTOOLS1587727407685.png

该灰度图像的灰度值出现次数如下表所示,为了简化表格,出现次数为0的值已经被省略

灰度值 出现次数 灰度值 出现次数 灰度值 出现次数 灰度值 出现次数 灰度值 出现次数
52 1 64 2 72 1 85 2 113 1
55 3 65 3 73 2 87 1 122 1
58 2 66 2 75 1 88 1 126 1
59 3 67 1 76 1 90 1 144 1
60 1 68 5 77 1 94 1 154 1
61 4 69 3 78 1 104 2    
62 1 70 4 79 2 106 1    
63 2 71 2 83 1 109 1    

累积分布函数(cdf)如下所示,与上一表格类似,为了简化,累积分布函数值为0的灰度值已经被省略

灰度值 cdf 灰度值 cdf 灰度值 cdf 灰度值 cdf 灰度值 cdf
52 1 64 19 72 40 85 51 113 60
55 4 65 22 73 42 87 52 122 61
58 6 66 24 75 43 88 53 126 62
59 9 67 25 76 44 90 54 144 63
60 10 68 30 77 45 94 55 154 64
61 14 69 33 78 46 104 57    
62 15 70 37 79 48 106 58    
63 17 71 39 83 49 109 59    

如表格所示,灰度值最小值为52,最大值为154. 通常,直方图均衡化算式如下:

UTOOLS1587727840799.png

累积分布函数最小值cdfmin在本例中为1,最大值cdfmax在本例中为64,而L则是灰度级数(如本例中,图像为8位深度,则灰度级数共有2^8=256级数,这也是最常见的灰度级数).则对于本例的直方图均衡化算式为:

UTOOLS1587727950396.png

例如,灰度为78的像素的累积分布函数为46,均衡化后,灰度值变化为:

UTOOLS1587727962375.png

直方图均衡化后,图像的灰度值变化如下表所示:

UTOOLS1587727975648.png

图像效果:

UTOOLS1587727985876.png

从灰度直方图上来看,就是集中分布在某一个灰度区间上分布展开的一个过程,对#2中给出的图像进行距离说明,对于before,其直方图如下:

UTOOLS1587728065547.png

其中直方图为红色部分,黑色部分为累积直方图

对于变换后的图像灰度分布如下:

UTOOLS1587728126789.png

可以看出,直方图均衡化将累积分布进行了线性化操作,将灰度直方图分布在灰度级上均匀展开,增加了图像的动态范围和对比度,可视性增强。

4. 实现原理

考虑一个离散的灰度图像 {x}(二维信号),让 ni 表示灰度 i 出现的次数,这样图像中灰度为 i 的像素的出现概率是

UTOOLS1587728301480.png

L是图像中所有的灰度数,n是图像中所有的像素数,$p_x(i)$实际上是像素值为i的直方图的归一化形式,把对应于$p_x$的累积分布函数,定义为:

UTOOLS1587728402544.png

是图像的累计归一化直方图。

我们创建一个形式为 y = T(x) 的变换,对于原始图像中的每个值它就产生一个 y,这样y的累计概率函数就可以在所有值范围内进行线性化,公式如下:

UTOOLS1587728457400.png

再将这些值逆映射到初试的域即可。


参考文献:

  1. wikipedia 直方图均衡化
  2. 知乎