请大家想一下,当自己存储了好久女神的图片被噪声污染了,那是一种怎样的伤心欲绝的事情啊。但是,有matlab在。你什么都不用担心,matlab会用滤波的办法给图片进行去噪操作。也就是给你的女神“洗脸”,先给大家看一个例子。
处理完了以后:女神又恢复了原来美美哒的样子了,对不对。添加的椒盐噪声几乎全没了。
首先,大家需要了解一下一个简单的非线性空间滤波的工具箱。这个函数就是g=ordfilt2(f,order,domain)。
至于线性滤波,我在前面就已经讲过。如果大家想要对照着学习,可以看一下。
记住,这个工具箱只能处理二维的图片。当然,可以用其他办法搞定三维的彩色图片。
其中g就是它的输出图像,它的原理非常简单,它可以生成统计排序滤波器,它的响应是基于对图像邻域包含的像素进行排序。然后用排序结果确定的值来代替邻域的中心像素的值。
其中order代表使用排序元素的第order个元素代替f中的每一个元素。而该邻域由domain中的非零元素指定。
比较有名的滤波叫做中值滤波。它对应的是第50个百分位。也就是像素点总和的一半。
语法如下:
g=ordfilt2(f,median(1:m*n),ones(m,n))
还有最小滤波器,对应第0个百分位。
语法如下:
g=ordfilt2(f,1,ones(m,n))
还有对应100个百分位的滤波器。也就是像素点总和。
g=ordfilt2(f,m*n,ones(m,n))。
另外中值滤波还有一个专用的工具箱g=medfilts(f)。
接下来我给出一个中值滤波的例子,这个是将彩色图片处理成黑白图片以后进行的操作。
代码如下
clear
clc
f=imread('12_w.bmp'); %读原图像
f=rgb2gray(f);
f1=imnoise(f,'salt & pepper',0.09); %加椒盐噪声
g=medfilt2(f1); %进行中值滤波
subplot(1,3,1),imshow(f),title('原图像')
subplot(1,3,2),imshow(f1),title('被椒盐噪声污染的图像')
subplot(1,3,3),imshow(g),title('中值滤波图像')
中值滤波以后,被污染的图像几乎恢复得和原来的图像一模一样。
如果添加的是高斯噪声,效果也不错。
代码中只需要把添加噪声的代码修改成下面的就可以了
f1=imnoise(f,'gaussian',0,0.01); %加高斯噪声
那有一些朋友可能会问了,彩色图片应该怎么处理,那是三维的矩阵,工具箱不能解决呀!
不用担心,彩色图片有三个颜色通道,只需要分别处理这三个颜色通道。然后组合在一起,彩色图片就自然解决掉了。
对这三个颜色通道的处理和灰度图一模一样。这就实现了我在开头给大家的图。
代码如下:
clear
clc
f=imread('12_w.bmp');
f1=imnoise(f(:,:,1),'salt & pepper',0.09); %加椒盐噪声
f2=imnoise(f(:,:,2),'salt & pepper',0.09); %加椒盐噪声
f3=imnoise(f(:,:,3),'salt & pepper',0.09); %加椒盐噪声
f_noise(:,:,1)=f1;
f_noise(:,:,2)=f2;
f_noise(:,:,3)=f3;
g1=medfilt2(f1);%中值滤波
g2=medfilt2(f2);%中值滤波
g3=medfilt2(f3);%中值滤波
g_1(:,:,1)=g1;
g_1(:,:,2)=g2;
g_1(:,:,3)=g3;
subplot(1,3,1),imshow(f),title('原图像');
subplot(1,3,2),imshow(f_noise),title('添加椒盐噪声的图像');
subplot(1,3,3),imshow(g_1),title('处理以后的图像');
全部资源:
链接:https://pan.baidu.com/s/13GyWNKiLC93snD0dK72rXA
提取码:f9w5
参考文献:《数学建模算法与应用》(司守奎,孙兆亮)
图片来源:https://pixabay.com