在上一篇文章中直接给出图像直方图均衡化的基本思想和实例代码,这一篇文章给自己深入了解直方图均衡化具体的实现数学原理。
直方图均衡化原理
累积分布函数CDF原理
其中图像直方图均衡化中最常用方法(即opencv里使用的方法)是累积分布函数CDF。在基本图形分析中,CDF可能是最不出名且最不受待见的工具。相对于直方图和KDE,它们没有太多直观上的吸引力,但CDF能够让我们对数据做出定量的描述,这是我们常常需要却又很难从直方图获得的。
连续情况下,非均匀概率密度函数
Pr(r)
经过变换函数
T(r)
转换为均匀概率分布函数
Ps(s)
的情况。其中
r
为变换前的归一化灰度值,
对于
s=T(r)
假定:
(1) 在
0≤r≤1
区间内,
T(r)
为单调递增函数,且满足
0≤T(r)≤1
(2) 变换
r=T−1(S)
存在,
0≤S≤1
,也满足类似(1)的条件,
0≤r≤1
有
0≤T(r)≤1
条件(1)保证原图中各灰度级在变换后仍保持以黑 \to 白(白
→
黑)的排列次序,避免整个图像变亮或变暗;
条件(2)保证变换前后在灰度值动态范围内的一致性。反变换也满足这2个条件。
对于连续的函数,
Pr(r)
和
Ps(s)
分别是灰度
r
和
直方图均衡化的目的是保证每个灰度级的概率密度相等,即是一个常数:
L 是均衡化后灰度的变化范围,在这里归一化为1,即:
此式表明,当变换函数为原图像密度函数的分布函数时,能达到直方图均衡化目的。
对于离散的情况有:
看到这里我懵逼了,不要问,千万不要问我。看下面的例子:
设有一副 64∗64 的图像,8bit灰度图像(图中有8个灰度值),那么这幅图像有4096个像素点,灰度级分布在在 pr(rk) :
r0=0,n0=790,pr(0)=0.19
r1=1/7,n0=1023,pr(1)=0.25
r2=2/7,n2=850,pr(2)=0.21
r3=3/7,n3=656,pr(3)=0.16
r4=4/7,n4=329,pr(4)=0.08
r5=5/7,n5=245,pr(5)=0.06
r6=6/7,n6=122,pr(6)=0.03
r7=1,n5=81,pr(7)=0.02
ri 灰度级数, ni 灰度级数的像素点总数, pi 非均匀概率密度函数。根据变换函数公式可计算出 sk 如下:
s0=∑pr(rj)=0.19
s1=∑pr(rj)=pr(r0)+pr(r1)=0.19+0.25=0.44
同样可得:
s2=0.65,s3=0.81,s4=0.89,s5=0.95,s6=0.98,s7=1.00
由于原始图像的灰度只有8级,因此上述各需以1/7为量化单位进行舍入运算,得到:
s0舍入=1/7,s1舍入=3/7,s2舍入=5/7,s3舍入=6/7
s4舍入=6/7,s5舍入=1,s6舍入=1,s7舍入=1
由此可见,实际上只存在5个灰度级, si 为5个灰度级 Nsi 为与之对应的像素数, Pr(si) 为均衡后累计分布概率:
s0=1/7,Ns0=790,Pr(s0)=0.19
s1=3/7,Ns1=1023,Pr(s1)=0.25
s2=5/7,Ns2=850,Pr(s2)=0.21
s3=6/7,Ns3=985,Pr(s3)=0.24
s4=1,Ns4=448,Pr(s4)=0.11