3.4 空间滤波
邻域处理:(1)选取中心点(x,y);(2)仅对预先定义的关于点(x,y)的领域内的像素执行操作;(3)令运算结果为该点处的响应;(4)对图像中的每一点重复该处理
若对领域中像素执行的计算为线性的,则称该操作为线性空间滤波,否则称为非线性空间滤波。
3.4.1线性空间滤波
线性空间滤波的过程:图像 f f f中驻点移动滤波模板 w w w的中心组成。在每个点(x,y)处,滤波器在该点的响应是由限定的相应领域像素与滤波器系数乘积结果的累加和。
工具箱使用函数imfilter
来实现线性空间滤波:
g = imfilter(f, w, filtering_mode, boundary_options, size_options)
f
为输入图像,w
为滤波模板,g
为滤波后的结果,filtering_mode
为滤波模式,boundary_options
为边界选项,size_options
为大小选项。
imfilter
最常用语法是
g = imfilter(f, w, 'replicate')
'replicate'
代表图像的大小通过复制图像边界外的值来扩展
imfilter
会将输出图像转换为与输入图像相同的类。因此,如果f
是一个整数数组,则输出元素中超过整数类型范围的将被截去,小数部分四舍五入。
% f = imread('characters.tif');
% 生成一个格子图
f = 256 * ones(256,256);
f(1:128,1:128) = 0;
f(128:256,128:256) = 0;
subplot(3,1,1);
imshow(f,[ ]);
% 考虑一个31×31的滤波器
w = ones(31);
% 滤波器w在与衣服图像进行卷积会产生模糊的结果
gd = imfilter(f,w);
subplot(3,1,2)
imshow(gd ,[ ]) ;
% 滤波后的图像中黑白边缘被模糊了,但只出现在图像较亮部分与边界之间的边缘上。
% 原因在于填充的边界是黑色的。
% 'replicate',图像的大小通过复制图像边界外的值来扩展。
gr = imfilter(f,w,'replicate');
subplot(3,1,3)
imshow(gr,[ ]);
3.4.2 非线性空间滤波
模板的概念在非线性处理中不是那么普遍。滤波的概念仍然存在,但"滤波器"视为对一个邻域的像素进行操作的非线性函数,其相应构成非线性操作的结果。
matlab提供两个函数来执行常见的非线性滤波:nlfilter
和colfilt
。前者直接执行二维操作,而colfilt
需要占用更多的内存,但执行起来要比nlfilter
快得多。
函数confilt
的语法为
g = colfilt(f, [m n], 'sliding', fun)
在使用confilt
时,滤波前必须显式地填充输入图像,使用二维函数padarray
,其语法为
fp = padarray(f, [r c], method, direction)
注:这里colfilt
程序没有运行成功
3.5 图像处理工具箱的标准空间滤波器
3.5.1 线性空间滤波器
w = fspecial('type',parmeters)
type
指定滤波器的类型,parmeters
进一步定义规定的滤波器。
clear;clc
f = imread('blurry_moon.tif');
subplot(2,2,1)
imshow(f,[ ])
title('原图')
w = fspecial('laplacian',0);
g1 = imfilter(f, w, 'replicate');
subplot(2,2,2)
imshow(g1,[ ])
title('unit8格式')
%imfilter给出了与输入图像类相同的输出,负值被截掉。
%我们希望得到一个带有正值和负值的拉普拉斯图像。
%对图像f滤波前,将其转换为浮点数可解决这一问题。
f2 = tofloat(f);
g2 = imfilter(f2, w, 'replicate');
subplot(2,2,3)
imshow(g2,[ ])
title('浮点格式')
g = f2 - g2;
subplot(2,2,4)
imshow(g,[ ])
title('原图减去浮点格式')
3.5.2 非线性空间滤波器
函数ordfilt2
计算统计排序滤波器。这些滤波器是非线性空间滤波器,它们的响应基于对图像邻域中所包含像素的排序,然后使用排序结果确定的值替换邻域中的中心像素值。
函数ordfilt2
的语法为
g = ordfilt2(f,order,domain)
该函数通过使用邻域的排序集合中的第order
个元素去替代f中的每个元素,来输出图像g
,其中邻域由domain
内的非零元素指定。
MATLAB提供了二维中值滤波器的一个专用实现:
g = medfilt(f,[m n],padopt)
padpot
指定三个可能的边界填充项之一。
f = imread('left.tif');
subplot(1,4,1)
imshow(f)
title('原图')
fn = imnoise(f, 'salt & pepper', 0.2);
subplot(1,4,2)
imshow(fn)
title('被椒盐噪声污染')
gm = medfilt2(fn);
subplot(1,4,3)
imshow(gm)
title('medfilt默认')
gms = medfilt2(fn, 'symmetric');
subplot(1,4,4)
imshow(gms)
title('medfilt symmetric')