数字图像处理-空间域处理-空间滤波-平滑空间滤波器

参考自:数字图像处理第三版-冈萨勒斯

 

平滑滤波用于模糊处理降低噪声。模糊处理常用于预处理任务中,如在目标提取之前去除图像中的一些琐碎细节,以及桥接直线或曲线的缝隙。通过线性或非线性平滑滤波也可降低噪声。

线性滤波器

均值滤波器(均值平滑、均值滤波)

平均值或加权平均值

 常见的平滑处理应用就是降低噪声。它会去除与滤波器模板尺寸相比较小的像素区域。然而,由于图像边缘也是由图像灰度尖锐变化带来的特性,所以均值滤波处理存在不希望有的边缘模糊效应。

 

空间均值处理的一个重要应用是为了对感兴趣的物体得到一个粗略的描述,模糊一幅图像。这样,那些较小物体的灰度与背景融合在一起,较大物体变得像“斑点”而易于检测。模板的大小由那些即将融入背景中的物体尺寸来决定。

(b)中图像的一些部分或者融入背景中,或者亮度降低

 

 1 """
 2 均值滤波
 3 """
 4 import numpy as np
 5 import cv2
 6 
 7 
 8 # 定义函数,生成椒盐噪声图像
 9 def salt_pepperNoise(src):
10     dst = src.copy()
11     num = 1000  # 1000个噪声点
12     ndim = np.ndim(src)
13     row, col = np.shape(src)[0:2]
14     for i in range(num):
15         x = np.random.randint(0, row)  # 随机生成噪声点位置
16         y = np.random.randint(0, col)
17         indicator = np.random.randint(0, 2)  # 生成随机数0和1,决定是椒噪声还是盐噪声
18         # 灰度图像
19         if ndim == 2:
20             if indicator == 0:
21                 dst[x, y] = 0
22             else:
23                 dst[x, y] = 255
24         # 彩色图像
25         elif ndim == 3:
26             if indicator == 0:
27                 dst[x, y, :] = 0
28             else:
29                 dst[x, y, :] = 255
30     return dst
31 
32 
33 # 定义函数,实现均值滤波
34 def meanFilter(src, wsize):  # src为输入图像,wsize为窗口大小
35     border = np.uint8(wsize/2.0)  # 计算扩充边缘
36     addBorder = cv2.copyMakeBorder(src, border, border, border, border, cv2.BORDER_REFLECT_101)  # 扩充后
37     dst = src.copy()
38     filterWin = 1.0/(wsize**2) * np.ones((wsize, wsize), dtype=np.float32)  # 定义窗口
39     row, col = np.shape(addBorder)
40     # 滑动,开始滤波
41     for i in range(border, row-border):
42         for j in range(border, col-border):
43             temp = addBorder[i-border:i+border+1, j-border:j+border+1]
44             newValue = np.sum(temp * filterWin)  # 均值滤波
45             dst[i-border, j-border] = newValue
46     dst = np.uint8(dst + 0.5)
47     return dst
48 
49 
50 img = cv2.imread('F:\program_study\Python\data\lena.tif', cv2.IMREAD_GRAYSCALE)
51 # 生成椒盐图
52 saltPimg = salt_pepperNoise(img)
53 cv2.imshow('saltPepper', saltPimg)
54 # 均值滤波
55 MeanFimg = meanFilter(saltPimg, 3)
56 cv2.imshow('MeanFilter', MeanFimg)
57 cv2.waitKey(0)
58 cv2.destroyAllWindows()
均值平滑

 

高斯滤波器(高斯平滑、高斯滤波)

 参考自:琪琪宝贝

高斯滤波器是一种带权的平均滤波器,它的模板根据高斯函数计算得到。高斯函数是正态分布的密度函数。正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。高斯函数的图形:

σ控制钟形的“紧度”

 

高斯分布

一维:

二维:

x,y的取值

 

高斯滤波模板

常见的模板有

高斯滤波的性质

高斯函数具有五个重要的性质,这些性质使得它在早期图像处理中特别有用.这些性质表明,高斯平滑滤波器无论在空间域还是在频率域都是十分有效的低通滤波器,且在实际图像处理中得到了工程人员的有效使用.高斯函数具有五个十分重要的性质,它们是: 

  (1)二维高斯函数具有旋转对称性,即滤波器在各个方向上的平滑程度是相同的.一般来说,一幅图像的边缘方向是事先不知道的,因此,在滤波前是无法确定一个方向上比另一方向上需要更多的平滑.旋转对称性意味着高斯平滑滤波器在后续边缘检测中不会偏向任一方向. 

  (2)高斯函数是单值函数.这表明,高斯滤波器用像素邻域的加权均值来代替该点的像素值,而每一邻域像素点权值是随该点与中心点的距离单调增减的.这一性质是很重要的,因为边缘是一种图像局部特征,如果平滑运算对离算子中心很远的像素点仍然有很大作用,则平滑运算会使图像失真. 

  (3)高斯函数的傅立叶变换频谱是单瓣的.正如下面所示,这一性质是高斯函数付立叶变换等于高斯函数本身这一事实的直接推论.图像常被不希望的高频信号所污染(噪声和细纹理).而所希望的图像特征(如边缘),既含有低频分量,又含有高频分量.高斯函数付立叶变换的单瓣意味着平滑图像不会被不需要的高频信号所污染,同时保留了大部分所需信号. 

  (4)高斯滤波器宽度(决定着平滑程度)是由参数σ表征的,而且σ和平滑程度的关系是非常简单的.σ越大,高斯滤波器的频带就越宽,平滑程度就越好.通过调节平滑程度参数σ,可在图像特征过分模糊(过平滑)与平滑图像中由于噪声和细纹理所引起的过多的不希望突变量(欠平滑)之间取得折衷. 

  (5)由于高斯函数的可分离性,较大尺寸的高斯滤波器可以得以有效地实现.二维高斯函数卷积可以分两步来进行,首先将图像与一维高斯函数进行卷积,然后将卷积结果与方向垂直的相同一维高斯函数卷积.因此,二维高斯滤波的计算量随滤波模板宽度成线性增长而不是成平方增长.

统计排序(非线性)滤波器

这种滤波器以统计排序的值代替中心像素的值。如,中值滤波器。它的主要功能是使拥有不同灰度的点看起来更接近于它的相邻点,具有非常优秀的去噪能力,而且比相同尺寸的线性平滑滤波的模糊程度明显要低。中值滤波处理椒盐噪声非常有效。

另外还有最大值和最小值滤波器

 

 1 """
 2 非线性滤波,包括中值滤波,
 3           最大值滤波,最小值滤波
 4 """
 5 import numpy as np
 6 import cv2
 7 
 8 
 9 # 定义函数,生成椒盐噪声图像
10 def salt_pepperNoise(src):
11     dst = src.copy()
12     num = 1000  # 1000个噪声点
13     ndim = np.ndim(src)
14     row, col = np.shape(src)[0:2]
15     for i in range(num):
16         x = np.random.randint(0, row)  # 随机生成噪声点位置
17         y = np.random.randint(0, col)
18         indicator = np.random.randint(0, 2)  # 生成随机数0和1,决定是椒噪声还是盐噪声
19         # 灰度图像
20         if ndim == 2:
21             if indicator == 0:
22                 dst[x, y] = 0
23             else:
24                 dst[x, y] = 255
25         # 彩色图像
26         elif ndim == 3:
27             if indicator == 0:
28                 dst[x, y, :] = 0
29             else:
30                 dst[x, y, :] = 255
31     return dst
32 
33 
34 
35 # 定义函数,实现中值滤波,最大值滤波,最小值滤波
36 def nonlinearFilter(src, wsize):
37     border = np.uint8(wsize / 2.0)
38     addBorder = cv2.copyMakeBorder(src, border, border, border, border, cv2.BORDER_REFLECT_101)
39     dst = src.copy()
40     row, col = np.shape(addBorder)
41     # 开始滑动
42     for i in range(border, row - border):
43         for j in range(border, col - border):
44             temp = addBorder[i - border:i + border + 1, j - border:j + border + 1]
45             newValue = np.median(temp)  # 中值滤波
46             # newValue = np.max(temp)  # 最大值滤波
47             # newValue = np.min(temp)  # 最小值滤波
48             dst[i - border, j - border] = newValue
49     return dst
50 
51 
52 img = cv2.imread('F:\program_study\Python\data\lena.tif', cv2.IMREAD_GRAYSCALE)
53 # 生成椒盐图
54 saltPimg = salt_pepperNoise(img)
55 cv2.imshow('saltPepper', saltPimg)
56 # 中值,最大值,最小值滤波
57 Fimg = nonlinearFilter(saltPimg, 3)
58 cv2.imshow('nonlinearFilter', Fimg)
59 cv2.waitKey(0)
60 cv2.destroyAllWindows()
中值、最大值和最小值滤波

中值滤波是用窗口内像元的中值来代替中心像元的亮度值。

均值滤波和中值滤波非常基础,均值滤波相当于低通滤波,有将图像模糊化的趋势,对椒盐噪声基本无能为力。中值滤波的优点是可以很好的过滤掉椒盐噪声,缺点是易造成图像的不连续性。

最大值滤波是用窗口内像元的最大值来代替中心像元的亮度值,可以发现图像中的亮点,并消除图像中的“椒”噪声(亮度值小的噪声)。

 最小值滤波是用窗口内像元的最小值来代替中心像元的亮度值,可以发现图像中的暗点,并消除图像中的“盐”噪声(亮度值大的噪声)。

posted @ 2018-04-09 10:20  Laumians  阅读(10878)  评论(0编辑  收藏  举报