添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
紧张的大蒜  ·  FST (Finite-state ...·  1 年前    · 
星星上的泡面  ·  轻松编写VB.NET ...·  1 年前    · 
直方图均衡化

直方图均衡化

直方图均衡化(Histogram Equalization)是一种增强图像对比度(Image Contrast)的方法,其主要思想是将一副图像的直方图分布变成近似均匀分布,从而增强图像的对比度。直方图均衡化虽然只是数字图像处理(Digital Image Processing)里面的基本方法,但是其作用很强大,是一种很经典的算法。

下面,本文会介绍一些直方图均衡化方面的知识和方法,包括以下几个部分:

  1. 直方图均衡化与对比度增强
  2. 直方图均衡化(HE)原理和实现
  3. 自适应直方图均衡化(AHE)原理和实现
  4. 限制对比度自适应直方图均衡化(CLAHE)原理和实现
  5. 自适应局部区域伸展(Local Region Stretch)直方图均衡化原理和实现
  6. 总结和参考文献

1、直方图均衡化与对比度增强

下面给出图像对比度增强的一个例子,Figure 1 是一张汽车图片(图片来自: CS6640 - Project 2 ),图片是一张338 * 600的灰度图。可以看出汽车与背景都是雾蒙蒙的看不清楚,整张图片偏暗,并且汽车与背景(地面、房屋)区别不是很明显。将其直方图绘制出来之后得到Figure 2,可以看出其灰度绝大多数分布在100~180之间,而直方图均衡化要做的就是让直方图尽可能地均匀分布在0~255内。

Figure 1: car.jpg

Figure 2 : car.jpg的直方图分布

下面使用Python库PIL中的ImageOps来完成直方图均衡化的过程,来看看结果图片如何。代码很简单,使用下面一行即可:

eq_img = ImageOps.equalize(img)

得到灰度直方图均衡化之后的图像及其直方图为Figure 3 & 4,可以看出汽车”锃亮“了许多,车身变得很清晰,背景房屋的纹理也显现了出来,总之图像质量不再是灰蒙蒙的了。同时,观察其直方图也可以看出,直方图的分布在0~255近似均匀了,稍后会解释为什么是近似均匀。

Figure 3 : ImageOps直方图均衡化后car.jpg

Figure 4 : 使用ImageOps对car.jpg直方图均衡化后直方图分布

2、直方图均衡化(HE)原理和实现

这里介绍直方图均衡化(Histogram Equalization)的基本原理。假设我们现在有一个图像A,其直方图分布 H_A(D) ,我们想利用一个单调非线性映射 f: R \rightarrow R ,将图像A变为图像B,即对图像A中 每个 像素点施加 f 变换 ,图像B的直方图分布为 H_B(D) 。整个过程可以按照Figure 5的图示来说明:图中右下方是A图像的灰度直方图分布(便于画图,这里画作连续分布),图中右上方是单调非线性变换函数 f ,左上方式得到的图像B的直方图分布,其中有 D_B = f(D_A) D_B + \Delta D_B = f(D_A + \Delta D_A) 。即可以理解 f 的作用是将A图像里面像素点灰度为 D_A 的全部变为 D_B ,那么则有: \int_{D_A}^{D_A + \Delta D_A} H_A(D) dD = \int_{D_B}^{D_B + \Delta D_B} H_B(D) dD

上面公式可以理解为对应区间内像素点总数不变。为了实现直方图均衡化,特殊地有: \int_{0}^{D_A} H_A(D) dD = \int_{0}^{D_B} H_B(D) dD

因为目标是直方图均匀分布,那么理想的 H_B(D) = \frac{A_0}{L} A_0 是 像素点个数, L 是灰度级深度,通常取256。那么得到:

\int_{0}^{D_A} H_A(D) dD = \frac{A_0D_B}{L} = \frac{A_0f(D_A)}{L}
那么 , f 就可以求出来了,结果为:

f(D_A) = \frac{L}{A_0}\int_{0}^{D_A} H_A(D) dD

离散形式为:

f(D_A) = \frac{L}{A_0}\sum_{u=0}^{D_A} H_A(u)

Figure 5 : 直方图均衡化示意图

通过上面推导过程可以看出,映射函数 f 和CDF密切相关。并且,推导过程是在连续分布上作的处理,而实际上图像灰度级别通常是256,故是一种以离散情况近似了连续分布,如果灰度级别足够高的话产生的结果会是真正均匀分布的直方图,由于灰度级只有256,故而实际情况中得到的直方图往往不是均匀分布,而是近似均匀分布的。同时,假若A图像的灰度直方图变化剧烈,且某些灰度区间不存在像素点,这会造成CDF的剧烈变化,那么在灰度区间(x, x+1)内即可能发生剧烈的变化,从而导致最后产生的B图像的直方图也有较大的不均匀性。但是,实际使用过程中,得到的图像能近似均匀分布已经能达到比较好的对比度增强效果了。

直方图均衡化用代码实现也很简单,用Python的话下面几行就够了:

# calculate histogram
hists = histogram(img)
# caculate cdf