2017年11月9日更新:感谢知友 @罗maochun 指出了原文中的重要错误,现已更正。
----------------------------------
为简化问题,仅讨论灰度图像的直方图均衡。
设输入图像为二元函数 f(x, y) ,输出图像为二元函数 g(x, y),显然二者尺寸相等。我们知道,那些灰度值分布较为平均的图像,通常对比度较高。比如,下图中 g 的灰度较分散(有白的有灰的有黑的),所以对比度较高;f 的灰度很集中,所以显得灰蒙蒙的。直方图均衡的目的,就是对 f 进行处理产生 g,使得 g 的灰度值比 f 更分散。
怎么做呢?如果我们有一个恰当的 灰度映射函数 T就好了,它能把输入灰度值 r 映射为输出灰度值为 s,即
。假设图像的灰度值连续,由黑到白取值为1~L中的实数。灰度映射函数 T 可能长这样:
用图形来表达就是:
对图像施以该灰度映射,图示如下:
看起来不错。不过——
有一句老话叫做“具体问题具体分析”,这告诉我们:决不可能使用某个特定的 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的概率。还不懂?看图!
弄清楚 (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