前言
采用线性滤波和非线性滤波是在空间域上处理图像最常用的滤波方法。matlab在处理图像滤波方面拥有可调用的函数,十分便利。我们可以根据自己的需要自行选择滤波方式对图像进行滤波。值得一提的是,图像锐化在某种程度上来说就是线性滤波。
一、线性滤波器
matlab常用的线性滤波函数是imfilter函数。在imfilter函数中会涉及到滤波掩膜w,这个w是需要预先给出的,相当于确定滤波方式。例如常用的拉普拉斯方法、高斯方法等。matlab中自带fspecial函数可以直接调用现成的模板,当然如果你觉得这些模板处理图像不够满意,也可以自行设计模板,模板本质上就是一个矩阵,尤以3*3矩阵为最常见。
在imfilter函数中,除了需要选择处理图像和滤波掩膜之外,还需要对图像边界如何处理进行规定。
imfilter(I1,w,'replicate'):图像通过复制图像边界外的值进行扩展
imfilter(I1,w,'symmetric'):图像通过边界镜像反射进行扩展
imfilter(I1,w,'circular'):图像通过将图像处理为二维周期函数的一个周期进行扩展
二、使用示例
设计拉普拉斯滤波器进行图像锐化
I1=imread('moon.tif');
w1=fspecial('laplacian',0);%调用已有的拉普拉斯算子
I2=imfilter(I1,w1,'replicate');%利用算子进行线性滤波
I3=I1-I2;%将滤波图像和原图进行叠加得到增强图
subplot(221),imshow(I1),title('原图');
subplot(222),imshow(I2),title('w为uint8类型时的拉普拉斯锐化');
subplot(223),imshow(I3),title('增强图');
w2=[1 1 1;1 -8 1;1 1 1];%采用自己设计的拉普拉斯算子进行线性滤波
I4=imfilter(I1,w2,'replicate');
I5=I1-I4;
figure(2)
subplot(131),imshow(I1),title('原图');
subplot(132),imshow(I3),title('中心系数为-4的增强图');
subplot(133),imshow(I5),title('中心系数为-8的增强图');
三、结果展示
可以看到,采用中心系数为-8的算子处理得到的增强图处理细节更好。因此在使用线性滤波器时并不能完全依赖于fspecial函数直接调用现成模板。
四、非线性滤波器
matlab中常见的非线性滤波器是最小值滤波器、最大值滤波器和中值滤波器。这三种滤波器都可以利用ordfilt2函数实现,只需要给定不同的order即可。另外,由于中值滤波器对椒盐噪声具有出色的处理能力,所以matlab还给出了专门的中值滤波器函数medfilt2。
以3*3模板为例:
I2=ordfilt2(I1,1,ones(3,3)):将3*3的像素值从小到大排列,然后用第一位的最小值代替目标像素值达到滤波的目的(最小值滤波)
I2=ordfilt2(I1,3*3,ones(3,3)):将3*3的像素值从小到大排列,然后用最后一位(最大的一位)的值代替目标像素值达到滤波的目的(最大值滤波)
I2=ordfilt2(I1,(3*3+1)/2,ones(3,3)):将3*3的像素值从小到大排列,然后用中值代替目标像素值达到滤波的目的(中值滤波)
I2=medfilt2(I1,[3 3],'zeros'):采用中值滤波方式进行滤波,对于边界采用0进行填充
I2=medfilt2(I1,[3 3],'symmetric'):采用中值滤波方式进行滤波,对于边界采用镜像反射方式对称的沿边界扩展
I2=medfilt2(I1,[3 3],'indexed'):采用中值滤波方式进行滤波,对于边界若I1为double类,采用1进行填充,否则采用0进行填充
五、使用示例
设计三种滤波器进行滤波去除椒盐噪声
%非线性滤波
m1=imread('industry.tif');
m2=medfilt2(m1);%采用默认的中值滤波器
m3=medfilt2(m1,'symmetric');%采用镜像处理的中值滤波
m4=ordfilt2(m1,1,ones(3,3));%最小值滤波,3*3模板
m5=ordfilt2(m1,3*3,ones(3,3));%最大值滤波,3*3模板
m6=ordfilt2(m1,(3*3+1)/2,ones(3,3));%中值滤波,3*3模板
figure(3)
subplot(231),imshow(m1),title('原图');
subplot(232),imshow(m2),title('默认中值滤波');
subplot(233),imshow(m3),title('镜像对称中值滤波');
subplot(234),imshow(m4),title('ordfilt2函数最小值滤波');
subplot(235),imshow(m5),title('ordfilt2函数最大值滤波');
subplot(236),imshow(m6),title('ordfilt2函数中值滤波');
六、结果展示
中值滤波在处理椒盐噪声方面可以说是最佳的选择;最小值滤波似乎仅能去除白噪声而最大值滤波仅能去除灰度值偏大的噪声?(老师讲的全都还给他了···)
总之,中值滤波是非线性滤波器中最常用的选择!采用symmetric方法可以有效减小边界的黑色边框效应,在使用时可以三种填充方式都尝试比较一下再进行使用。