直方均衡化

作者:王彦恒
链接:https://www.zhihu.com/question/37204742/answer/221844779
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

为简化问题,仅讨论灰度图像的直方图均衡。

设输入图像为二元函数 f(x, y) ,输出图像为二元函数 g(x, y),显然二者尺寸相等。我们知道,那些灰度值分布较为平均的图像,通常对比度较高。比如,下图中 g 的灰度较分散(有白的有灰的有黑的),所以对比度较高;f 的灰度很集中,所以显得灰蒙蒙的。直方图均衡的目的,就是对 f 进行处理产生 g,使得 g 的灰度值比 f 更分散。

<img src="https://pic4.zhimg.com/50/v2-a3ee22f43f9d9ba6b651766811e30593_hd.jpg" data-caption="" data-size="normal" data-rawwidth="418" data-rawheight="129" class="content_image" width="418">

怎么做呢?如果我们有一个恰当的 灰度映射函数 T 就好了,它能把输入灰度值 r 映射为输出灰度值为 s,即 s = T(r) 。假设图像的灰度值连续,由黑到白取值为1~L中的实数。灰度映射函数 T 可能长这样:

s = T(r) = \begin{cases} 1, &r \in [1, \frac{L}{4}] \cr 2r - \frac{L}{2}, &r \in [\frac{L}{4}, \frac{3L}{4}] \cr L, &r \in [\frac{3L}{4} , L] \end{cases}

用图形来表达就是:

<img src="https://pic1.zhimg.com/50/v2-b0259ed13c3f2c80e6fc733db1e1433b_hd.jpg" data-caption="" data-size="normal" data-rawwidth="221" data-rawheight="120" class="content_image" width="221">

对图像施以该灰度映射,图示如下:

<img src="https://pic3.zhimg.com/50/v2-138b41f4ff605da60a506e2ed826d948_hd.jpg" data-caption="" data-size="normal" data-rawwidth="562" data-rawheight="133" class="origin_image zh-lightbox-thumb" width="562" data-original="https://pic3.zhimg.com/v2-138b41f4ff605da60a506e2ed826d948_r.jpg">

看起来不错。不过——

有一句老话叫做“具体问题具体分析”,这告诉我们:决不可能使用某个特定的 T 一劳永逸。那么,有没有办法“自动地”根据实际情况生成 T 呢?答案是肯定的。请接着往下看。

设任意灰度值 t 在 f 中出现的概率为函数 p_f(t) ,在 g 中出现的概率为函数 p_g(t) 。这两个函数均可以直接由图像统计出来。然后,我们定义两个函数

S_f(n) = \int_{1}^{n}p_f(t)dt (意义:f 中灰度值小于 n 的概率)

以及

S_g(n) = \int_{1}^{n}p_g(t)dt (意义:g 中灰度值小于 n 的概率)

那么必然有

S_f(r) = S_g[T(r)] \Leftrightarrow S_f(r) = S_g(s) \ \ \cdots \cdots(1)

为什么呢?这是因为我们必须保证:原本比 r 暗的灰度,在变换后依然比 s 暗;原本比 r 亮的灰度,在变换后依然比 s 亮。如果连这一点都不能保证,那么输出的图像就会黑白颠倒一团糟。

比方说,若 r = 1/3 ,变换后 s = T(r) = 5/2。那么,f 中灰度值小于1/3的像素数目 == g 中灰度值小于5/2的像素数目,用频率估算概率,也就是 f 中灰度值小于1/3的概率 == g 中灰度值小于5/2的概率。还不懂?看图!

<img src="https://pic2.zhimg.com/50/v2-8442991c72072f0c82c95def19912f6a_hd.jpg" data-caption="" data-size="normal" data-rawwidth="250" data-rawheight="187" class="content_image" width="250">

弄清楚 (1) 式的含义后,对其微分就得到下面的式子:

p_f(r) \cdot dr = p_g(s) \cdot ds \ \ \cdots\cdots (2)

再接下来,如果我们令变换 T(r) = L \cdot S_f(r) ,那么:

\begin{align} s &= T(r) \\ &= L \cdot S_f(r)\\ &= L \cdot \int_{1}^{r}p_f(t)dt \\ \Rightarrow \frac{ds}{dr} &= L \cdot p_f(r) \ \ \cdots \cdots (3) \end{align}

其中的第三行,t 是积分变量,真正的自变量是积分上限 r。

由 (2)(3) 得

p_g(s) = 1/L

奇迹出现了:g 中各灰度出现概率相等,为常数1/L。也就是说,各灰度被完全均摊了!

于是我们知道,无论输入图像是什么,只要统计它之中各灰度值出现的概率 p_f ,然后生成映射函数 T(r) = L \cdot S_f(r) = L \cdot \int_{1}^{r} p_f(t)dt ,剩下的事就是逐个映射图中灰度即可。


现实中数字图像的灰度值是离散的,对此我们只需略作修改。假设图像最多含有 L 种灰度级,由黑到白依次编号为 1, 2, \cdots, L 。每个灰度级在 f 中出现的概率依次为p_f(1), p_f(2), \cdots, p_f(L) ,在 g 中出现的概率依次为 p_g(1), p_g(2), \cdots, p_g(L)

函数定义改为: S_f(n) = \sum_{i=1}^{n}{p_f(i)} 以及 S_g(n) = \sum_{i=1}^{n}{p_g(i)} ,其余同理。

可惜的是,在灰度值离散的情况下,r 和 s 均为整数,我们必须对映射结果取整,这导致 g 中各灰度值出现的概率未必相等。但是可以确定的是: g 的灰度级在一定程度上比 f 更分散了


至于直方图匹配呢,原理相同,只是多一步而已,详见图像处理教材,在此不再赘述。


参考资料:

Digital Image Processing (3rd Edition), R.C. Gonzalez and R.E. Woods

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值