链接:https://www.zhihu.com/question/37204742/answer/221844779
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
为简化问题,仅讨论灰度图像的直方图均衡。
设输入图像为二元函数 f(x, y) ,输出图像为二元函数 g(x, y),显然二者尺寸相等。我们知道,那些灰度值分布较为平均的图像,通常对比度较高。比如,下图中 g 的灰度较分散(有白的有灰的有黑的),所以对比度较高;f 的灰度很集中,所以显得灰蒙蒙的。直方图均衡的目的,就是对 f 进行处理产生 g,使得 g 的灰度值比 f 更分散。
怎么做呢?如果我们有一个恰当的 灰度映射函数 T 就好了,它能把输入灰度值 r 映射为输出灰度值为 s,即 。假设图像的灰度值连续,由黑到白取值为1~L中的实数。灰度映射函数 T 可能长这样:
用图形来表达就是:
<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 中出现的概率为函数 ,在 g 中出现的概率为函数 。这两个函数均可以直接由图像统计出来。然后,我们定义两个函数
(意义:f 中灰度值小于 n 的概率)
以及
(意义:g 中灰度值小于 n 的概率)
那么必然有
为什么呢?这是因为我们必须保证:原本比 r 暗的灰度,在变换后依然比 s 暗;原本比 r 亮的灰度,在变换后依然比 s 亮。如果连这一点都不能保证,那么输出的图像就会黑白颠倒一团糟。
比方说,若 ,变换后 。那么,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) 式的含义后,对其微分就得到下面的式子:
再接下来,如果我们令变换 ,那么:
其中的第三行,t 是积分变量,真正的自变量是积分上限 r。
由 (2)(3) 得
奇迹出现了:g 中各灰度出现概率相等,为常数1/L。也就是说,各灰度被完全均摊了!
于是我们知道,无论输入图像是什么,只要统计它之中各灰度值出现的概率 ,然后生成映射函数 ,剩下的事就是逐个映射图中灰度即可。
现实中数字图像的灰度值是离散的,对此我们只需略作修改。假设图像最多含有 L 种灰度级,由黑到白依次编号为 。每个灰度级在 f 中出现的概率依次为 ,在 g 中出现的概率依次为 。
函数定义改为: 以及 ,其余同理。
可惜的是,在灰度值离散的情况下,r 和 s 均为整数,我们必须对映射结果取整,这导致 g 中各灰度值出现的概率未必相等。但是可以确定的是: g 的灰度级在一定程度上比 f 更分散了。
至于直方图匹配呢,原理相同,只是多一步而已,详见图像处理教材,在此不再赘述。
参考资料:
Digital Image Processing (3rd Edition), R.C. Gonzalez and R.E. Woods