五、数字图像处理之空间滤波

(一)说明:

邻域处理包括以下过程:
(1)选择中心点(x,y);
(2)仅对预定义的围绕点(x,y)的邻域内的像素执行运算;
(3)令运算结果为该点处邻域处理的响应;
(4)对图像上的每一点重复上述处理。
移动中心点会产生新的邻域,每个邻域对应输入图像上的一个像素。对邻域中像素的计算为线性的,则运算称为线性空间滤波(空间卷积);否则是非线性空间滤波。

(二)线性空间滤波

概念:
线性空间滤波可分为相关和卷积。相关是指模板w如图进行图像数组f的处理。卷积则是在w通过f之前先将它旋转180°。(过程如图所示)在这里插入图片描述

数学表达式:
相关:
在这里插入图片描述
卷积:
在这里插入图片描述

在matlab中用函数imfilter实现线性空间滤波:

g = imfilter(f,w,filtering_mode,boundary_options,size_options)  %f是输入图像,w是滤波模板,g是滤波结果
选项说明
滤波模式
‘corr’滤波通过使用相关来完成,这是默认值
‘conv’滤波通过卷积来完成
边界选项
P输入图像的边界通过用值P填充来扩展(没有任何引用);P的默认值是0
‘replicate’图像大小通过复制外边界的值来扩展
‘symmetric’图像大小通过沿自身的边界进行镜像映射扩展
‘circular’图像大小通过将图像作为二维周期函数的一个周期来扩展
大小选项
‘full’输出图像的大小与被扩展(填充)图像的大小相同
‘same’输出图像的大小与输入图像的大小相同,这可通过将滤波模板的中心点的偏移限制为原始图像中包含的点来实现,这是默认值

imfilter语法

g = imfilter(f,w,'replicate')    %最常用,用外边界扩展
g = imfilter(f,w,'conv','replicate')  
g = imfilter(f,rot(w,2),'replicate')  %以上两种用法都是执行卷积操作

使用说明:若f是整数数组,那么输出中超过整数类型范围的元素将被截去,小数部分会四舍五入。若结果要求更高的精度,则在使用imfilter之前通过函数im2single、im2double或tofloat将f转换为浮点数。

实验代码:

>> f = imread('Fig0216(a).tif');
w = ones(31);
w=w./(31*31);
subplot(231),imshow(f),title('原图像');
gd = imfilter(f,w);
subplot(232),imshow(gd,[]),title('默认值滤波后');
gr = imfilter(f,w,'replicate');
subplot(233),imshow(gr,[]),title('用外边界扩展后');
gs= imfilter(f,w,'symmetric');
subplot(234),imshow(gs,[]), title('用自身镜像扩展后');
gc= imfilter(f,w,'circular');
subplot(235),imshow(gc,[]), title('周期扩展后');
f8 = im2uint8(f);
g8r = imfilter(f8,w, 'replicate');
subplot(236),imshow(g8r,[]), title('转换uint8后再外边界扩展后');

实验结果:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
实验结论: 线性空间滤波后的图像黑白边缘被模糊了,用默认值滤波和二维周期函数的一个周期来扩展的图像,会产生黑色边缘,自身镜像和外边缘扩展不会产生黑色边缘。用几幅图来测试算法的稳定性,线性空间滤波后的图片均被模糊,可以适用于填补断裂的缝隙这类图像。

(三)非线性空间滤波

概念:
非线性空间滤波时基于涉及邻域像素内的非线性操作。为了执行非线性滤波操作,工具箱提供了两个函数:nlfiltercolfilt,nlfilter直接执行二维操作,colfilt按列组织数据。在大多数图像处理应用中,更多采用colfilt而不是nlfilter。

在matlab中用函数colfilt实现非线性空间滤波:

g = colfilt(f,[m n],'sliding',fun)  %m和n表示滤波区域的维数,'sliding'表明处理过程是m*n区域在输入图像f中逐像素进行滑动,fun是函数句柄

在使用colfilt之前需要对输入图像进行填充,我们需要用函数padarray,对于二维函数,语法为:

fp = padarray(f,[r c],method,direction) %f是输入图像,fp是输出图像,[r c]表示填充f的行列数
选项描述
方法
‘symmetric’通过镜像映射在图像边界的对面扩展图像尺寸
‘replicate’通过复制值在图像边界的外部扩展图像尺寸
‘circular’通过将图像处理成2D周期函数的一个周期来扩展图像尺寸
方向
‘pre’在每一维、第一个元素之前填充
‘post’在每一维、最后一个元素之后填充
‘both’在每一维、第一个元素之前和最后一个元素之后进行填充,这是默认值

实验一代码:

>> f = imread('Fig0217(a).tif');
gmean = @(A)prod(A,1).^1/size(A,1);
fp = padarray(f,[3 3], 'replicate');
g = colfilt(f,[3 3],'sliding', gmean);
subplot(211),imshow(f,[]), title(' 滤波前图像');
subplot(212),imshow(g,[]), title(' 滤波后图像');

实验一结果:

在这里插入图片描述

实验二代码:

f = imread('Fig0217(a).tif');
gmean = @(A)prod(A,1).^1/size(A,1);
fp = padarray(f,[3 2], 'replicate');
g = colfilt(f,[3 2],'sliding', gmean);
subplot(211),imshow(f,[]), title(' 滤波前图像');
subplot(212),imshow(g,[]), title(' 滤波后图像');

实验二结果:
在这里插入图片描述

实验三代码:

f = imread('Fig0217(a).tif');
gmean = @(A)prod(A,1).^1/size(A,1);
fp = padarray(f,[3 1], 'replicate');
g = colfilt(f,[3 1],'sliding', gmean);
subplot(211),imshow(f,[]), title(' 滤波前图像');
subplot(212),imshow(g,[]), title(' 滤波后图像');

实验三结果:
在这里插入图片描述

实验结论:
通过三个实验的对比,修改了滤波的维数,得到的滤波结果也会发生变化,随着列数的减少,滤波后的图像越清晰,细节会越多。

(四)图像处理工具箱中标准的空间滤波器

①线性空间滤波器
工具箱中支持一些预定义的二维线性空间滤波器,可通过函数fspecial实现,语法为:

w = fspecial('type',parameters) %’type’表示滤波器的类型,‘parameters’进一步定义指定的滤波器
类型语法及参数
‘average’fspecial(‘average’,[r c])是矩形平均滤波器,大小为rc,默认值是33。若用单个数代替[r c],则表示正方形滤波器
‘disk’fspecial(‘disk’,r) 为圆形平均滤波器(包括在边长为2*r+1大小的正方形内),半径为r。默认半径为5
‘gaussian’fspecial(‘gaussian’,[r c],sig)为大小为r×c的高斯低通滤波器,标准偏移为sig(正数)。默认值为3×3和0.5。若用一个数代替[r c],则表示正方形滤波器
‘laplacian’fspecial( ‘laplacian’,alpha)为3×3的拉普拉斯滤波器,形状决定于alpha——一个处于[0,1]范围内的数。alpha默认值是0.2
‘log’fspecial(‘log’,[r c],sig)是大小为r×c的高斯-拉普拉斯(LoG)滤波器,标准偏移为sig(正数)。默认值为5×5和0.5。若用一个数代替[r c],则表示正方形滤波器
‘motion’fspecial(‘motion’,len,theta)用于输出滤波器,当与一幅图像卷积时,len像素近似做线性运动(就好像照相机与景物的关系)。运动的方向为theta,以度数为单位度量,以水平线为参考逆时针转动。默认值为9和0,这代表的是沿水平方向做9个像素点的运动
‘prewitt’fspecial(‘prewitt’)输出大小为3×3的prewitt滤波器,wv近似于垂直梯度。水平梯度的滤波器可以通过置换结果wh=wv’来获得
‘sobel’fspecial(‘sobel’)输出大小为3×3的sobel滤波器,sv近似于垂直梯度。水平梯度的滤波器可以通过置换结果sh=sv’来得到
‘unsharp’fspecial(‘unsharp’)输出大小为3×3的非尖锐滤波器。alpha控制形状,必须是在[0,1]范围内,默认值为0.2

实验代码:

f = imread('Fig0217(a).tif');
w4 = fspecial('laplacian',0);
w8 = [1 1 1;1 -8 1;1 1 1];
f = tofloat(f);
g4 = f-imfilter(f,w4, 'replicate');
g8 = f-imfilter(f,w8, 'replicate');
subplot(221),imshow(f), title('原图像');
subplot(222),imshow(g4), title('中心点为-4拉普拉斯增强的图像');
subplot(223),imshow(g8), title('中心点为-8拉普拉斯增强图像');

实验结果:
在这里插入图片描述

在这里插入图片描述
实验结论:
通过线性滤波器,中心点为-8的拉普拉斯滤波器更加突出细节,更清晰一点。中心点为-4的拉普拉斯滤波器也增强了细节部分,都比原图像更加清楚。更换不同的图片,也能得到相同的结论,证明此算法是具有稳定性的。

②非线性空间滤波器
工具箱中用函数ordfilt2计算统计排序滤波器,这些非线性空间滤波器,它们的响应基于图像邻域中的像素序列,并且邻域中心像素的值被由邻域序列的排序结果决定的值代替。

基本语法为:

g = ordfilt2(f,order,domain) 
%用邻域排序集合中的第order个元素去替代f中的每个元素以生成输出图像g,邻域由domain内的非零元素指定。

其他语法:

g = ordfilt2(f,1,ones(m,n))   %最小滤波器
g = ordfilt2(f,m*n,ones(m,n))  %最大滤波器
g = ordfilt2(f,(m*n+1)/2,ones(m,n))  %中值滤波器
g = medfilt2(f,[m n],padopt)  %专用二维中值滤波器

其中,padopt规定了三个可能的边缘填充选项之一:‘zeros’(默认值);‘symmetric’,指出f按照镜像反射方式对称地沿边缘扩展;‘indexed’,表示如果f属于double类,用1填充,否则用0填充。默认形式为:

g = medfilt2(f) 

实验代码:

f = imread('Fig0219(a).tif ');
fn = imnoise(f, 'salt & pepper',0.2);
gm = medfilt2(fn);
gms = medfilt2(fn, 'symmetric');
subplot(221),imshow(f), title('原图像');
subplot(222),imshow(fn), title('有椒盐噪声的图像');
subplot(223),imshow(gm), title('中值滤波器默认值后的图像');
subplot(224),imshow(gms), title('中值滤波器symmetric后的图像');

实验结果:

在这里插入图片描述

在这里插入图片描述
实验结论:
中值滤波器能够很好的滤除椒盐噪声,基本完全还原原图像。提出一个在实验过程中出现的问题, 'salt & pepper’中的&前后分别有一个空格,不然会出错。

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值