上一篇说了进行线性和非线性滤波的一种方式,这一篇来继续学习IPT支持的线性和非线性滤波
线性滤波
用于二维的即函数fspecial
fspecial
fspecial ('type',parameters)
%'type'表示滤波器类型
%'parameters'进一步定义了指定的滤波器
函数 fspecial支持的空间滤波器
类型 | 函数 | 参数 |
---|---|---|
‘average’ | fspecial(‘average’,[r c]) | 大小为r x c的一个矩形平均滤波器。默认值为3x 3。若由一个数来代替[r c].则表示方形滤波器 |
‘disk’ | fspecial(‘disk’,r) | 一个圆形平均漶波器(包含在2r + 1大小的正方形内),半径为r。默认半径为5 |
‘gaussian’ | fspecial(‘gaussian’,[r c] ,sig) | 一个大小为r x c的高斯低通滤波器,标准偏差为sig (正)。默认值为3 x 3和0.5。若由一个数来代替 |
‘laplacian’ | fspecial (‘laplacian’ ,alpha) | 一个大小为3 x 3的拉普拉斯滤波器,其形状由alpha指定,alpha是范围[0, 1]内的一个数。alpha 的默认值为0.5 |
‘log’ | fspecial(‘log’,[r c],sig) | 一个大小为r x c的高斯-拉普拉斯(LoG)滤波器.标准偏差为sig (正)。默认值为5x5和0.5。若用一个数代替[r c], 则表示一个方形滤波器 |
‘motion’ | fspecial (‘motion’,len, theta) | 围绕一幅有着len个像素的图像线性运动时(就像照相机与景物的关系),输出一个滤波器。运动的方向为theta,其单位为度,即从水平方向逆时针转动的角度。默认值为9和0,表示沿水平方向9个像索的运动 |
举个例子
w = fspecial('laplacian',0)
输出为
有一点数字图像基础的都知道这是一个拉普拉斯滤波器的一般模板,一个标准的3×3滤波器,而我们如果要得到更清晰的效果,一般使用一个中心为-8的滤波器
w4 = fspecial('laplacian',0);
w8 = [ 1 1 1
1 -8 1
1 1 1];
I = imread('moon.tif');
I = im2double(I);
g4 = I - imfilter(I, w4, 'replicate');
g8 = I - imfilter(I, w4, 'replicate');
subplot(131)
imshow(I)
subplot(132)
imshow(g4)
subplot(133)
imshow(g8)
由于原图已经有较好的清晰度了,但我们还是可以看到一些细节的变化
非线性滤波
ordfilt2也称排序滤波器,对图像邻域中所包含的像素进行排序,然后使用排序结果确定的值来替代邻域中的中心像素的值。
ordfilt2
语法为
g = ordfilt2 (f, order, domain);
%g为输出图像
%使用邻域的一组排序元素中的第order个元素来替代f中的每个元素
%该邻域则由domain中的非零元素指定
%domain是一个由0和1组成的大小为mxn的矩阵,该矩阵指定了将在计算中使用的邻域中的像素位置。
举例:
要实现大小为m×n的最小滤波器
g = ordfilt2(f, 1, ones(m,n));
%1表示mn个样本中的第一个样本
%ones (m,n)创建了一个元素值为1,大小为mxn的矩阵,表明邻域内的所有样本都将用于计算。
则最大滤波器为:
g = ordfilt2(f, m*n, ones(m,n));
medfilt2
中值滤波器为:
g = ordfilt2(f, median(1:m*n),ones(m, n) )
%median (1 :m* n)简单地计算排序序列1,2, ... mun的中值。函数
median的通用语法为
V = median(A, dim)
%v是向量,它的元素是A沿着维数dim的中值
若dim=1,则v的每个元素就都是矩阵A中沿相应列的元素的中值。
实际中有二维中值滤波函数
g = medfilt2(f, [m n], padopt)
数组[m n] 定义了一个大小为m x n的邻域,中值就在该邻域上计算
padopt指定了三个可能的边界填充选项之一:
- ‘zeros’ (默认值)
- ‘symmetric’ f按照镜像反射方式对称地沿其边界扩展;
- ‘indexed’, 若f是double类图像,则以1来填充图像,否则以0来填充图像
该函数的默认形式为
g = medfilt2(f)
它使用一个大小为3 x 3的邻域来计算中值,并用0来填充输人图像的边界。
举例:
I = imread('stc.tif');
fn = imnoise(I, 'salt & pepper', 0.2);
gm = medfilt2(fn);
gms = medfilt2(fn, 'symmetric');
subplot(131)
imshow(I)
subplot(132)
imshow(gm)
subplot(133)
imshow(gms)
中值滤波可以很好的滤去椒盐噪声,可以看到下图的明显区别