数字图像处理第二章---空间滤波

(四)空间滤波

邻域处理包含以下过程:
(1)选择中心点(x,y);。
(2)仅对预定义的围绕点(x,y)的邻域内的像素执行运算。
(3)令运算结果为该点处领域处理的响应。
(4)对图像上的每一点重复上述处理。

移动中心点会产生新的邻域,每个邻域对应输入图像上的一个像素。若对邻域中像素的计算为线性的,则运算称为线性空间滤波(也使用术语“空间卷积”);否则称此运算为非线性空间滤波。

2.4.1线性空间滤波

线性空间滤波的机理:在图像/中逐点移动滤波模板w的中心点。 在每个点(x,y)处,滤波器在该点处的响应是由滤波模板限定的相应邻域像素与滤波器系数的乘积结果的累加和。

举例:
一维函数 f = 0,0,0,1,0,0,0,0
模板 w = 1,2,3,2,0
第一步:扩充0,使得模板有对应元素,得 f = 0,0,0,0,0,0,0,1,0,0,0,0
第二步:w与函数f左侧第一个元素对应
0,0,0,0,0,0,0,1,0,0,0,0
1,2,3,2,0
乘积累加10+20+30+20+00=0
第三步右移
0,0,0,0,0,0,0,1,0,0,0,0
#,1,2,3,2,0 (#表示空白)
乘积累加1
0+20+30+20+00=0
以此类推。
对比二维函数模板从左到右,从上到下。
在这里插入图片描述
(a)为f与模板w。(b)为扩充0之后的f。©为初始位置。(d)为依次移动之后的结果。
注:若模板w翻转180o,则为卷积。其结果也是翻转180o。值得注意的是若函数f是对称的,则相关与卷积产生的结果是相同的。

工具箱使用函数 imfilter 来实现线性空间滤波,该函数的语法如下:

g = imfilter( f, w, filtering_mode, boundary_options, size options)

其中,f 是输入图像,w 为滤波模板,g 为滤波结果;对于相关, 将 Filtering_mode 指定为 ‘corr’(这是默认值);对于卷积,将它指定为boundary_options 用于处理边界填充问题,边界的大小由滤波器的大小确定。 size_options 可以是’same’ 或’full’。

函数imfilter应用示例代码:

>> f = imread('bw.jpg');
>> g = rgb2gray(f);  %将图像转为灰度图像
>> d = im2double(g);   %将图像转为double类型
>> w = ones(31);    %设置一个31*31大小的滤波器
>> gd = imfilter(d,w);    %线性空间滤波处理
>> subplot(1,2,1),imshow(f),title('原图');
>> subplot(1,2,2),imshow(gd),title('31*31线性滤波图');
>> 

在这里插入图片描述
可以很明显的看出黑白色块的边缘被模糊。现在设置一个10*10的滤波模板进行对比

>> w1 = ones(10);
>> gd1 = imfilter(d,w1);
>> figure
>> imshow(gd1);

在这里插入图片描述
对比 31* 31的与10*10的可看出,滤波模板越大模糊的范围就越大。

用滤波器 w 对图像进行卷积以产生模糊结果。因为滤波器是对称的,所以可以使用默认的 imfilter做相关操作。在这里我们使用默认的边界选项,用 0值对图像边界进行填充。就像我们期望的那样,滤 波后,图像中的黑白边缘被模糊了,但只是出现在图像较亮的部分以及边缘之间的边上。当然, 原因是填充的边界为黑色。我们可以通过使用 replicate选项来解决这个困难:

>> gr = imfilter(f,w,'replicate');
>> subplot(1,3,1),imshow(f),title('原图');
>> subplot(1,3,2),imshow(gd),title('31*31线性滤波图');
>> subplot(1,3,3),imshow(gr),title('使用replicate');  
>> 

在这里插入图片描述
下面测试symmetric’,与circular对图像的影响:

>> gs = imfilter(f,w,'symmetric');
>> gc = imfilter(f,w,'circular');
>> subplot(1,2,1),imshow(gs),title('symmetric');
>> subplot(1,2,2),imshow(gc),title('circular');
>> 

在这里插入图片描述
显示出了与使用 0填充同样的问题。这也是我们料想到的, 因为周期性的使用使得图像的黑暗部分邻近光亮区域。最后,使用 imfilter 产生与输入相同类型的结果,如果处理不当,将会产生很大的问题:

>> f8 = im2uint8(f);
>> g8r = imfilter(f8,w,'replicate');
>> imshow(g8r)

在这里插入图片描述
在这种情况下,当输出通过 imfilter 转换为与输入相同的类型(uint8) 时,由于裁剪会引起数据丢失。原因是模板的系数不是在范围[0,1]内求和, 从而引起滤波后的结果超过范围[0,255]。

小结:对于imfilter函数里使用什么参数主要取决于对图像处理之后边界的模糊是否满足需求,如symmetric的边界与circular的边界对比就会发现circular边界的黑色变为了白色,这是因为图像边界填充的是0值的原因。

2.4.2非线性空间滤波

非线性空间滤波也基于邻域操作。然而,线性空间滤波基于计算乘积和(即线性操作),顾名思义, 而非线性空间滤波基于涉及邻域像素内的非线性操作。另一个基本的区别是:模板的概念在非线性处理 中不是那么普遍。滤波的概念仍然是存在的,但是“滤波器”应想象为邻域像素操作的非线性函数,这些响应构成了非线性操作的结果。

为了执行通常的非线性滤波操作,工具箱提供了两个函数:nlfilter 和 colfilt。nlfilter 直接执行二维操作,而 colfilt 按列组织数据。虽然 colfilt 需要占用更多的内存,但是执行起来要比 nlfilter 快得多。在大多数图像处理应用中,速度是最重要的因素。 因此,在执行通常的非线性空间滤波时,更多的是采用 colfilt 而不是 nlfilter。

函数 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的行数和列数

如果在参数中不包括 direction, 那么默认值为 Both。如果不包含 method,将默认用 0 填充。

示例代码:

>> f = imread('atg.jpg');
>> g= rgb2gray(f);
>> h = uint8(colfilt(g,[3 5],'sliding',@mean));
>> subplot(1,2,1),imshow(f),title('原图');
>> subplot(1,2,2),imshow(h),title('完成图');

在这里插入图片描述
小结:彩色图像要转换为灰度图像,因为彩色图像(RGB)是三维数组,而colfilt函数处理的是 二维数组。fun为函数句柄,也就是你要执行的非线性滤波的方式,fun可以是求邻域内像素的最大值,或者最小值等等非线性操作。上述求的事平均值。colfilt函数存在固有滤波边缘问题,所以必须要扩充(padarray)

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

5.1线性空间滤波器

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

w = fspecial(type, parameters)        % type表示滤波器的类型,parameters进一步定义指定的滤波器。

利用拉普拉斯滤波器对图像进行增强处理使图像锐化,同时要尽可能保留图像的灰度层次。示例代码如下:

>> f = imread('zc.jpg');
>> wl = fspecial('laplacian',0);    %设置一个 拉普拉斯滤波器
>> wd = fspecial('disk',7);         %圆形滤波器
>> fd = im2double(f);              %将f转为浮点数
>> gl = imfilter(f,wl,'replicate');   %使用拉普拉斯滤波器处理
>> gd = imfilter(f,wd,'replicate');   %使用圆形滤波器处理   uint8型
>> dl = imfilter(fd,wl,'replicate');   %使用拉普拉斯滤滤波器处理   double型
>> dd = imfilter(fd,wl,'replicate');   %使用圆形滤波器处理   double型
>> subplot(2,3,1);imshow(f);title('原图');
>> subplot(2,3,2);imshow(gl);title('使用拉普拉斯滤波器处理,uint8型');
>> subplot(2,3,3);imshow(gd);title('使用圆形滤波器处理   uint8型');
>> subplot(2,3,4);imshow(dl);title('使用拉普拉斯滤滤波器处理   double型');
>> subplot(2,3,5);imshow(dd);title('使用圆形滤波器处理   double型');
>>> g = fd-dl;
>>> subplot(2,3,6);imshow(g);title('从原始图像中减去拉普拉斯图像以恢复失去的灰度层次');
>> 

在这里插入图片描述

5.2非线性空间滤波器

非线性空间滤波器,它们的响应基于图像邻域中的像素序列, 并且邻域中心像素的值被由邻域序列的排序结果决定的值代替。

函数 ordfilt2 的语法为:

g = ordfilt2(f, order, domain)

这个函数用邻域排序集合中的第 order 个元素去替代 f 中的每个元素以生成输出图像 g,邻域由 domain 内的非零元素指定。在这里,domain 是 由 0 和1 组 成 的 大 小 的 矩 阵,这个矩阵规定了在计算中使用的邻域中像素点的位置。在这种情况下,domain 的作用类似于逻辑模板。邻域中对应 domain 矩阵中为 0 的像素不用于计算。
示例代码:

>> f= imread('atg.jpg');
>> f1 = rgb2gray(f);
>> g = ordfilt2(f1,4,ones(3,3));
>> subplot(1,2,1);imshow(f);title('原图');
>> subplot(1,2,2);imshow(g);title('非线性滤波器');
>> 

在这里插入图片描述

(六) 嵌套函数

嵌套函数基本语法:

function [outputs1] = outer_function(arguments1)
statements
    function [outputs2] = inner_(argumengts2)
        statements
    end
statements

end

在嵌套函数中使用或定义的变量驻留在最外层函数的工作空间中,最外层函数包含嵌套函数,并且可以访问变量。
示例:

function y = tax(income)
adjusted_income = income - 6000
y = compute_tax
    function y =compute_tax 
        y = 0.28 * adjusted_income;
    end
end

变量 adjusted_income 出现在嵌套函数 compute_tax 中,它还出现在封装函数 tax中。因此,两个 adjusted_income 实例指向同一变量。

示例:

function mu = triangmf(z,a,b,c)
mu = zeros(size(z));
low_side = (a <= z) & (z < b);
high_side = (b <= z)& (z < c);
mu(low_side) = (z(low_side) - a) ./ (b-a);
mu(high_side) = 1 - (z(high_side)-b) ./(c - b);

end
function mu = sigmamf(z,a,b)
mu = trapezmf(z,a,b,Inf,Inf);

>> ulow = @(z) 1- sigmamf(z,0.27,0.47);
>> umid = @(z) triangmf(z,0.24,0.50,0.74);
>> uhigh = @(z) sigmamf(z,0.53,0.73);
>> fplot(ulow,[0 1],20);
> fplot(umid,[0 1],'-.',20);

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值