均衡化的图像具有高对比度和多变的灰度色调,灰度级丰富且覆盖范围较大。在外观上,这样的图像有丰富的色彩,不会过暗或过亮。

OpenCV的官网上,对图像均衡化(即直方图均衡化)前后的直方图进行了对比,如下图所示。其中,左图是原始图像的直方图,可以看到灰度级集中在中间,图像中没有较暗和较亮的像素点;右图是对原图均衡化后的直方图,像素分布更均衡。

均值化示意

直方图均值原理(了解)

直方图均衡化的算法主要包括两个步骤:
(1)计算累计直方图。
(2)对累计直方图进行区间转换
在此基础上,再利用人眼视觉达到直方图均衡化的目的。
下面我们通过一个例子进行讲解。例如,图像A如下图所示,它是一幅3位的位图,即共有8(23)个灰度级,有49个像素。

图像A

图像A共有8个灰度级,范围为[0, 7],计算其统计直方图如下表所示。

图像灰度级

在此基础上,计算归一化统计直方图,计算方式是计算每个像素在图像内出现的概率。出现概率=出现次数/像素总数,用每个灰度级的像素个数除以总的像素个数(49),就得到归一化统计直方图,如下表所示。

概率

接下来,计算累计统计直方图,即计算所有灰度级的累计概率,结果如下表所示。

统计概率

在累计直方图的基础上,对原有灰度级空间进行转换。可以在原有范围内对灰度级实现均衡化,也可以在更广泛的灰度空间范围内对灰度级实现均衡化。下面分别介绍这两种形式。

在原有范围内实现均衡化

在原有范围内实现直方图均衡化时,用当前灰度级的累计概率乘以当前灰度级的最大值7,得到新的灰度级,并作为均衡化的结果。下表所示的就是计算得到的新灰度级。

灰度级

根据表中各个灰度级的关系,完成均衡化值(新的灰度级)的映射,如下表所示。此处的对应关系为:

映射关系

● 原始图像A中的灰度级0,经直方图均衡化后调整为新的灰度级1(即均衡化值1)。在原始图像A中,灰度级0共有9个像素点,所以在均衡化后的图像中,灰度级1共有9个像素点。
● 原始图像A中的灰度级1和2经直方图均衡化后调整为灰度级3。在原始图像A中,灰度级1共有9个像素点,灰度级2共有6个像素点,所以在均衡化后的图像中,灰度级3共有9 + 6=15个像素点。
● 原始图像A中的灰度级3经直方图均衡化后调整为灰度级4。在原始图像A中,灰度级3共有5个像素点,所以在均衡化后的图像中,灰度级4共有5个像素点。
● 原始图像A中的灰度级4和5经直方图均衡化后调整为灰度级5。在原始图像A中,灰度级4共有6个像素点,灰度级5共有3个像素点,所以在均衡化后的图像中,灰度级5共有6 + 3=9个像素点。
● 原始图像A中的灰度级6经直方图均衡化后调整为灰度级6。在原始图像A中,灰度级6共有3个像素点,所以在均衡化后的图像中,灰度级6共有3个像素点。
● 原始图像A中的灰度级7经直方图均衡化后调整为灰度级7。在原始图像A中,灰度级7共有8个像素点,所以在均衡化后的图像中,灰度级7共有8个像素点。

直方图均衡化后

直方图均衡化后

在更广泛的范围内实现均衡化

在更广泛的范围内实现直方图均衡化时,用当前灰度级的累计概率乘以更广泛范围灰度级的最大值,得到新的灰度级,并作为均衡化的结果。例如,要将灰度级空间扩展为[0, 255]共256个灰度级,就必须将原灰度级的累计概率乘以255,得到新的灰度级。下表所示的是图像A在新的灰度级空间[0, 255]内的新的灰度级。

直方图均值化处理

OpenCV使用函数cv2.equalizeHist()实现直方图均衡化。该函数的语法格式为:

dst = cv2.equalizeHist( src )
  • src是8位单通道原始图像
  • dst时直方图均衡化处理的结果

例:使用函数cv2.equalizeHist()实现直方图的均衡化。

import cv2
import matplotlib.pyplot as plt
#-----------读取原始图像---------------
img = cv2.imread('nv.png',cv2.IMREAD_GRAYSCALE)
#-----------直方图均衡化处理---------------
equ = cv2.equalizeHist(img)
#-----------显示均衡化前后的直方图---------------
cv2.imshow("original",img)
cv2.imshow("result",equ)
#-----------显示均衡化前后的直方图---------------
plt.figure("原始图像直方图")  #构建窗口
plt.hist(img.ravel(),256)

plt.figure("均衡化结果直方图")  #构建新窗口
plt.hist(equ.ravel(),256)
plt.show(  )   # 显示图像
#----------等待释放窗口---------------------
cv2.waitKey()
cv2.destroyAllWindows()

效果

直方图

下面做简单的说明:
● 原始图像的直方图,大部分的像素值集中在右侧(线条密集)。这说明图像中位于[200, 255]区间的像素点很多,图像比较亮。
● 在均衡化后的直方图中,左侧的像素点比较密集而右侧的相对比较稀疏。但是,实际上人眼并不能明显感受到像素值的细微差别,所以我们可以将相近的像素值看成同一个像素值,这样就会得到类似于图13-29的直方图。此时,直方图内灰度级的分布就比较均衡了,是均衡一致的直方图。
● 或者从另外一个角度理解,在图中的(d)图中,左侧的线条密集,但是整体高度不高;右侧的线条稀疏,但是整体较高。这说明,较小的灰度级,每个灰度级上都有像素,但是个数较少;而较大的灰度级,在分布上比较稀疏,而且有一些灰度级并没有出现,但是出现了的灰度级其像素个数较多。如果将灰度级按照区间划分,则分布在每一个区间内的像素点个数大体是一致的。例如,对灰度级在[0, 50]、[51, 100]、[101,150]、[151, 200]、[201, 255]几个区间上进行划分,则每个区间内像素点的数量大体一致。所以,图中的(d)图是均衡化的直方图。
● 在图中的(d)图所示均衡化后的直方图中,左侧的像素点比较密集而右侧的相对比较稀疏。但是,实际上人眼并不能明显感受到像素值的细微差别,通常会将相近的像素值看成同一个像素值。例如,HVS会主动将图中的(a)图中左侧的像素点取近似值,而得到图中的(b)图所示的直方图。同样的道理,HVS人眼也会对图中的(b)图中右侧的像素值取均值近似处理,而得到如图中的©图所示的直方图。可以看到,HVS对全部像素值取近似值后的直方图(图中的©图)内灰度级的分布是比较均匀的,是均衡一致的直方图。


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/OpenCV44.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 06 月 20 日
如果觉得我的文章对你有用,请随意赞赏