第 3 章 灰度变换与空间滤波
3.3 直方图处理
直方图是多种空间域处理技术的基础。
灰度级范围为 [0, L-1] 的数字图像的直方图是离散函数
这里 rk 是第 k 级灰度,nk 是图像中灰度级为 rk 的像素个数。经常以图像中像素的总数(用 n 表示)来除它的每一个值得到归一化的直方图。因此,一个归一化的直方图由
即 P(rk) 给出了灰度级为 rk 发生的概率估计值。
可以看到,在暗色图像中,直方图的组成成分集中在灰度级低(暗)的一侧。类似的,明亮图像的直方图则倾向于灰度级高的一侧。
在上图中可以看到,低对比度图像的直方图窄而集中于灰度级的中部。高对比度的图像中,直方图的成分覆盖了灰度级很宽的范围,而且,像素的分布没有太不均匀,只有少量垂线比其他的高许多。
可以得到如下结论:若一幅图像的像素倾向于占据整个可能的灰度级并且分布均匀,则该图像会有高对比度的外观并显示灰色调的较大变化。最终效果将是一幅灰度细节丰富且动态范围较大的图像。
3.3.1 直方图均衡
直方图均衡的目的:寻找 变换函数,该函数产生有均匀直方图的输出图像。也就是 得到一幅灰度级丰富且动态范围大的图像。
该函数仅仅依靠输入图像直方图中的信息就可自动达到这一效果。该函数产生有均匀直方图的输出图像。
直方图均衡的关键:寻找变换函数,该函数产生有均匀直方图的输出图像。
考虑连续灰度值,并用变量 r 表示待处理图像的灰度。假设 r 的取值范围为 [0, L-1],归一化之后得到 r 的取值范围为 [0, 1] 且 r=0 表示黑色,r=1 表示白色。对于任意一个满足上述条件的 r ,我们将注意力集中在变换形式上:
对于输入图像中每个具有 r 值的像素产生一个输出灰度值 s。假设变换函数 T® 满足以下条件:
- T( r ) 在区间 上为单调递增函数。
- 当 时,
一幅图像的灰度级可被视为区间 [0, 1] 内的随机变量。随机变量的一个最重要的基本描述是其概率密度函数(PDF)。令 Pr( r ) 和 Ps( r ) 分别表示随机变量 r 和 s 的概率密度函数。
如上图所示,右下图是输入图像灰度级 r 的直方图或概率密度函数,现在的问题就是求函数 T,是结果图像的直方图为均匀分布,即得到左上和右上这种类型的输出图像灰度级。
输入图像的灰度级 r 通过映射函数 T 映射到输出图像的灰度级 s,可得到如下关系式:
又因为图中的曲线是输入输出图像中灰度级的概率密度的函数曲线,曲线的面积表示概率,故
如果 足够小,则:
由此可以看到,输出灰度变量 s 的 PDF 就由输入灰度的 PDF 和所用变换函数决定。同时注意到: 是均匀概率密度函数,故 ,故:
即通过上述式子得到的输出图像的灰度值 s 满足均匀分布,与输入图像灰度值 r 的概率密度函数 无关。
结论
直方图均衡变换公式(未归一化):
以上介绍均为连续值情况下的变换。对于 离散值,我们处理其 概率与和 而不是 概率密度函数与积分。一幅图像中灰度级 rk 出现的概率近似为:
n 是图像的总像素,nk 是灰度为 rk 的像素个数,与 rk 相对的 Pr(rk) 图形通常称为 直方图,则直方图均衡公式为:
需要注意的是:
- 上式中的 rk 和 sk 都是归一化后的值。
- 实际应用中,输入和输出的数字图像的灰度级分辨率应该是一致的。例如,如果对于一幅 256 个灰度级的数字图像进行直方图均衡,结果图像应该也是 256 个灰度级的。
例题:
已知一幅 64 × 64、3 bit 的数字图像,各灰度级出现的频数如下所示。试进行直方图均衡。
| r | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| n( r ) | 790 | 1023 | 850 | 656 | 329 | 245 | 122 | 81 |
因为直方图均衡公式为:
因为像素的总数量是:
个像素,则输入像素归一化并计算 Pr(rk) 得到如下表:
| rk | nk | Pr(rk) | sk |
|---|---|---|---|
| rk = 0 | 790 | 0.19 | s0 = 0.19 |
| rk = 1/7 | 1023 | 0.25 | s1 = 0.44 |
| rk = 2/7 | 850 | 0.21 | s2 = 0.65 |
| rk = 3/7 | 656 | 0.16 | s3 = 0.81 |
| rk = 4/7 | 329 | 0.08 | s4 = 0.89 |
| rk = 5/7 | 245 | 0.06 | s5 = 0.95 |
| rk = 6/7 | 122 | 0.03 | s6 = 0.98 |
| rk = 1 | 81 | 0.02 | s7 = 1.00 |
注意:原图像的灰度级为 8,即 [0, 7],则结果图像的灰度级也应该是 [0, 7]。所以需要把上表中的 sk 映射到 [0, 7] 的整数范围中去。可以采取四舍五入的方式取整,如下表所示:
| r | s = T( r ) |
|---|---|
| 0 | round(7 * 0.19) = 1 |
| 1 | round(7 * 0.44) = 3 |
| 2 | round(7 * 0.65) = 5 |
| 3 | round(7 * 0.81) = 6 |
| 4 | round(7 * 0.89) = 6 |
| 5 | round(7 * 0.95) = 7 |
| 6 | round(7 * 0.98) = 7 |
| 7 | round(7 * 1.00) = 7 |
| r | n( r ) |
|---|---|
| 0 | 0 |
| 1 | 790 |
| 2 | 0 |
| 3 | 1023 |
| 4 | 0 |
| 5 | 850 |
| 6 | 985 |
| 7 | 448 |
如上图,第一幅图为原始图像的直方图,中间图像为变换函数,最右边图像为直方图均衡后的图像直方图。可以看到,在均衡后,直方图没有达到完全的均匀分布,这是因为数字图像的灰度级是离散的,所以才造成了这种情况。
与连续形式不同,一般不能证明离散变换能产生均匀概率密度函数的离散值(均匀直方图)。
直方图均衡化具有完全 “自动化” 的特点,即直方图均衡化不需要同以往的灰度变化那样选择变换函数的类型并设置参数,只需要输入图像的直方图即可。计算的简单性是直方图均衡化的一个优点。