文章目录:
3.1 卷积与线性移不变系统
3.1.1 空域滤波
1)在空域滤波中,输出图像中的每个输出像素值直接通过对输入图像同位置以及周围邻域内像素的简单计算得到的
2)空间滤波可以是线性的,也可以是非线性的。
3)线性滤波应用更为广泛,主要通过卷积运算来实现
4)空域线性滤波
(1)一般来说,一幅大小为 M × N 的图像被一个尺寸为 m × n 的滤波器滤波可以通过下面的计算来获得
(2)这个概念叫做卷积。滤波器掩码有时被称为卷积掩码或卷积核。
5)平滑线性滤波器举例:盒式滤波器和加权均值滤波器
3.1.2 卷积与相关
1)进行空域线性过滤时,必须清楚地理解两个密切相关的概念:相关与卷积。
2)无论是相关还是卷积,都是两个函数进行运算,运算的结果产生一个新的函数。
3)具体地,两者数学上的定义如下:
(1)相关:
(2)卷积:
4)对应地,在工程信号处理领域常采用它们的离散形式
(1)相关:
(2)卷积:
5)卷积的运算过程:
6)卷积的性质:
(1)交换性
(2)结合性
(3)分配性
7)一维卷积和相关的例子:
8)二维卷积与相关的例子
3.1.3 线性移不变系统
1)线性系统 H
(1)可叠加性:
(2)伸缩性:
2)移不变系统 H
(1)移不变性:若 H[ f (x , y ) ]= g (x , y ) ,则 H[ f (x -a , y -b) ]= g (x -a , y -b)
(2)对于一个线性移不变系统来说,它的单位脉冲响应刻画了该系统的响应特性。换句话说,一旦我知道了该系统的单位脉冲响应,我就能推断出该系统对任何输入的响应。
(3)卷积是用于计算线性移不变系统输入与输出的数学模型。具体地,若我们知道该系统的单位脉冲响应 h (x , y ), 则该系统的输入 f (x , y ) 与输出 g(x , y ) 之间可以用下式来表达:
3.2 空域滤波器介绍
3.2.1 空域线性滤波器的matlab实现
1) 工具箱使用函数imfilter实现线性空间滤波,其语法如下:
g = imfilter(f, w, filtering_mode,boundary_options,size_options)
其中f为输入图像,w为滤波掩模,g为滤波结果,其他参数如表所示。
2)在计算过滤后图像的每个像素时,系统都使用双精度浮点运算,最后imfilter会将输出图像转换为与输入图像相同的类。因此,如果输入是整数数组,那么超过整数类型范围的输出像素值将被截断,小数值将被四舍五入。如果希望结果更精确,那么应该在使用imfilter之前使用 im2double 或 double 转换为 double 类。
3)举例1:
f = imread('Fig0315(a)(original_test_pattern).tif');
f = double(f);
w = ones(31);
g1 = imfilter(f,w);
g2 = imfilter(f,w,'replicate');
g3 = imfilter(f,w,'circular');
subplot(2,2,1);imshow(f);
subplot(2,2,2);imshow(g1,[]);
subplot(2,2,3);imshow(g2,[]);
subplot(2,2,4);imshow(g3,[]);
3.2.2 非线性空域滤波
1)非线性滤波通常也使用邻域,但使用其他一些数学运算。例如,让每个中心点的响应等于其邻域内的最大像素值便是一种非线性滤波操作。
2)工具箱提供了两个用于执行一般非线性滤波的函数:nlfilter和colfilt。
(1)前者直接在二维空间中执行操作。使用命令open nlfilteropen查看源代码。
(2)colfilt以列的形式组织数据。需要更多内存,但执行速度明显快于nlfilter。给定一个尺寸 M × N的输入图像f, 和一个大小 m x n 的邻域, colfilt函数生成矩阵,称之为 A , 其最大的大小为 mn × MN
(3)每一列对应于图像中以一个位置为中心的邻域所包含的像素。
(4)例如,第一列对应的是当它的中心位于f的顶部最左边的点时,邻域所包含的像素。
3)函数colfilt的语法是:
g = colfilt(f, [m n], ’sliding’, @fun, parameters)
(1)其中,m 和n为滤波区域的尺寸
(2)“滑动”是指在输入图像f中将区域从一个像素滑动到另一个像素的
过程
(3)@fun 引用一个函数,我们将其任意表示为fun,参数表示fun函数可能需要的参数(用逗号分隔)。
(4)由于矩阵A的组织方式,函数fun必须单独操作A的每一列,并返回一个行向量 g ,其中包含所有列的结果。
(5)g 的第 k 个元素是fun对A的第 k 列执行的操作的结果。
4)当使用colfilt时,在过滤之前必须显式填充输入图像。为此,我们使用函数padarray ,对于二维函数,它有这样的语法:
fp = padarray(f,[r c],method,direction)
其中输入图像为f,填充图像为fp, [r c]给出填充f的行数和列数,方法和方向如表所示。
5)MatLab预定义的典型空域滤波器
(1)工具箱支持许多预定义的二维线性空域滤波器,这些滤波器通过使用函数fspecial获得,fspecial使用如下语法生成一个滤波器掩码 w(模板)
w =fspecial(’type’, parameters)
其中“type”指定筛选器类型,参数进一步定义指定的筛选器。
6)锐化空域滤波器
(1) 锐化的主要目标是突出图像中的细节,或者增强模糊的细节。
(2)锐化通常是通过空间差分来完成的。
(3)数字函数的导数是用差分来定义的。
(4)对于一阶导数,我们要求它必须满足:
• 平面段必须为零(灰度值恒定的区域)
• 在灰度阶跃或斜坡开始时必须非零
• 斜坡上一定是非零
(5)对于二阶导数,我们要求它必须满足:
• 在平坦段(灰度值恒定的区域)中必须为零。
• 在灰度级阶跃或斜坡的开始和结束时,必须是非零的。
• 在坡度恒定的斜坡上必须为零。
(6)一维函数 f (x) 一阶导数的一个基本定义就是差分
(7)同样我们定义二阶导数为
3.2.3 拉普拉斯滤波器
1)拉普拉斯算子定义为:
2) 函数 fspecial(‘ laplacian‘ , alpha) 实现了一个更通用的laplacian掩码:
3)拉普拉斯滤波器进行图像增强
(1)现在我们使用拉普拉斯变换对图3.16(a)中的图像进行增强。这是一张月球北极的模糊图像。在这种情况下,增强包括锐化图像,同时保留尽可能多的灰度级。
(2)示例:增强问题通常需要对工具箱中可用的滤波器外进行重新定义新的滤波器。拉普拉斯算子就是一个很好的例子。工具箱支持一个3×3拉普拉斯算子以−4为滤波器中心。正如前面所讨论的,通常可构造使用一个3×3拉普拉斯算子过滤器(−8在中间,周围是1)来获得更好的锐化增强效果。
f = imread('Fig0316(a)(moon).tif');
w4 = fspecial('laplacian',0);
w8 = [1 1 1;1 -8 1;1 1 1];
f = im2double(f);
g4 = f - imfilter(f,w4,'replicate');
g8 = f - imfilter(f,w8,'replicate');
subplot(1,3,1);imshow(f,[]);
subplot(1,3,2);imshow(g4,[]);
subplot(1,3,3);imshow(g8,[]);
(3)拉普拉斯滤波器可简化为
(4)简化后的示例:
f = imread('Fig0316(a)(moon).tif');
w4 = [0 -1 0;-1 5 -1;0 -1 0];
w8 = [-1 -1 -1;-1 9 -1;-1 -1 -1];
f = im2double(f);
g4 = imfilter(f,w4,'replicate');
g8 = imfilter(f,w8,'replicate');
subplot(1,3,1);imshow(f,[]);
subplot(1,3,2);imshow(g4,[]);
subplot(1,3,3);imshow(g8,[]);
4)反锐化掩模和高提升滤波
(1)反锐化掩模是通过从图像本身减去图像的模糊版本来实现的,即:
f(x,y)表示锐化后的图像, 表示是原图 像 的一个模糊版本
(2)对非锐化掩蔽的一种轻微推广称为高提升滤波,高提升滤波图像 定义为:
(3)进一步,我们可以得到
(4)如果我们用拉普拉斯算子来计算:
5)用梯度进行图像增强
6)在IPT中生成非线性空间滤波器的常用工具是函数ordfilt2,它用于生成阶序统计滤波器。
(1)函数ordfilt2的语法是:
g = ordfilt2 (f, order, domain)
(2)该函数通过将 f 的每个元素替换为域内非零元素指定的已排序邻居集中的第1个元素来创建输出图像 g 。
(3)例如,要实现一个大小 m×n 的最小值,最大值,中值滤波器,我们使用语句:
g = ordfilt2(f, 1, ones(m,n))
g = ordfilt2(f, m*n, ones(m,n))
g = ordfilt2(f, median(1:m*n), ones(m,n))
3.2.3 中值滤波器
1)数字图像处理中最著名的阶序统计滤波器是中值滤波器
2)由于它的实际重要性,工具箱提供了一个二维中值过滤器的专门实现:
g = medfilt2(f, [m n],padopt)
其中元组[m,n]定义了一个大小为m×n的邻域,在该邻域上计算中值,padopt指定三种可能的边界填充选项之一:‘零’(默认),‘对称’,其中f由对称扩展镜像反射它的边界,‘索引’,其中如果它是类double f填充1s,否则为0。
3)中值滤波是减少图像中椒盐噪声的有用工具。
4)示例:
f = imread('Fig0318(a)(ckt-board-orig).tif');
%添加椒盐噪声20%像素
fn = imnoise(f,'salt & pepper', 0.2);
%中值滤波 使用默认填充
fm = medfilt2(fn);
%中值滤波1 对称填充
fms1 = medfilt2(fn,'symmetric');
%中值滤波2 对称填充
fms2 = medfilt2(fms1,'symmetric');
%中值滤波3 对称填充
fms3 = medfilt2(fms2,'symmetric');
subplot(2,3,1);imshow(f);
subplot(2,3,2);imshow(fn);
subplot(2,3,3);imshow(fm);
subplot(2,3,4);imshow(fms1);
subplot(2,3,5);imshow(fms2);
subplot(2,3,6);imshow(fms3);
3.3 作业
3.3.1 一维和二维卷积
x = [1 2 3 4 3 2 1];
y = [2 0 -2];
z = conv(x,y,'same');
disp(z);
f = [-1 0 1;-2 0 1; -1 0 1];
g = [1 3 2 0 4;1 0 3 2 3;0 4 1 0 5;2 3 2 1 4;3 1 0 4 2];
h = conv2(g,f,'same');
disp(h);
4 4 4 0 -4 -4 -4
-6 -5 1 -6 2
-7 -7 3 -9 2
-11 -4 4 -11 3
-11 0 2 -12 5
-5 3 -5 -6 5
3.3.2 使用sobel算子设计图像锐化增强算法
f = imread('Fig0318(a)(ckt-board-orig).tif');
f = im2double(f);
g = edge(f,'sobel',0.1);
g = im2double(g);
h = f - g;
subplot(131);imshow(f);
subplot(132);imshow(g);
subplot(133);imshow(h);