图像处理学习笔记07:空间滤波

线性空间滤波

空间滤波不同于灰度变换,空间滤波是用一个掩模依次处理每一个像素,输出图像的结果不只是由原来对应位置的像素值确定,而是由掩模范围内的元素值共同作用。
matlab使用imfilter函数实现线性空间滤波g=imfilter(f,w,filtering_mode,boundary_options,size_options)
f是输入图像,w是滤波模板,g是滤波结果。

  • filtering_mode为滤波模式,对于相关,指定为’corr’;对于卷积,指定为’conv’
  • boundary_options为边界选项,用于处理边界填充问题,边界的大小由滤波器的大小确定。
  • size_options为大小选项,可以是’same’或’full’

使用既非预先旋转,又非对称滤波掩模时,只希望执行卷积可以用g=imfilter(f,w,'conv','replicate')
或者g=imfilter(f,rot90(w,2),'replicate').
例 函数imfilter的应用

clear;
clc;
f=imread('Fig0216(a).tif');
f=im2double(f);%512x512unit8类型图像转化为double类型,得到的结果精度更高
figure;
subplot(2,3,1);
imshow(f,[]);
w=ones(31);%采用31x31的滤波器
gd=imfilter(f,w);%使用了默认的边界选项,用0对边界进行填充,处理后图像灰白边缘被模糊,且图像边缘出现黑框
subplot(2,3,2);
imshow(gd,[]);
gr=imfilter(f,w,'replicate');%图像的大小通过复制外边界的值来扩展
subplot(2,3,3);
imshow(gr,[]);
gs=imfilter(f,w,'symmetric');%图像大小通过沿自身的边界进行镜像映射扩展
subplot(2,3,4);
imshow(gs,[]);
gc=imfilter(f,w,'circular');%图像的大小通过将图像作为二维周期函数的一个周期来扩展
subplot(2,3,5);
imshow(gc,[]);
f8=im2uint8(f);
g8r=imfilter(f8,w,'replicate');%裁剪发生数据丢失,输出超过整型类型的范围的元素将被截去,小数部分四舍五入。
subplot(2,3,6);
imshow(g8r,[]);
线性空间滤波器

matlab支持一些预定义的二维空间滤波器,可以通过fspecial函数实现,生成滤波掩模w。语法形式w=fspecial('type',parameters)type表示滤波器的类型,parameters进一步定义指定的滤波器。
例 采用中心为-4的拉普拉斯滤波器处理图像

clear;clc;
f=imread("Fig0217(a).tif");
figure;
subplot(2,2,1);
imshow(f);
w=fspecial('laplacian',0);%拉普拉斯滤波器
g1=imfilter(f,w,'replicate');%使用nuit8格式的拉普拉斯滤波后的图像,因为unit8为无符号类型,所以输出的负值剪切为0
subplot(2,2,2);
imshow(g1,[]);
f2=tofloat(f);%将f转化为浮点型数据
g2=imfilter(f2,w,'replicate');%使用浮点型的图像进行拉普拉斯滤波
subplot(2,2,3);
imshow(g2,[]);
g=f2-g2;%增强图像,在原图像中减去中心为-4的滤波结果
subplot(2,2,4);
imshow(g);

运行结果
在这里插入图片描述
例 中心为-8的拉普拉斯滤波器(手动构造)与中心-4的拉普拉斯滤波器(调用fspeial函数)处理图像对比。

clear;clc;
f=imread("Fig0217(a).tif");
f2=tofloat(f);%将f转化为浮点型数据
figure;
subplot(1,3,1);
imshow(f);
w4=fspecial('laplacian',0);%拉普拉斯滤波器
w8=[1 1 1;1 -8 1;1 1 1];
g4=f2-imfilter(f2,w4,'replicate');
g8=f2-imfilter(f2,w8,'replicate');
subplot(1,3,2);imshow(g4);
subplot(1,3,3);imshow(g8);

在这里插入图片描述

非线性空间滤波

非线性空间滤波器的响应基于图像领域中的像素序列,并且邻域中心像素的值被由领域序列的排序结果决定的值代替。
ordfilt2函数可以产生非线性空间滤波器。语法形式g=ordfilt2(f,order,domain)这个函数用领域排序中第order个像素值代替原像素值,从而产生图像g。邻域由domain内的非零元素指定。domain是一个有0和1组成的mxn的矩阵,这矩阵规定了在计算中使用的邻域中像素点的位置。统计学中有最小滤波器和最大滤波器,他们的order的值分别取1和mxn。最为常见的是中值滤波器g=ordfilt2(f,(m*n+1)/2,ones(m,n)),由于实践中非常重要,所以还提供有专门的中值滤波器函数medfilt2,语法形式g=medfilt2(f,[m n],padopt)数组[m n]定义了用于计算中值得尺寸mxn的邻域。padopt规定了三个可能的边缘填充项。

  • zeros(默认值)
  • symmetric指出f按照镜像反射方式对称地沿边缘扩展
  • indexed 如果f属于double类,用1填充,否则用0填充。

例 使用中值滤波处理椒盐噪音

clear;clc;
f=imread("Fig0219(a).tif");
fn=imnoise(f,'salt & pepper',0.2);%附加椒盐噪音
gm=medfilt2(fn);%对带噪音图像进行中值滤波处理
gms=medfilt2(fn,'symmetric');%指出原图像按照镜面反射方式对称地沿边缘扩展。
figure;
subplot(2,2,1);imshow(f);
subplot(2,2,2);imshow(fn);
subplot(2,2,3);imshow(gm);
subplot(2,2,4);imshow(gms);

在这里插入图片描述
由于3图默认采用0填充边界,所以边界处存在小黑点,故选择symmetric来减弱,除此之外3图4图效果基本一致。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值