数字图像处理(一):线性空间滤波

一、基本概念

领域处理

邻域处理的步骤:
(1) 选取中心点(x,y)
(2) 仅对预先定义的关于点(x,y) 的邻域内的像素执行操作
(3) 令运算结果为该点处处理的响应
(4) 对图像中的每一点重复此步骤。
这个过程中,移动中心点会产生新的邻域,而每个邻域对应于输入图像上的一个像素。

若对邻域中像素的计算为线性运算时,则此运算称为线性空间滤波 (也称为空间卷积);否则,称此运算为非线性空间滤波。

本章所关注的线性运算包括将邻域中每个像素与相应的系数相乘,然后将结果进行累加,从而得到点(x,y)处的响应。
若邻域的大小为 m x n ,则总共需要 mn 个系数。这些系数排列为一个矩阵,称其为滤波器、掩膜、滤波模板、核、模板或窗口等术语

相关与卷积

相关:如图,模板w按照图示方式在图像移动的过程
卷积:从技术上讲,卷积是相同的过程,只是在图像 f 中移动 w 前,要将w旋转180度

full same

‘full’:充零后,计算结果为f和w对齐后的乘积累加和
‘same’:起始点位于掩膜的中心点,结束点是f的最后一点与掩膜中心点对齐

二、函数imfilter

工具箱使用函数 imfilter 来实现线性空间滤波
函数语法:g = imfilter(f,w,filtering_mode,boundary_options,size_options)
其中,f 是输入图像,w 为滤波模板,g 为滤波过滤后的结果,其他参数如下表:
在这里插入图片描述
函数imfilter的最常见语法:g = imfilter(f,w,'replicate'),当在工具箱中实现标准的线性空间滤波时,使用这一语法。

在使用预先旋转的滤波器或对称的滤波器时,希望进行卷积计算,有两种方法:
(1)使用语法: g = imfilter(f,w,'conv','replicate')
(2)使用 函数rot90(w,2) 将w旋转180度,然后使用 g = imfilter(f,w,,'replicate'),也可以合二为一: g = imfilter(f,rot90(w,2),'replicate') ,结果将是一幅大小和输入相同的图像 g (即‘same’模式)

rot90(f,k):将 w 旋转 k*90度,其中 k 是一个整数
一幅double类图像f,大小为512 × 512像素。考虑一个大小为31 × 31的简单滤波器

>> f = imread('imfilter.tif');
% 为了达到更高的精度,使用imfilter之前,使用函数 im2double() 将f转换为浮点型
>> fd = im2double(f);
% 得到一个 31 x 31 的滤波器
>> w = ones(31);
% 如果滤波器关于中心对称,相关和卷积完成滤波产生相同的结果
>> gd = imfilter(fd,w);
>> imshow(fd),figure,imshow(gd,[])

(一)默认选项

在这里插入图片描述
这里使用默认的边界选项,即用黑色(0)对图像边界进行填充。结果滤波后图像中黑白边缘被模糊化了,但是只出现在图像较亮的部分与边界之间的边缘上,原因在于填充的边界是黑色的

(二)replicate选项

% 使用选项 replicate ,图像的大小通过复制图像边界外的值来扩展
>> gr = imfilter(fd,w,'replicate');
>> figure,imshow(gr,[])

% 使用选项 'symmetric' 达到同样的效果
>> gs = imfilter(fd,w,'symmetric');
>> figure,imshow(gs,[])

在这里插入图片描述

(三)circular选项

与零填充一样,因为周期性的使用可使得图像的黑暗部分邻近明亮区域

>> gc = imfilter(fd,w,'circular');
>> figure,imshow(gc,[])

在这里插入图片描述

(四)可能的问题

filter与输入图像有相同类

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

在这里插入图片描述
由图可看到,但输出通过 imfilter 转换为输入相同的类(uint8)时,裁剪会引起数据丢失。
原因:模板的系数不在范围[0,1]内求和,从而引起滤波后的结果超出范围[0,255]。
解决办法:(1)归一化滤波器系数,使得系数的和在[0,1]内;(2)f转换为double或者single输入

附录 如何将一个矩阵归一化到 [0,1]

很简单,用函数mapminmax,文档太长我就不翻译了,只提醒几个关键 1: 默认的map范围是[-1, 1],所以如果需要[0,
1],则按这样的格式提供参数: MappedData = mapminmax(OriginalData, 0, 1); 2
只按行归一化,如果是矩阵,则每行各自归一化,如果需要对整个矩阵归一化,用如下方法: FlattenedData =
OriginalData(😃’; % 展开矩阵为一列,然后转置为一行。 MappedFlattened =
mapminmax(FlattenedData, 0, 1); % 归一化。 MappedData =
reshape(MappedFlattened, size(OriginalData)); %
还原为原始矩阵形式。此处不需转置回去,因为reshape恰好是按列重新排序

法二:X-X平均/(Xmax-Xmin);但是这样的结果在[-1,1]之间 X
-XMin/(Xmax-Xmin);这个就在[0,1]之间了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值