线性空间滤波器

工具箱支持一些预定义的二维线性空间滤波器,可通过函数fspecial实现,该函数生成滤波模板W,函数的语法为:
	w=fspecial(‘type’,parameters)
	type------------滤波器的类型
	parameters------------进一步定义指定的滤波器


	由函数fspecial支持的空间滤波器,其中的一些用于边缘检测

类型

语法及参数

average

fspecial(‘average’,[r,c])是矩形平均滤波器,大小为rc,默认值为33.若用单个数代替[r,c],则表示正方形滤波器

disk

fspecial(‘disk’,r)为圆形平均滤波器(包含在边长为2r+1大小的正方形内),半径为r。默认半径为5

gaussian

fspecial(‘gaussian’,[r,c],sig)为大小为rc的高斯低通滤波器,标准偏移为sig(整数)。默认值为33和0.5.若用一个数代替【r,c】,则表示正方形滤波器

laplacian

fspecial(‘laplacian’,alpha)为3*3的拉普拉斯滤波器,形状决定于alapha----一个处于【0,1】函数内的数。alpha默认值为0.2

log

fspecial(‘log’,[r c] ,sig)是大小为rc的高斯-拉普拉斯(Log)滤波器,标准偏移为sig(正数)。默认值为55和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’,alpha)输出大小为3*3的非尖锐的滤波器。alpha控制形状,必须在【0,1】范围内,默认值为0.2.

下面举一个使用函数imfilter实现拉普拉斯滤波器

图像f(x,y)的拉普拉斯算子

python代码实现高通拉普拉斯滤波器 拉普拉斯滤波器计算_matlab 图像处理

定义为

python代码实现高通拉普拉斯滤波器 拉普拉斯滤波器计算_边缘检测_02


通常,二阶导数的数字近似为:

python代码实现高通拉普拉斯滤波器 拉普拉斯滤波器计算_matlab 图像处理_03



python代码实现高通拉普拉斯滤波器 拉普拉斯滤波器计算_python代码实现高通拉普拉斯滤波器_04


因而有

python代码实现高通拉普拉斯滤波器 拉普拉斯滤波器计算_计算机视觉_05


通过图像与下列空间模板进行卷积,这个表达式可以在图像中的所有点实现:

0 1 0

1 -4 1

1 1 0

另一个可替换的数字二阶导数的定义可取对角线元素,可以使用下面的空间模板实现:

1 1 1

1 -8 1

1 1 1

两种导数有时可以用这里所示的相反符号来定义,得到与前面两个空间模板正好相反的结果。

使用拉普拉斯算子增强的基本公式为:

python代码实现高通拉普拉斯滤波器 拉普拉斯滤波器计算_matlab 图像处理_06


其中,f(x,y)为输入图像,g(x,y)为增强后的图像。如果模板的中心系数为正,c为1;如果为负,c为-1;

因为拉普拉斯是微分算子,将使得图像锐化,并将恒定区域为0.把结果与原始图叠加,可恢复灰度级色调。

函数fspecial(‘laplacian’,alpha)可实现更为一般的拉普拉斯模板:

Α/1+A 1-A/1+A A/1+A

1-Α/1+A -4/1+A 1-A/1+A

A/1+A 1-A/1+A A/1+A

可以对增强结果进行精细调整。然而,拉普拉斯的主要应用邻域就是基于以上两种模板。我们使用拉普拉斯滤波器对图像进行增强处理。下面是一副略微有些模糊的月球北极图像。在这种情况下,对图像的增强包括使得图像锐化,同时要尽可能保留图像的灰度层次。

python代码实现高通拉普拉斯滤波器 拉普拉斯滤波器计算_python代码实现高通拉普拉斯滤波器_07

首先,生成并显示拉普拉斯滤波器:

>> Untitled
>> imshow(f)
警告: MATLAB 已通过改用 OpenGL 软件禁用了某些高级的图形渲染功能。欲了解有关详细信息,请点击此处。 
>> w=fspecial('laplacian',0)

w =

     0     1     0
     1    -4     1
     0     1     0

注意这个滤波器属于double类,alpha=0的形状是前面讨论过的拉普拉斯滤波器。我们可以人为规定形状为:

>> w=[0 1 0;1 -4 1;0 1 0]

我们用w处理图像f,f属于unit8类:

>> g1=imfilter(f,w,'replicate')
>>  imshow(g1,[])

python代码实现高通拉普拉斯滤波器 拉普拉斯滤波器计算_计算机视觉_08


这个结果看起来是合理的,但是存在如下问题:所有像素都是正的。因为滤波器的中心参数为负,所以通常我们希望得到带有正值和负值的拉普拉斯图像。然而在这种情况下,f属于unit8类,imfilter给出了与输入图像类型相同的输出,所以负值将被截掉。

可以通过在滤波前将f转化为浮点数来解决这个困难:

>> f2=tofloat(f);
>> g2=imfilter(f2,w,'replicate')
>>  imshow(g2,[])

最后我们从原始图像中减去拉普拉斯图像以恢复失去的灰度层次(因为中心参数为负值)

>> g=f2-g2;
>>  imshow(g);

结果显示的结果比起原始图像要清晰。

下面我们继续进行对人工规定的滤波器与增强技术的比较的讨论。
增强问题常常需要从工具箱中指定可用的滤波器。拉普拉斯滤波器就是一个很好的例子。工具箱支持中心为-4的33拉普拉斯滤波器。通常使用中心为-8、周围的值都为1的33拉普拉斯滤波器以得到更加尖锐的图像。这个例子的目的是手工实现这个滤波器,并比较这两种方式得到结果。指令序列如下:

f=imread('b.tif');
w4=fspecial('laplacian',0);
w8=[1 1 1;1 -8 1;1 1 1]
f=float(f)
g4=f-imfilter(f,w4,'replicate');
g8=f-imfilter(f,w8,'replicate');
imshow(f);
imshow(g4);
imshow(g8);

运行后可以看到g8的图像效果要更好一些。