基于Python的直方图均衡探讨
2023-11-06惠为君
惠为君
(盐城工学院,江苏盐城 224051)
0 引言
图像增强是指对图像进行灰度变换,使图像与视觉响应相匹配,加强图像的视觉效果的一种图像处理方法。灰度变换的方法很多,其中的一种是点运算,指用一个单调递增的函数对原图像的灰度进行非线性运算,从而实现对比度增强[1-3]。
如图1 所示,x 表示变换源图像的灰度值,y 表示目标图像的灰度值。变换函数y=T(x)需要满足以下两个要求:
图1 变换函数
1) 0 ≤x ≤255,0 ≤y ≤255,x 和y 的取值范围相同。这一条保证变换以后,像素值不能超过范围。
2)T(x)在区间[0 255]上严格单调递增。这一条保证源像素值和目标像素值大小一一对应。不允许出现灰度倒置甚至于灰度翻转,否则影响视觉效果。
不是所有的单调递增函数都可用于灰度变换。常用的变换函数有两种形式,函数Ⅰ和函数Ⅱ。对于函数Ⅰ,源图像像素范围[0 128]变换到[0 N2],对于函数Ⅱ,则变换到[0 N1]。可以看出,N2>128,N1<128,函数Ⅰ拉伸了低灰度级,压缩了高灰度级,函数Ⅱ则相反。可知,曲线斜率大于1的时候,灰度拉伸,小于1的时候,灰度压缩。
1 直方图均衡原理
一幅数字图像中,不同灰度值的像素的数目是不同的。由于光照等的影响,像素值的分布不同,如果光照较强,高灰度级像素较多,如果光照弱,低灰度级像素较多[4]。
设置的变换函数需要把灰度值相对集中的灰度范围拉伸,灰度值分布较少的灰度范围压缩,使得总体上灰度的分布更均匀。
在需要拉伸的灰度区域,设置的变换函数斜率大于1,在需要压缩的灰度区域变换函数斜率小于1。因此,灰度值越集中,对应的变换函数的斜率越大,反之越小,灰度变换函数的斜率与灰度分布有关。
直方图均衡指的是利用图像的直方图,构建符合以上要求的变换函数,实现图像增强[5]。
为了方便讨论,假设图像的灰度值连续分布,其取值范围[0,L-1]。灰度值分布具有随机性,用概率密度为f(x)表示,其含义表示灰度值x 附近单位区间的像素数目占总数的百分比。
T(x)单调递增,x,y 的灰度值变化范围都取[0,L-1],符合变换函数的要求。灰度值y 对应的概率密度为g(y)。对于任意x,必然存在y,使得公式(2)成立。
式(2)两边对x求导:g(y)dy/dx=f(x)
式(1)对x求导:dy/dx=(L -1)f(x)
得到g(y)=1/(L -1)
变换以后,概率密度函数g(y)为常数,灰度值分布为均匀分布。变换之前,x 的分布局限在一个较小的范围,反映在视觉效果上,图像不清晰,变换以后灰度值分布是均匀的,图像对比度增强,在视觉效果上图像更清晰。
对于数字图像,j表示灰度级,xj表示灰度级j对应的灰度值,nxj表示灰度值为xj的像素数目。灰度值xj的范围为[0,L-1],N 表示像素的总数目。和模拟图像对应的数字图像变换函数定义如表1所示。最终得到变换函数:
表1 数字图像灰度变换函数
由于变换函数与直方图有关,变换结果为均匀分布,因此称这种图像增强方法为直方图均衡。yi为目标图像的灰度值,xi为源图像的灰度值,i为对应的灰度级。
2 Python实现
直方图均衡算法实现步骤如下:
1)获取图像灰度级分布i。
2)统计灰度级i对应的像素数目ni。
3)计算灰度直方图的归一化概率表达式:p(si)=ni/N,N为像素总的数目。
4)计算累积灰度直方图。
5)进行取整扩展,计算映射后输出图像各灰度级对应灰度值的归一化表达形式tk。
6)确定映射关系sk→tk。
7)统计映射后各灰度级的像素数目nk。
8)得到新的灰度统计直方图的归一化概率表达形式:pt(tk)=nk/N,N 为输出图像的像素数目,即原始图像的像素数目。
基于Python 和OpenCV 实现以上直方图均衡算法[6-7]。其步骤如下:
1) 调用cv2.imread()函数,读取JPEG 数字图像[2],通过参数设置,直接保存为n灰度图像数据。对各个灰度级进行累计计算,并归一化。
2)累积直方图函数pix_gray(img_gray),累积直方图函数乘以(L-1)得到转换函数。
3)利用转换函数实现源图像的直方图均衡,得到目标图像。
4)保存目标图像。
在读取图像之后,实现直方图灰度级统计的函数如下:
其中,N=h×w,表示总的像素数目,lut 存放变换的结果。
3 测试及分析
测试了三种256 色灰度图像,这三种图像的灰度值分布都比较集中,一种灰度值较小的像素较多,如图2 所示,一种灰度值居中的像素较多,如图3 所示,一种灰度值较大的像素较多,如图4所示。
图2 灰度值偏小图像及处理结果
图3 灰度值居中图像及处理结果
图4 灰度值偏大图像及处理结果
由图2 直方图可知,图像像素值主要分布在0~100 之间,源图像偏暗。转换函数分为两个部分,0~100之间部分斜率较大,对0~100级之间的灰度有很好的拉伸效果。由于拉伸以后,图像灰度均匀分布,目标图像清晰很多。
由图3 直方图可知,图像像素值主要分布在100~200 之间,源图像灰蒙蒙的。转换函数在100~200之间部分斜率较大,对100~200级之间的灰度有很好的拉伸效果。由于拉伸以后,汽车和地砖清晰很多。
由图4 直方图可知,图像像素值主要分布在100~255之间,源图像偏亮。转换函数在100~200之间部分斜率较大,对100~255级之间的灰度有很好的拉伸效果。由于拉伸以后,阳光下的植物清晰很多。
4 结束语
由于光照等环境的影响,图像的灰度值分布可能比较集中,这就导致图像对比度较小、不清晰。利用直方图累积函数作为变换函数可以对源图像进行点运算,对源图像的灰度范围进行拉伸或压缩,目标图像的灰度值将是均匀分布,这样图像的对比度将增强,清晰度将提高。直方图均衡将灰度值集中的灰度值拉伸,并不代表灰度值一定增多。