根据维基百科上的定义, 直方图均衡(Histogram Equalization)是图像处理领域中利用直方图对对比度进行调整的方法.
顾名思义, 直方图均衡是将直方图的分布(概率密度)调整为均匀分布.
根据信息论, 信息的熵越大, 包含的信息也就越多, 熵的计算公式如下:
H = − ∑ i = 0 n p ( x i ) l o g 2 ( p ( x i ) ) (1) H=-\sum_{i=0}^{n}p(x_i)log_2(p(x_i)) \tag{1} H=−i=0∑np(xi)log2(p(xi))(1)
只有当 p ( x i ) p(x_i) p(xi) 均匀分布时, 熵的值最大. 对应到图像上, 当图像直方图均匀分布时, 图像对比度最大. 如下图所示:
蓝色为原始图像直方图, 绿色为均衡后直方图, 对应的处理后的图像为:
可以看到, 直方图均衡处理后, 图像变得更加清晰了.
知道了为什么, 就要知道怎么做. 一般直方图均值有以下几个步骤:
p r ( r k ) = n k H ∗ W , k = 0 , 1 , 2 , ⋅ , L − 1 (2) p_r(r_k)=\frac{n_k}{H*W}, k=0,1,2,\cdot,L-1 \tag{2} pr(rk)=H∗Wnk,k=0,1,2,⋅,L−1(2)
s k = T ( r k ) = ( L − 1 ) ∑ j = 0 k p r ( r j ) (3) s_k=T(r_k)=(L-1)\sum_{j=0}^{k}p_r(r_j) \tag{3} sk=T(rk)=(L−1)j=0∑kpr(rj)(3)
式中, H H H, W W W 分别为图像的高和宽, n k n_k nk 表示灰度值为 r k r_k rk 的像素的个数, s k s_k sk 为变换后的灰度值, T ( r k ) T(r_k) T(rk) 为映射函数, 计算过程使用了累计直方图.
知道怎么做了, 就要知道为什么可以这么做. 这里解释下为啥可以这么做, 即公式(3)是怎么得到的.
设原始直方图分为为
p r ( r k ) p_r(r_k) pr(rk)
均衡化后的直方图分布为
p s ( s k ) = 1 L − 1 (4) p_s(s_k)=\frac{1}{L-1} \tag{4} ps(sk)=L−11(4)
映射函数为
s k = T ( r k ) s_k=T(r_k) sk=T(rk)
这里映射函数必须为单调递增函数, 满足:
∫ 0 s k p s ( s ) d s = ∫ 0 r k p r ( r ) d r (5) \int_0^{s_k}p_s(s)ds=\int_0^{r_k}p_r(r)dr \tag{5} ∫0skps(s)ds=∫0rkpr(r)dr(5)
即对应区域间内像素点的总数是一样的, 如下图红色区域所示:
将公式(4)代入公式(5), 则有:
s k L − 1 = ∫ 0 r k p r ( r ) d r \frac{s_k}{L-1}=\int_0^{r_k}p_r(r)dr L−1sk=∫0rkpr(r)dr
因而, 可以得到:
s k = ( L − 1 ) ∫ 0 r k p r ( r ) d r (6) s_k=(L-1)\int_0^{r_k}p_r(r)dr \tag{6} sk=(L−1)∫0rkpr(r)dr(6)
对应的离散形式为公式(3).
直方图均衡过度的强调了灰度个数的重要性, 对数量多的灰度过度的进行了增强, 而图像中, 比例比不是很多的灰度往往更重要, 因而改进的方向就是减少数量多的灰度的影响, 我这里想到的有 3 种方法:
这3种方法的映射关系曲线如下所示:
从图中可以看到, 原始的直方图均衡后图像最亮, 如下所示为几种方法的结果对比, 依次为原图, 原始直方图, 改进0, 改进1, 改进2:
可以看到, 直方图可以改善图像整体的质量, 但对于某些局部图像, 则由于直方图的性质导致过亮或者过暗.
这里总结下直方图均衡化的优缺点: