![2fbea433c8dc19f6d5232ea930f4725b.png](https://i-blog.csdnimg.cn/blog_migrate/a90f93095d71fbeef7ad0e92f6a9a5d0.jpeg)
一,核心函数
工具箱提供了两个函数来执行常见的非线性滤波:nlfilter和colfilt,前者直接执行二维操作,而colfilt按列的形式组织数据。尽管colfilt需要占用更多的内存,但执行起来要比nlfilter快得多。在大多数图像处理应用中,速度是最重要因素,因此在实现非线性空间滤波时,更多地采用colfilt而不采用nlfilt。
函数colfilt的语法为:
g=colfilt(f, [m n], ‘sliding’,@ fun)
其中m和n表示滤波区域的维数,‘sliding’表明处理过程是m*n区域在输入图像f中逐像素地滑动,@ fun引用一个函数,我们将该函数任意表示为fun, 符号@是一个函数句柄,他是一直MATLAB数据类型,它包含引用函数用到的一些信息,这是一个非常有用的概念,我们将会在后面的学习中看到。
下面 举一个例子来看一下效果:
有这样的一副原图
![cef08725a75134df69f2a5d23e386632.png](https://i-blog.csdnimg.cn/blog_migrate/292e26c76680e6b1bcc965d7e46198e1.png)
我们运行以下的程序:
I=imread('fxyx.jpg');
J=rgb2gray(I);
subplot(2,2,1);
imshow(J)
title('原图像灰度图');
F= uint8(colfilt(J,[5 5],'sliding',@mean));
subplot(2,2,2);
imshow(F)
title('滤波后图像');
![3898deaa1aab5253d00add531fefd003.png](https://i-blog.csdnimg.cn/blog_migrate/b39d71954e872fd87d776ca5f8de72a9.png)
上面是处理前后的对比图像。
二,图像处理工具箱的标准空间滤波器
1.ordfilt函数
IPT中常用于生成非线性空间滤波的一个工具是函数ordfilt2,它可以生成统计排序( order-statistic )滤波器(也称为排序滤波器,rank filter )。它们都是非线性空间滤波器,其响应基于对图像邻域中所包含的像素进行排序,然后使用排序结果确定的值来替代邻域中的中心像素的值。本部分的重点在于由函数ordfilt2生成的非线性滤波器。
函数ordfilt2的语法为
g = ordfilt2(f, order, domain)
2.中值滤波器
数字图像处理中最著名的统计排序滤波器是中值滤波器,它对应的是第50个百分位。我们可以使用MATLAB函数ordfi lt2来创建一个中值滤波器:
g = ordfilt2(f,median(1 :m*n) , ones(m, n) )
其中median(1:m* n)简单地计算排序序列1, 2, . mn的中值。函数median的通用语法为
v=median (A, dim)
其中,v是向量,它的元素是A浩着维教dim的中值。例如,若dim-1,则v的每个元素就都是矩阵A中沿相应列的元素的中值。工具箱提供了一个二维中值滤波函数:
g=medfilt2 (f,[m n], padopt)
数组[m n]定义了一个大小为mxnf的邻域,中值就在该邻城上计算,面paopr指定了二个可能的边界填充选项之一:,zeros' (默认值);,symmettrie,此地f按照镜像反射方式对称地沿其边界扩展;,indexed',若f是double;类图像,则以1来填充图像,否则以0来填充图像。
该函数的默认形式为:
g=medfilt2 (f)
3.利用函数medfilt2进行中值滤波。
中值滤波是降低图像中椒盐噪声的一种有用工具。
如图是一块工业电路板在自动检测期间所拍摄的X射线图像f。
![abd45c870de6c0da4019c5b639e74cf4.png](https://i-blog.csdnimg.cn/blog_migrate/bfe97c52769147f25f3bfb00f62b93d9.jpeg)
下图是被椒盐噪声污染的同一幅图像,图像中黑点和白点出现的概率为0.2.这幅图像是利用函数imnoise生成的:
fn=imnoise(f,’salt & pepper’, 0.2);
![ef5389fd5054cf66908fce27fc0cda3e.png](https://i-blog.csdnimg.cn/blog_migrate/90f26e566eafce16e1ddd423b92d5d40.jpeg)
图3是对该带噪图像进行中值滤波处理后的结果,使用语句:
gm=medfilt2(fn);
![55a5ab9528839afd4c4ade138dbc0957.png](https://i-blog.csdnimg.cn/blog_migrate/232fbb0c02a5770bd1eaaac89f1656f9.jpeg)
考虑图2中的噪音水平,中值滤波采用默认设置很好地实现了降噪。但要注意围绕图像边界的黑色污点,这些黑色污点是由围绕图像的黑点引起的(回忆可知默认使用0来对边界进行填充)。使用‘symmetric’选项可降低这种效应:
gms=medfilt2(fn,’symmetric’);
![4d7d6f5e0607243d417fa4c7087ba2e3.png](https://i-blog.csdnimg.cn/blog_migrate/4a394310c00e904b6f6886ba27ed7dc4.jpeg)
上图结果与图2所示结果相近,但黑色边框效应已不再那么明显。
这部分的知识比较繁杂冗长,由于篇幅有限,我们今天讲的只是基础的部分,后面还会讲到的,这里只需要了解一下,知道这些函数的渊源就可以了。
想要进一步学习的小伙伴可以关注我们的公众号Asoul水云天课堂,也可以加qq群953314432进群学习哦。