4.1.6 图像滤波
在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,处理效果的好坏将直接影响后续图像处理和分析的有效性和可靠性。滤波就是要去除没用的信息,保留有用的信息,可能是低频,也可能是高频。滤波的目的有两个:一是抽出对象的特征作为图像识别的特征模式;二是为适应图像处理的要求,消除图像数字化时混入的噪声。对滤波处理的要求有两条:一是不能损坏图像的轮廓及边缘等重要信息;二是使图像清晰,视觉效果好。
图4-21 空间线性变换
接下来,我们简单介绍线性滤波器与非线性滤波器的基本使用。
1. 线性滤波器
线性滤波器的原始数据与滤波结果是一种算术运算,即用加减乘除等运算实现,如均值滤波器(模板内像素灰度值的平均值)、高斯滤波器(高斯加权平均值)等。由于线性滤波器是算术运算,有固定的模板,因此滤波器的转移函数是可以确定并且是唯一的(转移函数即模板的傅里叶变换)。
在EBImage中,二维卷积可由函数filter2实现,权重函数可由辅助函数makeBush生成。实际上,filter2使用在数学上等价的快速傅里叶变换的方式,使得计算更加高效。
以下代码首先利用makeBrush()函数生成一个宽度为20的高斯滤波器,其他可用的过滤器形状有box(默认)、disc、diamond和line;再利用filter2()函数对img图像进行过滤,得到如图4-22所示图像。
> w <- makeBrush(size = 51, shape = 'gaussian',sigma = 20) > img_flo <- filter2(img, w) > display(img_flo,method = 'raster')
2. 非线性滤波器
非线性滤波器的原始数据与滤波结果是一种逻辑关系,即用逻辑运算实现,如极大值滤波器、极小值滤波器、中值滤波器等。非线性滤波器通过比较一定邻域内的灰度值大小来实现,没有固定的模板,因而也就没有特定的转移函数(因为没有模板作傅里叶变换)。另外,膨胀和腐蚀也是通过最大值、最小值滤波器实现的。五种常见的非线性滤波算子(极大值滤波、极小值滤波、中点滤波、中值滤波、加权中值滤波)对不同的图像会有不同的作用。最常用的是中值滤波器,因为它的效果最好且信息损失最少。
图4-22 线性滤波处理
中值滤波器可以消除图像中的长尾噪声,例如负指数噪声和椒盐噪声。在消除噪声时,中值滤波器对图像噪声的模糊极小(受模板大小的影响),其实质上是用模板内所包含像素灰度的中值来取代模板中心像素的灰度。中值滤波器在消除图像内椒盐噪声和保持图像的空域细节方面的性能优于均值滤波器。
在EBImage中,medianFilter()函数可实现中值滤波器技术。我们首先通过加入均匀噪声来破坏图像,如图4-23所示。
> l <- length(img) > n <- l/5 > pixels <- sample(l, n) > img_noisy <- img > img_noisy[pixels] <- runif(n, min=0, max=1) > display(img_noisy,method = 'raster')
图4-23 加入噪声的图像
接下来,利用中值滤波器消除图像中的噪声,如图4-24所示。
> img_median <- medianFilter(img_noisy, 1) > display(img_median,method = 'raster')
图4-24 利用中值滤波器去噪后的图像