直方图均衡化

直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。

<image>

## 纵览

这种方法通常用来增加许多图像的全局对比度，尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法，亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度，直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

这种方法对于背景和前景都太亮或者太暗的图像非常有用，这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作，如果已知均衡化函数，那么就可以恢复原始的直方图，并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择，它可能会增加背景噪声的对比度并且降低有用信号的对比度。

## 实现

考虑一个离散的灰度图像 {x}，让 ni 表示灰度 i 出现的次数，这样图像中灰度为 i 的像素的出现概率是

$$\ p_x(i) = p(x=i) = \frac{n_i}{n},\quad 0 \le i < L$$

L 是图像中所有的灰度数（通常为256），$n$ 是图像中所有的像素数，$p_x(i)$ 实际上是像素值为 i 的图像的直方图，归一化到 0,1。

把对应于 px 的累积分布函数，定义为：

$\ cdf_x(i) = \sum_{j=0}^i p_x(j)$,

是图像的累计归一化直方图。

我们创建一个形式为 y = T(x) 的变换，对于原始图像中的每个值它就产生一个 $y$，这样 $y$ 的累计概率函数就可以在所有值范围内进行线性化，转换公式定义为：

$$\ cdf_y(i) = iK$$

对于常数 K。CDF的性质允许我们做这样的变换（参见逆分布函数）；定义为：

$$\ cdf_y(y^\prime) = cdf_y(T(k)) = cdf_x(k)$$

其中 k 属于区间 0,L)。注意 T 将不同的等级映射到 ${0..1}$ 域，为了将这些值映射回它们最初的域，需要在结果上应用下面的简单变换：

$$\ y^\prime = y \cdot(\max\{x\} - \min\{x\}) + \min\{x\}$$

上面描述了灰度图像上使用直方图均衡化的方法，但是通过将这种方法分别用于图像RGB颜色值的红色、绿色和蓝色分量，从而也可以对彩色图像进行处理。

## 彩色图像直方图均衡化

实际上，对彩色分量rgb分别做均衡化，会产生奇异的点，图像不和谐。一般采用的是用HSL和HSV色彩空间进行亮度的均衡即可。

## 例子

下面的这个例子是一个8位的8×8灰度图像：

$$\begin{bmatrix} <pre> 52 & 55 & 61 & 66 & 70 & 61 & 64 & 73 \\ 63 & 59 & 55 & 90 & 109 & 85 & 69 & 72 \\ 62 & 59 & 68 & 113 & 144 & 104 & 66 & 73 \\ 63 & 58 & 71 & 122 & 154 & 106 & 70 & 69 \\ 67 & 61 & 68 & 104 & 126 & 88 & 68 & 70 \\ 79 & 65 & 60 & 70 & 77 & 68 & 58 & 75 \\ 85 & 71 & 64 & 59 & 55 & 61 & 65 & 83 \\ 87 & 79 & 69 & 68 & 65 & 76 & 78 & 94 </pre> \end{bmatrix}$$

该灰度图像的灰度值出现次数如下表所示，为了简化表格，出现次数为0的值已经被省略

灰度值｜出现次数｜灰度值｜出现次数｜灰度值｜出现次数｜灰度值｜出现次数｜灰度值｜出现次数

52｜1｜64｜2｜72｜1｜85｜2｜113｜1

55｜3｜65｜3｜73｜2｜87｜1｜122｜1

58｜2｜66｜2｜75｜1｜88｜1｜126｜1

59｜3｜67｜1｜76｜1｜90｜1｜144｜1

60｜1｜68｜5｜77｜1｜94｜1｜154｜1

61｜4｜69｜3｜78｜1｜104｜2

62｜1｜70｜4｜79｜2｜106｜1

63｜2｜71｜2｜83｜1｜109｜1

累积分布函数（cdf）如下所示，与上一表格类似，为了简化，累积分布函数值为0的灰度值已经被省略

灰度值｜cdf｜灰度值｜cdf｜灰度值｜cdf｜灰度值｜cdf｜灰度值｜cdf

52｜1｜64｜19｜72｜40｜85｜51｜113｜60

55｜4｜65｜22｜73｜42｜87｜52｜122｜61

58｜6｜66｜24｜75｜43｜88｜53｜126｜62

59｜9｜67｜25｜76｜44｜90｜54｜144｜63

60｜10｜68｜30｜77｜45｜94｜55｜154｜64

61｜14｜69｜33｜78｜46｜104｜57

62｜15｜70｜37｜79｜48｜106｜58

63｜17｜71｜39｜83｜49｜109｜59

如表格所示，灰度值最小值为52，最大值为154. 通常，直方图均衡化算式如下:

$$h(v) = <pre> \mathrm{round} \left( \frac {cdf(v) - cdf_{min}} {cdf_{max} - cdf_{min}} \times (L - 1) \right) </pre>$$

累积分布函数最小值cdfmin在本例中为1，最大值cdfmax在本例中为64，而L则是灰度级数（如本例中，图像为8位深度，则灰度级数共有2^8=256级数,这也是最常见的灰度级数）.则对于本例的直方图均衡化算式为:

$$h(v) = <pre> \mathrm{round} \left( \frac {cdf(v) - 1} {63} \times 255 \right) </pre>$$

例如，灰度为78的像素的累积分布函数为46，均衡化后，灰度值变化为：

$$h(78) = <pre> \mathrm{round} \left( \frac {46 - 1} {63} \times 255 \right) </pre> = <pre> \mathrm{round} \left( 0.714286 \times 255 \right) </pre> = 182$$

直方图均衡化后，图像的灰度值变化如下表所示：

$$\begin{bmatrix} <pre> 0 & 12 & 53 & 93 & 146 & 53 & 73 & 166 \\ 65 & 32 & 12 & 215 & 235 & 202 & 130 & 158 \\ 57 & 32 & 117 & 239 & 251 & 227 & 93 & 166 \\ 65 & 20 & 154 & 243 & 255 & 231 & 146 & 130 \\ 97 & 53 & 117 & 227 & 247 & 210 & 117 & 146 \\ 190 & 85 & 36 & 146 & 178 & 117 & 20 & 170 \\ 202 & 154 & 73 & 32 & 12 & 53 & 85 & 194 \\ 206 & 190 & 130 & 117 & 85 & 174 & 182 & 219 </pre> \end{bmatrix}$$

注意：原最小灰度值52变为了0，而最大灰度值154变为了255

<image>

｜

<image>

原始图像｜均衡化后图像

### 全尺寸图像

<image>

｜

<image>

<image>

｜

<image>

## 参考文献

- Acharya and Ray, Image Processing: Principles and Applications, Wiley-Interscience 2005 ISBN 0471719986
- Russ, The Image Processing Handbook: Fourth Edition, CRC 2002 ISBN 0849325323

## 外部链接

- "Histogram Equalization" at Generation5
- Free histogram equalization plugin for Adobe Photoshop and PSP (broken link)
- Page by Ruye Wang with good explanation and pseudo-code