本系列文章记录老猿自学冈萨雷斯《数字图像处理》的感悟和总结,不过估计更新会比较慢,白天要工作,都是晚上抽空学习,学习完一章再回头总结,想学的朋友可以自己下载英文原版(目前到第四版)和中文译本(目前应该到第三版)的电子版观看,如果想对照观看建议英文原版也找第三版。
这本《数字图像处理》不愧为数字图像处理的经典教程,知识范围广、内容详尽、案例贴近实践,至少很合老猿的口味。但中译本存在两个问题:
本文是《数字图像处理》第三章直方图处理中的直方图均衡相关章节的内容,但本节的部分内容老猿认为对缺乏基础的人有点难,老猿将试图在涉及直方图处理相关的系列文章中将相关疑问解释清楚。
如果用变量r表示待处理图像的灰度,r的取值区间为[0,L-1],且r=0表示黑色,r=L-1表示白色。在连续灰度值情况下,假设有变换形式为式(3.3-1)上的灰度映射:
式(3.3-1): s = T(r),0≤r≤L-1
式(3.3-1)表示对于输入图像中每个具有r值的像素灰度值产生一个输出灰度值s。我们假设:
这样保证相关变换前后的灰度值范围保持不变,且变换不会导致灰度错乱。
在某些情况下,需要用到变换函数T的反函数,假设反函数为:
式(3.3-2):r=T-1(s),0≤S
在这种情况下,因反函数意味着原函数的定义域和值域为一一映射,所以条件(1)改为T(r)在区间0≤r≤L-1上是一个严格单调递增函数。这是一些重要直方图处理技术的基础理论要求:灰度映射函数在区间[0,L-1]上严格单调递增,其值域为区间[0,L-1]。
一幅图像的灰度级可看成是区间[0,L-1]内的随机变量。随机变量的基本描绘子(descriptor)是其概率密度函数(probability density function,PDF)。令pr(r)和ps(s)分别表示随机变量r和s的概率密度函数(其中pr和ps中的r和s是下标,只是由于输入方便没有使用下标的方式,下同),其中p的下标r、s用于标识pr和ps是不同的概率密度函数。
由基本概率论(basic probability theory)得到的一个基本结果是,如pr(r)和T(r)已知且在感兴趣值域上T(r)是连续(continuous)且可微的(differentiable),则变换(映射)后的变量s的PDF 可由下面的简单公式(formula)得到:
关于式(3.3-3)老猿认证研究了好长时间,也查了些资料,终于理解了,其推导请参考《人工智能数学基础:两个存在映射关系的随机变量的概率密度函数关系研究》。
这样,我们看到,输出灰度变量s的 PDF 就由输入灰度的 PDF 和所用的变换函数s=T(r)决定。
在图像处理中特别重要的变换函数有如下形式:
其中,w是积分(integration)的假变量。公式右边是随机变量 r的累积分布函数。老猿认为这就是一个直方图均衡的通用公式。
遵循式(3.3-4)的变换函数满足上面介绍的式(3.3-1)下面的假设条件1和条件2,即灰度映射函数在区间[0,L-1]上单调递增,其值域为区间[0,L-1]。相关推导大家可以自行证明,老猿将在后续博文中详细介绍。
在已知s=T(r)以及pr(r)的变换函数后,使用式(3.3-3)可以确认ps相应的变换函数ps(s),由基本积分学中的牛顿-莱布尼茨公式知道,关于上限的定积分的导数是被积函数在该上限的值,即:
把dr/ds的这个结果代入式(3.3-3),并记住概率密度值为正,得到:
老猿注:
从公式(3.3-6)的最后的ps(s)取值为1/(L-1)可知,这是一个均匀概率密度函数。因此可以证明式(3.3-4)的灰度变换将得到一个随机变量 s,该随机变量由一个均匀 PDF 表征。特别要注意,由该式可知T(r)取决于pr(r),正如式(3.3-6)所指出的那样,得到的ps(s)始终是均匀的,它与pr(r)的形式无关。图3.18说明了这些概念:
为了说明公式(3.3-6)与pr(r)的具体概率密度函数无关,我们以一个例子来加深大家的印象:
假设灰度值连续的图像中有如下PDF:
从式(3.3-4)有:
假设我们接着使用这个变换得到一幅灰度为s的新图像;也就是说,s值是通过求输入图像的相应灰度值的平方,然后除以(L-1)形成的。
例如,考虑一幅L=10的图像,并且假设输入图像中任意位置(x,y)处的像素有灰度r=3,则新图像中在该位置的像素是s=T(r)=r²/9=1。我们可以把pr(r)代人式(3.3-6),并用s=r²/(L-1)这样的事实验证新图像中的灰度的 PDF是均匀的,即:
其中,最后一步遵循了这样一个事实,即r是非负的并且假设L>1。正如所期望的那样,结果是一个均匀的PDF。
对于数字图像,由于其灰度值不连续,是离散值(discrete values),可以用概率(直方图值)与求和来替代概率密度函数与积分进行处理。正如前面提到的那样,一幅数字图像中灰度级rk出现的概率近似为:
其中,MN是图像中像素的总数,nk是灰度为rk的像素个数,L是图像中可能的灰度级的数量(如8比特图像是256)。正像本节开始说明的那样,与rk相对的pr(rk)图形通常称为直方图。
式(3.3-4)中变换的离散形式为:
其中MN是图像像素的行数M与列数N的乘积,L为该表示图像灰度所在数字区间的上限,如8bit图像为256,nj表示灰度值=j的像素个数。
通过式(3.3-8)对应的变换,可以将输入图像中灰度级为rk的各像素映射到输出图像中灰度级为sk的对应像素,从而得到输出图像的各像素灰度值。在这个公式中,变换(映射)T(r)称为直方图均衡或直方图线性变换。
不难证明该变换函数满足式(3.3-1)所述的两个假设条件,即对所有输入灰度值其值域属于[0,L-1],函数为单调递增函数。
例3.5 直方图均衡的简单说明。
在继续之前,通过一个简单的例子来说明直方图均衡的工作原理是有帮助的。假设一幅大小为64x64像素(MN=4096)的3比特图像(L=8)的灰度分布如表3.1所示,其中灰度级是范围[0,L-1]=[0,7]中的整数。
图像的直方图如下图3.19-a所示:
针对该图的直方图均衡变换函数的形状为形如图3.19-b所示的阶梯形状,直方图均衡变换函数的值使用式(3.3-8)得到,例如:
类似地可以得到:s2=4.55、s3=5.67、s4=6.23、s5=6.65、s6=6.86、s7=7.00。由于图像为数字图像,其灰度值必须为整数,这样算出来的小数必须调整为整数,可以采用四舍五入的方式取整,可以得到:
这些是均衡后的直方图的值,由于对应映射不是严格单调递增的映射,因此映射后灰度级个数由原来的8个降为5个,对应的均衡化后的直方图如上图3.19-c所示。
因为离散数据的直方图是PDF的近似,而且在处理中不允许生成新的灰度级,所以在实际的直方图均衡应用中,很少见到完美平坦的直方图。因此,不像连续数据的情况,离散直方图均衡通常不会导致均匀的直方图。
由于式(3.3-8)具有扩展输入图像直方图(spread the histogram of the input image)的趋势(老猿注:因为新的灰度值的计算方法导致直方图的数据由集中化向分散化变化),均衡后的图像的灰度级(intensity levels)跨越更宽灰度级(intensity scale)范围。最终结果(The net result)是增强了对比度(contrast enhancement)。
具有覆盖整个灰度范围的灰度值的图像有许多优点,刚才推导的方法除了产生有这样趋势的灰度之外,还有一个额外的优点,即它是完全“自动的”。换句话说,给定一幅图像,直方图均衡化的处理仅涉及执行式(3.3-8),该式计算时可直接从输入图像提取信息,而不需要其他更多的参数数据,且实现该式的计算简单,只需要加减法和乘除法。
如果输入图像的所有灰度级都存在,即直方图没有y轴为0的数据,所有分量都大于0,则针对式(3.3-8)的变换函数是严格单调递增的,因此一定存在反变换。
图3.20左边一列显示了来自《《数字图像处理》第三章学习总结感悟2:直方图处理》图3.16的4 幅图像,中间一列显示了对每一幅图像执行直方图均衡后的结果。从上到下的前三种结果显示了重要的改进效果。正如所预期的那样,直方图均衡对第四幅图像未产生太大的效果,这是因为这幅图像的灰度已经扩展到了全部灰度级范围。
图3.20 中的第三列显示了均衡后的图像的直方图。有趣的是,尽管这些直方图不同,但直方图均衡后的图像本身在视觉上却是非常相似的。但这并非是不希望的,因为左边一列图像之间的差异仅仅是对比度上的,而不是内容上的。换句话说,因为图像有相同的内容,直方图均衡导致的对比度增强足以补偿图像在视觉上难以区分灰度级的差别。在给出原始图像间的重要对比度差别后,该例说明了直方图均衡作为自适应对比度增强工具的强大作用。
上图 3.21 显示了用于产生图 3.20 中均衡后的图像的变换函数的曲线。这些函数是使用式(3.3-8)产生的。很明显,变换(4)的形状近似为线性形状,这指出输入被映射为近似相等的输出。
本文介绍了《数字图像处理》第三章直方图均衡的主要知识点,直方图均衡法针对非数字图像以及数字图像都存在通用的公式,只需要数字图像和非数字图像自身的信息,二者虽然由于灰度值连续和离散的不同公式有所不同,但本质是一致的。本文的介绍是完全基于《数字图像处理》的介绍,其中有些内容对于不熟悉数字图像处理的人员理解可能存在困难,请等待老猿后续的系列博文答疑解惑。
补充说明:本文中还存在一些疑难问题,这些问题的解答请参考付费专栏文章《数字图像处理》直方图均衡学习总结+感悟》。
更多直方图处理相关知识请参考《《数字图像处理》第三章学习总结感悟2:直方图处理》。
更多图像处理请参考专栏《OpenCV-Python图形图像处理》及《图像处理基础知识》的介绍。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《 专栏:Python基础教程目录》从零开始学习Python。
如对文章内容存在疑问,可在博客评论区留言,或关注:老猿Python 微信公号发消息咨询,可通过扫描博客左边的二维码加微信公众号。
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。