一、灰度空间的直方图均衡
1.直方图
灰度级范围为[0,L-1]的数字图像的直方图是离散函数 h(rk)=nk,其中rk是第k级灰度值,nk是图像中灰度为rk的像素个数。在实践中,经常用乘积MN表示的图像总像素除每个分量来归一化直方图,通常M和N是图像的行数和列数。因此,归一化后的直方图由
p(rk)=MNnk给出,其中k=0,1,...,L−1。归一化直方图的所有分量之和应等于1。
直观上,可以得出这样的结论:若一幅图像的像素倾向于占据整个可能的灰度级并且分布均匀,则该图像会有高对比度的外观并展示灰色调的较大变换。最终效果将是一幅灰度细节丰富且动态范围较大的图像。为实现该效果,我们需要一个变换函数,将输入图像直方图信息进行变换,得到均匀分布的图像。
2.变换函数应满足条件
考虑连续灰度值,并用变量r表示待处理图像的灰度。通常,我们假设r的取值区间为[0,L-1],且r=0表示黑色,r=L−1表示白色。在r满足这些条件的情况下,我们将注意力集中到变换函数
s=T(r) 0≤r≤L−1上,对于输入图像中每个具有r值的像素产生一个输出灰度值s。为了实现变换后的灰度值均匀分布的效果,变换函数需满足以下条件:
(a) T(r)在区间[0,L-1]上为单调递增函数
(b) 当0≤r≤L−1时,0≤T(r)≤L−1,且T(r)均匀分布
为了能用反函数
r=T−1(s) 0≤s≤L−1计算原色图像,在这种情况下,条件(a)改为
(a`) T(r)在区间[0,L-1]上为严格单调递增函数
证明:
(a) 要求T(r)单调递增,可保持原来输入值大小关系不变,即无论如何映射,较亮区域依然亮,较暗区域依然暗。
(b) 保证输出灰度值的范围与输入灰度值的范围相同,且变换后的灰度值需均匀分布。
(a`) 要求T(r)严格单调递增,可保证从s到r的反映射是一对一的,防止出现二义性。
3.变换函数
一幅图像的灰度级可视为区间[0,L-1]内的随机变量。随机变量的基本描述子是其概率密度函数(PDF)。令pr(r)和ps(s)分别表示随机变量r和s的概率密度函数,其中p的下标用于指示pr(r)和ps(s)是不同的函数。
在图像处理中,特别重要的变换函数有如下形式:
s=T(r)=(L−1)∫0rpr(w)dw (1)式中,w是积分的假变量。该公式满足上述条件(a`)(b)。
证明:
公式右边是随机变量r的累积分布函数(CDF)。因为PDF总为正,回忆可知一个函数的积分是该函数下方的面积,固该公式为严格递增函数,满足条件(a`)。
现证明该公式满足条件(b):
用微积分换元法,可得:
pr(r)dr=pT(r)(T(r))d(T(r))=ps(s)ds即
ps(s)=pr(r)∣dsdr∣ (2)又因为
drds=drdT(r)=(L−1)drd[∫0rpr(w)dw]=(L−1)pr(r) (3)将(3)代入(2)可得
ps(s)=pr(r)∣dsdr∣=pr(r)∣(L−1)pr(r)1∣=L−11 0≤s≤L−1从该式最后一行中的ps(s)可知,这是一个均匀概率密度函数。
得证。
4.直方图均衡
对于离散值,我们处理其概率与求和来代替处理概率密度函数与积分。如前所述,一幅数字图像中灰度级rk出现的概率近似为
pr(rk)=MNnk k=0,1,...,L−1代入式(1)可得离散形式为
sk=T(rk)=(L−1)j=0∑kpr(rj)=MNL−1j=0∑knj k=0,1,2,...,L−1 (4)通过计算上式,即可实现直方图均衡化。均衡后的图像的灰度级会跨越更宽的灰度级范围,最终结果是增强来对比度。
例1
rk |
nk |
pk(rk)=nk/MN |
r0=0 |
790 |
0.19 |
r1=1 |
1023 |
0.25 |
r2=2 |
850 |
0.21 |
r3=3 |
656 |
0.16 |
r4=4 |
329 |
0.08 |
r5=5 |
245 |
0.06 |
r6=6 |
122 |
0.03 |
r7=7 |
81 |
0.02 |
假设图像的直方图如图1所示,直方图均衡变换函数的值使用式(4)得到,即
s0=T(r0)=7j=0∑0pr(rj)=7pr(r0)=1.33s1=T(r1)=7j=0∑1pr(rj)=7pr(r0)+7pr(r1)=3.08及s2=4.55,s3=5.67,s4=6.23,s5=6.65,s6=6.86,s7=7.00。在这一点上,s值一直是分数,因为它们是通过求概率值的和产生的,因此我们要把它们近似为最接近的整数:
s0=1.33→1 s1=3.08→3 s2=4.55→5 s3=5.67→6s4=6.23→6 s5=6.65→7 s6=6.86→7 s7=7.00→7这是均衡后的直方图的值,如图2所示。

二、彩色空间的直方图均衡
如果单独对RGB彩色空间的各个分量进行直方图均衡,将产生不正确的彩色。一种更合乎逻辑的方法是,均匀地展开这种彩色灰度,而保持彩色本身(即色调)不变。HSV彩色空间是适合这种方法的理想空间,即只对V分量进行均衡化。
三、代码实现(Python+OpenCV)
OpenCV的equalizeHist()函数能支持对单向量直方图均衡。
1.灰度图像
import cv2
img = cv2.imread('gray.jpg',0)
equal_img = cv2.equalizeHist(img)
cv2.imwrite('equal_gray.jpg',equal_img)

2.彩色图像
import cv2
img = cv2.imread('img.jpg')
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
img_v = img_hsv[:, :, 2]
equal_img_v = cv2.equalizeHist(img_v)
img_hsv[:, :, 2] = equal_img_v
equal_img = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite('equal_img.jpg',equal_img)

以上全部内容参考书籍如下:
冈萨雷斯《数字图像处理(第三版)》