Gabor 变换 Gabor函数
在图像处理、模式识别以及计算机视觉等领域中,Gabor 滤波器得到了广泛的应用。 用Gabor 函数形成的二维Gabor 滤波器具有在空间域和频率域同时取得最优局部化的特性,与人类生物视觉特性很相似,因此能够很好地描述对应于空间频率(尺度)、空间位置及方向选择性的局部结构信息。
Gabor变换是一种短时傅里叶变换方法,其实质是在傅里叶变换中加入一个窗函数,通过窗函数来实现信号的时频分析。当选取高斯函数作为窗函数时,短时傅里叶变换称为Gabor变换。
常用的偶对称二维Gabor滤波器可表示为:
图1 不同方向上的滤波器
在实际应用时,可以根据检测对象的方向趋势,选择合适的方向参数进行滤波。如在检测人脸的五官时,可以根据人脸的偏转角度进行滤波,可以使特征点的定位更加准确。
2. 不同频率下的滤波器:
图2 不同频率下的滤波器
从图2可以看出随着的变化,Gabor滤波器中出现了很多宽窄与纹理不同的明暗条纹。当滤波器纹理与图像作用时,滤波器覆盖下的局部纹理频率与滤波器的频率越接近响应就越大,反之越小。
Gabor变换属于加窗傅立叶变换,Gabor函数可以在频域不同尺度、不同方向上提取相关的特征。另外Gabor函数与人眼的生物作用相仿,所以经常用作纹理识别上,并取得了较好的效果。
Gabor变换是短时Fourier变换中当窗函数取为高斯函数时的一种特殊情况.
Gabor变换的本质实际上还是对二维图像求卷积。因此二维卷积运算的效率就直接决定了Gabor变换的效率。在这里我先说说二维卷积运算以及如何通过二维傅立叶变换提高卷积运算效率.关于离散二维叠加和卷积的运算介绍的书籍比较多,我这里推荐William K. Pratt著,邓鲁华 张延恒等译的《数字图像处理(第3版)》,其中第7章介绍的就是这方面的运算.
A可以理解成是待处理的笔迹纹理,B可以理解成Gabor变换的核函数,现在要求A与B的离散二维叠加卷积,我们首先对A的右边界和下边界填充0(zero padding),然后将B进行水平翻转和垂直翻转,如下图:
然后用B中的每个值依次乘以A中相对位置处的值并进行累加,结果填入相应位置处(注意红圈位置)。通常二维卷积的结果比A、B的尺寸要大。如下图所示:
根据傅立叶变换理论,对图像进行二维卷积等价于对图像的二维傅立叶变换以及核函数的二维傅立叶变换在频域求乘法。通过二维傅立叶变换可以有效提高卷积的运算效率。但在进行傅立叶变换时一定要注意“卷绕误差效应”,只有正确对原有图像以及卷积核填补零后,才能得到正确的卷积结果。
二维Gabor函数可以表示为:
其中:
v的取值决定了Gabor滤波的波长,u的取值表示Gabor核函数的方向,K表示总的方向数。参数决定了高斯窗口的大小,这里取. 程序中取4个频率(v=0, 1, ..., 3),8个方向(即K=8,u=0, 1, ... ,7),共32个Gabor核函数。不同频率不同方向的Gabor函数可通过下图表示:
所谓目标识别,从某种意义上说就是特征识别的问题。而红外图特征提取的角度一般可以从几何形状和上下文的判断中得到,比如说,当你在一幅图像中去搜索桥梁和机场的跑道的时候,我们可以从形状上发现他们都是一组平行线;然后基于上下文去判断,桥梁的长度肯定比跑道短,桥梁的两边一般是水域,而跑道的中间有一些联络道,而这些这些联络道本身也是平行线。
通常用这种仅仅利用图像本身的知识去判断的时候,时常由于经验的限制,识别率总是没有办法做到很好!虽然图像所一些早期的论文里都声称,识别率能够达到90%以上,但是那只是用自己搜集的有利于自己算法的图片得出来的结果而已!
言规正传,由于种种努力,我们发现了频率的概念,频率的本质就是反映变化快慢的物理量。因此当我们把一幅图像f(x,y)通过傅立叶变换变成F(u,v)进入频率域的时候,w=sqrt(u2+v2) 的大小,则直接体现了原图像中灰度值变化速率的大小。于是人们发现了滤波的方法,如通过低通滤波器将图像中的噪声去掉,同时把一些突变的地方变得平滑,而高通滤波器则可以把图像的边缘特征加以锐化。
但是很快大家就发现了傅立叶变换的一个缺陷,傅立叶变换在很大程度上只是一个体现大局观的概念,而无法反映图像局部的特点,因此我们无法通过傅立叶变换来对图像进行细节上更准确的操作。幸运的是,人们之后的研究中,发现了Gabor于1946年发表的论文《the Theory of Communication》,于是在识别的方法上,尤其在纹理识别上达到了一个新的高度。当然小波变换的应用也是差不多这个时间段开始的,由此我们也可以理解数学在图像领域的价值!
Gabor滤波的本质是提取图像的特征分量,通常应用的领域有指纹识别,虹膜识别,人脸识别等。
所谓gabor的价值由来是由于人们对傅立叶频率分析的需求来的,因此,当我们去使用gabor滤波器的时候,就一定要结合对图象频率的分析。这一点表面上简单而直接,实际却被大部分的研究者忽略。关于这部分的研究,可以在各大搜索引擎上检索关键:"fourier power spectrum"。如果使用matlab,可以使用下面的语句将图象转换到频率域:
function fps(I) g=log(abs(fftshift(fft2(double(I))))); %通过一定的技巧我们也可以将频率精度扩大
imview(g,[]); % 注意不能用imshow;
传统的gabor滤波器的思想,就是把图象不同的频率范围分别滤出来,然后提取滤波图象的特征分量加以分类。而一些对gabor滤波器的设计正是从这个角度来考虑。至于相邻的滤波器在频率区域的有效部分是相切还是重叠,则一直是争论的话题。甚至有些人因此从gabor小波的角度去设计。
关于gabor滤波器的参数本身有4个(wf:center frequency theta:angle sigmax,sigmay:extend of gaussian function),90年代的时候,很多文献将sigmax=sigmay,于是参数变成3个;本世纪的时候,人们由于我在上面一段阐述的道理,将sigma与wf组成反比关系。参数又变成2个。这就是现在通用的关于尺度和角度的设计。
在这里我仍然不想去针对特定的纹理,比如指纹,虹膜,文字之类的具体实现来讲更多的东西;因为那实在是已经成熟的技术。只要你慢慢照着做,就一定能达到一定程度的成功率。我想说的是一些更有趣的东西,这就是频率域本身的矛盾性;即大部分信息包含在低频部分,但低频部分的范围却很小,难以区分,因此我们其实浪费了最大量的信息。关于角度的信息,我们只要侦察到特定的角度就一定可以从相当广的频率范围下找到;但是尺度信息的话,我们只能徘徊在一个很小的区间。并且有趣的是这里很多现象象极了物理上的衍射现象。而我们一旦想深入到低频部分的话,对滤波器的设计简直就是苛刻。滤波器的鲁棒性在这里没有价值,我们需要象狐狸一样敏感。但是我相信,如果能够解决这一问题,那么我们甚至可以摈弃纹理识别的概念,而是可以说对图象识别的成功率将到达一个新的高度。
需要Gabor滤波代码
参考论文为 L. Wiskott,J. M. Fellous,N. Kruger,C. v. d.Malsburg. Face Recognition by Elastic Bunch Graph Matching,IEEE Trans. On PAMI,Vol.19,No.7,pp775-779,1997
首先实现滤波器:
do_createfilterbank.m
function [bank] = do_createfilterbank(imsize,varargin)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% 函数实现:创建Gabor 滤波组
%
%%% 必选参数:
% imsize - 图像大小
%%% 可选参数:
% freqnum — 频率数目
% orientnum — 方向数目
% f — 频率域中的采样步长
% kmax — 最大的采样频率
% sigma — 高斯窗的宽度与波向量长度的比率
%
%%% 返回结果:
% bank
% .freq — 滤波频率
% .orient — 滤波方向
% .filter — Gabor滤波
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
conf = struct(...
'freqnum',3,...
'orientnum',6,...
'f',sqrt(2),...
'kmax',(pi/2),...
'sigma',(sqrt(2)*pi) ...
);
%conf = do_getargm(conf,varargin);原代码中这个函数没有,注释掉就行了
bank = cell(1,conf.freqnum*conf.orientnum);
for f0=1:conf.freqnum
fprintf('处理频率 %d \n', f0);
for o0=1:conf.orientnum
[filter_,freq_,orient_] = do_gabor(imsize,(f0-1),(o0-1),conf.kmax,conf.f,conf.sigma,conf.orientnum);
bank{(f0-1)*conf.orientnum + o0}.freq = freq_; %以orient增序排列
bank{(f0-1)*conf.orientnum + o0}.filter = filter_;
bank{(f0-1)*conf.orientnum + o0}.orient = orient_;
end
end
for ind = 1:length(bank)
bank{ind}.filter=fftshift(bank{ind}.filter);
end
接着是do_gabor.m
function [filter,Kv,Phiu] = do_gabor (imsize,nu,mu,Kmax,f,sigma,orientnum)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% 函数实现: 创建Gabor滤波
%
%%% 参数:
% imsize : 滤波的大小(即图像大小)
% nu : 频率编号 [0 ...freqnum-1];
% mu : 方向编号 [0...orientnum-1]
% Kmax : 最大的采样频率
% f : 频率域中的采样步长
% sigma : 高斯窗的宽度与波向量长度的比率
% orientnum : 方向总数
%
%%% 返回值:
% filter : 滤波
% Kv : 频率大小
% Phiu : 方向大小
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
rows = imsize(1);
cols = imsize(2);
minrow = fix(-rows/2);
mincol = fix(-cols/2);
row = minrow + (0:rows-1);
col = mincol + (0:cols-1);
[X,Y] = meshgrid(col,row);
Kv = Kmax/f^nu;
Phiu = pi * mu /orientnum;
K = Kv * exp(i * Phiu);
F1 = (Kv ^ 2)/ (sigma^2) * exp(-Kv^2 * abs(X.^2 + Y.^2) / (2*sigma^2)) ;
F2 = exp(i * (real(K) * X + imag(K) * Y)) - exp(-sigma^2/2);
filter = F1.* F2;
Gabor 滤波实现(1)已经创建了Gabor滤波组,现在可以使用该滤波组对图像进行转换,得到振幅和相位。
最后是do_filterwithbank.m
function [result] = do_filterwithbank(im,bank)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% 函数实现:对图像使用Gabor滤波组进行转换换
%
%%% 参数:
% im — 被转换的图像
% bank — 由函数do_createfilterbank得到的滤波组
%
%%% 返回:
% result — 图像被转换后的结果
% .amplitudes — 不同像素点的振幅向量
% .phases — 不同像素点的相位向量
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[N1 N2] = size(im);
N3 = length(bank);
phases = zeros(N1,N2,N3);
amplitudes = zeros(N1,N2,N3);
imagefft = fft2(im);
for ind = 1:N3
fprintf('正在处理滤波 %d \n',ind);
temp = ifft2(imagefft .* bank{ind}.filter);
phases(:,:,ind) = angle(temp);
amplitudes(:,:,ind) = abs(temp);
end
result.phases = phases;
result.amplitudes = amplitudes;
整个程序可以如下使用。
im = imread('image.jpg');
im = rgb2gray(im);
bank = do_createfilterbank(size(im));
result = do_filterwithbank(im,bank);
【摘要】本文就图像二维傅立叶变换常令人感到困惑的问题进行深入的讨论,并对傅立叶变换后原图和频谱图出现的垂直现象进行分析,同时给出数学证明。
【关键词】傅立叶变换;频谱图;垂直现象;图像
1 引言
傅立叶变换是线性系统分析的一个有力工具,是信号处理中最重要、应用最广泛的变换,但遗憾的是很多人可能还是不习惯在频域中思考问题,尤其是面对图像时,空间域、频率域都是二维的,更是对空域、频域的对应关系不甚了解。如何理解傅立叶变换后的频谱图,为何对不同图像进行傅立叶变换后产生的频谱图往往会出现水平和垂直的"亮线",而对一些规则图像进行傅立叶变换后得到的频谱图往往会在与原图垂直的方向上出现较亮的点或线(如垂直条纹图像,傅立叶变换后会在水平方向上出现一些较亮的点)。这些问题困扰着每个初学者,更让初学者困惑的是,几乎市面上所有有关数字图像处理的书籍都没有给出详细的解释。下面就围绕傅立叶变换以及图像处理中一些经常让人困惑的问题进行深入的讨论。
2一维傅立叶变换中的问题讨论[1]
一维傅立叶变换是二维变换的基础,下面就先对一些相关的、基本的但又很重要的概念进行讨论。
就信号处理来说,大家所关心的都是实信号,所以单独对它进行讨论,可以简化工作。
下面是大家所熟知的傅立叶变换公式
从定义式不难推出
所以可得出结论:。这说明实函数的傅立叶变换是实部为偶函数,虚部为奇函数,也就是说:求某一实函数的傅立叶变换时,它的幅度谱总是关于原点对称的,而相位谱左右两边只是差一个负号,即左右互为复共轭。由此可见,就实际应用来讲,无论哪边的频谱都是完备的,并且负频率本身也不具有什么意义,但是当用更为通用的数学方法去对物理过程建模时,保留负频率部分会使分析更加容易。
大家知道,任何满足狄里赫利条件的信号都可以通过傅立叶变换表征为一组正(余)弦信号的和或积分,而由图1可以从频域得出这一结论:
由于任何实函数的傅立叶变换都是偶函数,所以对于任意一个实信号,将它的傅立叶变换在频率域进行抽样时,都能得到无数的抽样脉冲对(见图2),也即将这些脉冲对累加起来就得到了,而当脉冲宽度趋于零时,每个脉冲对正好是某个频率的余弦信号的傅立叶变换,这从频率域的角度验证了任何一个实信号都可以看作是由若干个正(余)弦信号以及相应的幅度所组成。
图2 实信号及傅立叶变换
通过以上的讨论可得出两个简单的结论:(1)实信号的频谱是对称的;(2)信号在时域和频域中是相互对应的,总是能把实信号看作是由若干不同频率、振幅的正弦波组成。
3.图像的二维傅立叶变换
3.1二维离散傅立叶变换的定义
图像经数字化处理后,可以用二维离散信号表示。对于二维离散信号,其离散傅立叶变换定义为:
式中,称为空间频率。反变换定义为
式中。
在图像处理时,一般选取图像块为的方阵,即取,这时二维离散傅立叶变换和反变换式:
在(3)(4)两式中,。本文都是选取的图像进行讨论的。
3.2频谱图的理解[2]
由(3)式可知图像经傅立叶变换后,往往得到的是复数形式。要直接表示结果就必须用到两幅图像:一幅表示实部,一幅表示虚部。这样表示十分不方便,同时也没有得到有用的信息,因此引入变换结果的模作为值在频谱图中表示出来,以灰度的明暗代表模的大小。
作为典型的二维信号,图像的频率相应地也是二维的。其分别对应着图像的像素值在两个相互垂直的方向上变化的情况(如图3.2.1)。根据对一维离散信号频谱的分析结果可知,频谱在三点处的频率分别为为图像信号的最高截止频率。将其推广到二维,则在图像频谱图中所有沿方向的频率值变化情况与一维相同,也有。同理,在方向上也有相同的结果。因此,在频谱图四角处沿和方向的频率分量均为0,在频谱图中心点处沿和方向的频率分量均为最大值。
图3.2.1 图像频谱示意图
由于图像中的大部分能量集中在低频分量上,因此频谱图中四角部分的幅度值较大。然而,在实际的图像频谱分析过程中,由于低频分两区域较小,并且分散在四角,因此不利于对其进行分析。此时,可以根据图像频谱的周期性和共轭对称性对频谱图坐标进行移位,将所有低频分量集中在频谱图中心,同时高频分量分散在四周。在具体实现频谱的移位过程中,将图3.2.1中的区域A和区域D对换位置,将区域B和区域C对换位置即可。进行移位之后大大增加了图像频谱的可读性,如图3.2.2所以。
(a)原图像 (b)移位前的频谱 (c)移位后的频谱
图3.2.2 简单矩形图像坐标移动前后的频谱图
3.3频谱图的垂直现象及单条直线段垂直现象
对图像进行傅立叶变换后所得到的移位后的频谱图往往会在垂直方向和水平方向上出现两条"亮线"(如图3.2.2),这个现象常常困扰初学者,为什么会出现这两条亮线,什么时候会出现这两条亮线?要很完整的回答这些问题很不容易,因为输入图像可以有很多种,但产生的频谱图大多都有这两条亮线。因此应该选取一些特殊的图像进行研究,接下来就选取:单条直线段,fringe patterns图像进行讨论。如图上方的为原图,下方为傅立叶变换并后未移位的频谱图:
(a) sin(x+y) (b) x = a (c) x + y = N-1
图3.3 一些特殊图像及其傅立叶变换后的频谱图
图3.3(a)是fringe patterns[3] sin(x+y)的图像,可以看到图像变换后的频谱图中出现两个点,这两点分别与原点及(N-1,N-1)的连线是沿着u = v的方向[4]。而原图像在x+y = b (b为0到2N-2的正整数)的灰度值是相等的,这与u = v方向正好是垂直的。图(b)中的垂直现象就更明显了,原图为一水平线,变换后的频谱图中在v = 0上出现一条亮线,这与原图的方向正好垂直。图(c)为直线段x + y = N-1,变换后的频谱图为直线段u = v,同样出现了垂直现象。
上述对一些比较特殊的图像进行了傅立叶变换后中都出现了原图像与频谱图存在一定垂直关系的现象。对这样的垂直现象的研究能较好的理解频谱图和二维傅立叶变换,接下来就给出垂直现象的数学证明和物理意义的解释。
4.垂直现象的数学证明
本节给出只由一条直线段组成的图像的数学证明,在4.1中给出对图像内任意一条水平的直线段的证明,在4.2节中给出任意一条斜线段的证明。
因为频谱图中的灰度代表傅立叶变换的模值,因此证明变换前后出现垂直现象,实际上就是求傅立叶变换后模将会在什么位置或者说什么方向上出现最大值。即讨论求模公式:
4.1水平直线段垂直现象的证明
设输入图像为一个的二维矩阵,图像内任意一条水平直线段定义如下:
带入(1)式可得:
由(2)式可以看出,模的值只可能出现在的一列或者多列,也就是说在变换后的频谱图里亮线可能出现在垂直的方向上,这就很好的证明了图3.3(b)中出现的垂直现象。但是(2)式并不能说明模值只出现在这一列,因此还要对(2)式进行进一步的讨论。
如果把(2)式中的连加看成是对积分的取样,并把扩充到,则可以得到如下的(3)式,并对其计算可得以下的等式:
4.2单条斜线段垂直现象的数学证明
5.垂直现象的物理意义
5.1图像傅立叶变换的物理意义
由于空间是三维的,图像是二维的,因此空间中物体在另一个维度上的关系就由梯度来表示,这样我们就可以通过观察图像得知物体在三维空间中的对应关系。而像素之间的梯度关系在傅立叶变换后表现为频率,也就是说图像的频率是表征图像中灰度变换剧烈成都的指标。
假设为一个的图像则它的离散二维傅立叶变换可定义为:
其傅立叶反变换为:
对上述的傅立叶正变换做一些变形可得到下面的式子:
可以看到经过变形后,二维的傅立叶变换可以通过两次一维傅立叶变换得到。因此对图像进行傅立叶变换可以先对行(水平方向)进行一维的傅立叶变换,得出的结果再对列(垂直方向)进行一维的傅立叶变换。这样就是使得图像的傅立叶变换实际上把频率分成水平分量和垂直分量,即分量和分量。用这个思想再去分析图3.3b可知:图3.3b是一幅只包括单条水平线的简单图像,显然它只在垂直方向上有灰度跳变(垂直方向是梯度的方向),所以从它的频谱图中只能看到垂直分量。这样就能很好的解释变换前后所出现的垂直现象。
5.2从公式角度解释垂直现象的物理意义
连续二维傅立叶变换可以表示为:
内积表示空域内点在向量方向上的投影。这样就把图像向相应的所指向的方向投影。这就能很好的解释fringe patterns经过傅立叶变换后,在频谱图中最亮的点是沿着fringe patterns变化的方向。如图3.3a的fringe patterns:,当把图像向= (或者说是)方向投影并以灰度值为纵坐标时,可以近似得到图5.2.1中的右图,可以看出在=这个方向上有固定频率物理意义就是:输入函数的所有点在= (或)方向的投影所得到的函数只有一个频率为的正弦分量,也就是说所有的点在=方向上只能在上有值。这样就会产生"叠加"的效果,我们就可以在-平面上看见两个亮点。
图5.2.1将图像投影到的方向上
现在就能解释为什么对图像进行傅立叶变换后常常会出现水平和垂直的"亮线",如图5.2.2的右图是左图的频谱图,由前面的结论可知,频谱图中的水平亮线是由原图中背景的垂直条纹产生,而垂直亮线则主要是由原图中的镜框及一些灰度规律变化的水平线产生的。
图5.2.2原图像与傅立叶变换后的频谱图
6.总结
通过对单条直线段的简单图像的分析和证明,可以从数学角度和物理意义两个方面解释傅立叶变换后原图像与生成频谱图之间出现的垂直现象,从而能更好的理解傅立叶变换在图像处理中应用的意义,同时解决了在利用傅立叶变换对图像进行处理过程中的一些疑惑。