本系列文章记录老猿自学冈萨雷斯《数字图像处理》的感悟和总结,不过估计更新会比较慢,白天要工作,都是晚上抽空学习,学习完一章再回头总结,想学的朋友可以自己下载英文原版(目前到第四版)和中文译本(目前应该到第三版)的电子版观看,如果想对照观看建议英文原版也找第三版。
这本《数字图像处理》不愧为数字图像处理的经典教程,知识范围广、内容详尽、案例贴近实践,至少很合老猿的口味。但中译本存在两个问题:
老猿在学习的总结上,针对特定知识点加上一些自己的感悟,如果感悟内容描写多一点,会标注为:老猿注,如果少就没有单独标注,可能到后来老猿自己都发现不了是否是自己改动过的。
平滑滤波器用于模糊处理(blurring )和降低噪声(noise reduction)。模糊处理经常用于图像预处理任务中,例如在(大)目标提取(object extraction)之前去除图像中的一些琐碎细节(small details),以及桥接(bridging)直线或曲线的缝隙。通过线性滤波(linear filter)和非线性滤波(nonlinear filtering)进行模糊处理可以降低图像噪声。
相关和卷积可以表示成乘积求和的形式:
其中w是一个m×n大小的滤波器系数矩阵,z为滤波器覆盖的相应图像像素的灰度值。这也是线性滤波的向量表示,因为线性滤波做的所有事情就是实现乘积求和操作。
不能表示成乘积和形式的滤波器就是非线性滤波,如统计排序滤波(最大值滤波、最小值滤波、中值滤波等)以及高斯滤波。
使用非线性滤波器需要确定滤波器邻域大小以及邻域内图像像素执行的操作。
平滑线性空间滤波器的输出(响应)是包含在滤波器模板邻域内(the neighborhood of the filter mask)的像素的简单平均值。这些滤波器有时也称为均值滤波器(averaging filters),也可以把它们归入低通滤波器(lowpass filters)。
平滑滤波器的基本概念非常直观。它使用滤波器模板确定的邻域内像素的平均灰度值代替图像
中每个像素的值。
平滑滤波器处理的结果降低了图像灰度的“尖锐”(sharp)变化(transitions)。由于典型的随机噪声(random noise)由灰度级的急剧变化组成,因此常见的平滑处理(smoothing)应用就是降低噪声。
然而由于图像边缘(edges,几乎总是一幅图像希望有的特性)也是由图像灰度尖锐变化(sharp intensity transitions)带来的特性。所以均值滤波处理还是存在着不希望有的边缘模糊(blur edges)的负面效应(undesirable side effect)。另外这类处理的其他应用包括由于灰度级数量不足(insufficient number of intensity levels)而引起的伪轮廓效应(false contours)的平滑处理。
均值滤波器的主要应用是去除图像中的不相关(irrelevant)细节,其中“不相关”是指与滤波器模板尺寸相比较小的像素区域。
第一个滤波器产生下方的标准像素平均值。把模板系数代人式(3.4-3)即可清楚地看出这一点:
R是由模板定义的3x3邻域内像素灰度的平均值。注意代替上式中的1/9,滤波器的系数全为“1”,这里的概念是系数取1值时计算更有效,在滤波处理之后整个图像除以9。一个mxn模板应有等于1/mn的归一化常数。象这样所有系数都相等的空间均值滤波器有时称为盒状滤波器(box filter)。
图3.32所示的第二个模板更为重要一些。该模板产生所谓的加权平均(weighted average),使用这一术语是指用不同的系数乘以像素灰度,即一些像素的重要性(权重)比另一些像素的重要性更大。
在模板中,处于该模板中心位置的像素所乘的值比其他任何像素所乘的值都要大,因此,在均值计算中为该像素提供更大的重要性。
其他像素如同是模板中心距离的函数那样赋以成反比的权重。由于对角项离中心比离正交方向相邻的像素(参数为✓2)更远,所以它的权重比与中心直接相邻的像素更小。
赋予中心点最高权重,然后随着距中心点距离的增加而减小系数值的加权策略的目的是在平滑处理中试图降低模糊(reduce blurring)程度。也可以选择其他权重来达到相同的目的。然而图3.32(b)所示模板中所有系数的和等于 16,对于计算机计算来说是一个有吸引力的特性,因为它是 2 的整数次幂。
在实践中,由于这些模板在一幅图像中任何一个位置所跨过的区域很小,通常很难看出使用图3.32中的各种模板或类似方式进行平滑处理后的图像之间的区别。
对于一幅大小为M×N的图像,使用m×n的滤波器模板(m、n为奇数,a=(m-1)/2、b=(n-1)/2)进行加权均值滤波的过程可以由下式表示:
其中x取值为0–M-1,y取值为0–N-1。上式中的分母部分表示为模板各系数之后,它是只需要计算一次即可得到的常数。
与滤波器模板尺寸有关的图像平滑效果如图3.33所示:
图中显示了一幅原图像以及分别用尺寸为m=3、5、9、15和35像素的方形均值滤波器得到的相应平滑结果。
这些结果的主要特点如下:
正像早些时候提到的那样,空间均值处理的一个重要应用是为了对感兴趣的物体得到一个粗略的描述(gross representation)而模糊一幅图像,这样,那些较小物体的灰度就与背景混合在一起了,较大物体变得像“斑点”(bloblike)而易于检测。
空间均值处理模板的大小由那些即将融入背景中的物体尺寸来决定。作为实例,考虑图:
统计排序滤波器是一种非线性空间滤波器,这种滤波器的响应以滤波器包围的图像区域中所包含的像素的排序(排队ordering或ranking)为基础,然后使用统计排序结果决定的值代替中心像素的值。
统计排序滤波器中最知名的滤波器是中值滤波器(median filter),正如其名暗示的那样,它是将像素邻域内灰度的中值(在中值计算中包括原像索值)代替该像索的值。
一个数值集合的中值(median)ξ是这样的数值,即数值集合中有一半小于或等于ξ。还有一半大于或等干ξ。为了对一幅图像上的某个点进行中值滤波处理,首先将邻域内的像素分类排序。确定其中值,并将中值赋予滤波后图像中的相应像素点。
例如,对于一个3x3邻域。其中值是第5 个最大的值。而在一个5x5邻域中,中值就是第13个最大的值,等等。
当一个邻域中的一些像素值相同时,所有相等的值都可以作为中值。假如,在一个3x3邻域内有一系列像素值(10,20,20,20,15,20,20,25,100)。对这些值排序后为(10,15,20,20,20,20,20,25,100),那么其中值就是20。
中值滤波器的使用非常普遍,这是因为对于一定类型的随机噪声(random noise),它提供了一种优秀的去噪(noise-reduction)能力。而且比相同尺寸的线性平滑滤波器的模糊程度明显要低。
中值滤波器对处理脉冲噪声(impulse noise)非常有效,该种噪声也称为椒盐嗓声(salt-and-pepper noise),因为这种噪声是以黑白点的形式叠加在图像上的。
这样,中值滤波器的主要功能是使拥有不同于周边像素灰度级的点看起来更接近于它的相邻点。事实上,我们常使用m×m中值滤波器来去除那些相对于其邻域像素更亮或更暗并且其区域小于m²/2(滤波器区域的一半)的孤立像素族(isolated clusters),显然较大的像素簇(Larger clusters)所受到的影响明显较小。在这种情况下,“去除”(eliminated)的意思是强制为邻域的中值灰度(median intensity)。
例3.14 利用中值滤波降噪。
图3.35(a)显示了一幅被椒盐噪声污染的电路板的X射线图像。
为了说明这种情况下的中值滤波器处理效果比均值滤波器更好。在图3.35(b)中显示了用3x3邻域均值模板处理噪声图像的结果,而在图3.35©中显示了用3x3中值滤波器处理噪声图像的结果。均值滤波模糊了图像,并且噪声去除性能也很差。在这种情况下,中值滤波要远远优于均值滤波。通常中值滤波比均值滤波更适合去除椒盐噪声。
在图像处理中,尽管中值滤波器是使用得最为广泛的统计排序滤波器,但并不意味着它是唯一的。
中值象征一系列像素值排序后的第50%个值,但根据基本统计学可知,排序也适用于其他不同的情况。
例如,可以取第100%个值,即所谓的最大值滤波器(max filter)。这种滤波器在搜寻一幅图像中的最亮点时非常有用。一个3x3的最大值滤波器的响应可以由公式R=max{zk|k=1,2,···,9}给出。
相反,取第0%个值的滤波器就是所谓的最小值滤波器(min filter),它可用于相反的目的。
本文介绍了线性滤波和非线性滤波的概念、作用以及应用示例,可以看到线性滤波和非线性滤波都有不错的应用场景,线性滤波器还可以有不同的系数,不同的波器的模板大小取决于要处理图像的目标,特定的模板对特定的噪声有比较好的作用,如线性滤波比较适合随机噪声,中值滤波适合椒盐噪声的处理。
更多图像处理请参考专栏《OpenCV-Python图形图像处理》、《图像处理基础知识》以及付费专栏《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。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。