gabor小波滤波器的在纹理提取、图像匹配上的作用

1、作用:Gabor小波可以方便的提取图像在各个尺度和方向上的纹理信息,同时在一定程度上降低了图像中光照变化和噪声的影响。

其对光照不敏感的例子:


    注意:其对图像的旋转也具有一定的适应性。其出现特征提取不好的时候:当图像的旋转角度介于两个滤波器的方向之间时,这会导致图像的纹理提取产生不同,下面的例子是图像的旋转角度接近pi*3/4度时的纹理,其是有点失真的,但总体也能提取出滤波器方向上的纹理。


一、什么是Gabor函数(以下内容含部分翻译自维基百科)

  在图像处理中,Gabor函数是一个用于边缘提取的线性滤波器。Gabor滤波器的频率和方向表达同人类视觉系统类似。研究发现,Gabor滤波器十分适合纹理表达和分离。在空间域中,一个二维Gabor滤波器是一个由正弦平面波调制的高斯核函数。

  还有,生物学实验发现,Gabor滤波器可以很好地近似单细胞的感受野函数(光强刺激下的传递函数),什么视皮层内的超柱,bla...bla,总之是这方面仿生的数学模型。

  另外,网上有一种说法,gabor分为实部和虚部,用实部进行滤波后图像会平滑;虚部滤波后用来检测边缘。【来自百度知道某个大神的回答】,我查了文献,发现的确有人用Gabor的奇函数部分做边缘提取(《基于Gabor滤波器的边缘检测算法》 无线电工程 2000年第3卷第30期)。另外,从我的实验结果也有类似的发现。暂且认为这个对的吧。

  Gabor滤波器的脉冲响应,可以定义为一个正弦波(对于二维Gabor滤波器是正弦平面波)乘以高斯函数。由于乘法卷积性质,Gabor滤波器的脉冲响应的傅立叶变换是其调和函数的傅立叶变换和高斯函数傅立叶变换的卷积。该滤波器由实部和虚部组成,二者相互正交。一组不同频率不同方向的Gabor函数数组对于图像特征提取非常有用。


 二维Gabor滤波器表达式

用Gabor 函数形成的二维Gabor 滤波器具有在空间域和频率域同时取得最优局部化的特性,因此能够很好地描述对应于空间频率(尺度)、空间位置及方向选择性的局部结构信息。Gabor滤波器的频率和方向表示接近人类视觉系统对于频率和方向的表示,并且它们常备用于纹理表示和描述。在图像处理领域,Gabor滤波器是一个用于边缘检测的线性滤波器。,在空域,一个2维的Gabor滤波器是一个正弦平面波和高斯核函数的乘积。Gabor滤波器是自相似的,也就是说,所有Gabor滤波器都可以从一个母小波经过膨胀和旋转产生。实际应用中,Gabor滤波器可以在频域的不同尺度,不同方向上提取相关特征。

 clip_image054[4]

另一个二维Gabor函数的数学表达:

复数表达:

实数部分:

虚数部分:

   

其中:



下面介绍公式中各个参数的含义,及参数如何配置问题【都从老外那翻译来的】:

波长(λ):它的值以像素为单位指定,通常大于等于2.但不能大于输入图像尺寸的五分之一。

方向(θ):这个参数指定了Gabor函数并行条纹的方向,它的取值为0到360度

相位偏移(φ):它的取值范围为-180度到180度。其中,0he180度分别对应中心对称的center-on函数和center-off函数,而-90度和90度对应反对称函数,其一般为0。

长宽比γ):空间纵横比,决定了Gabor函数形状(support,我翻译为形状)的椭圆率(ellipticity)。当γ= 1时,形状是圆的,即想、y

高斯函数的标准差相当。当γ< 1时,形状随着平行条纹方向而拉长。通常该值为0.5,其相当于x、跟y的标准差不是相同的σ,而是σ1、σ2

带宽(b):Gabor滤波器的半响应空间频率带宽b和σ/ λ的比率有关,其中σ表示Gabor函数的高斯因子的标准差,如下:


σ的值不能直接设置,它仅随着带宽b变化。带宽值必须是正实数,通常为1,此时,标准差和波长的关系为:σ= 0.56 λ。带宽越小,标准差越大,Gabor形状越大,可见平行兴奋和抑制区条纹数量越多。

下面给出,不同参数配置下的Gabor核函数效果图,大小均100*100:

a.波长对比组【方向为:0,相位偏移量为:0,纵横比率为:0.5,带宽为:1,下图波长分别为5,10,15】


b.方向对比组【波长为:10,相位偏移量为:0,空间纵横比为:0.5,带宽为:1,方向分别为:0,45,90】


c.相位偏移量对比组【波长为:10,方向为:0,空间纵横比:0.5,带宽:1,相位偏移量分别为:0,180,-90,90】


d.空间纵横比对比组【波长:10,相位偏移量:0,方向:0,带宽:1,空间纵横比分别为:0.5,1】


e.带宽对比组【波长:10,方向:0,相位偏移量:0,空间纵横比:0.5,带宽分别为:0.5,1,2】



1) Gabor优点

Gabor小波与人类视觉系统中简单细胞的视觉刺激响应非常相似。它在提取目标的局部空间和频率域信息方面具有良好的特性。虽然Gabor小波本身并不能构成正交基,但在特定参数下可构成紧框架。Gabor小波对于图像的边缘敏感,能够提供良好的方向选择和尺度选择特性,而且对于光照变化不敏感,能够提供对光照变化良好的适应性。上述特点使Gabor小波被广泛应用于视觉信息理解。

Gabor滤波器和脊椎动物视觉皮层感受野响应的比较:第一行代表脊椎动物的视觉皮层感受野,第二行是Gabor滤波器,第三行是两者的残差。可见两者相差极小。Gabor滤波器的这一性质,使得其在视觉领域中经常被用来作图像的预处理。

clip_image012[4]




二、gabor函数实现:

matlab版本,我从pudn上找来的,但他的gabor函数,我没怎么看明白:

gabor函数:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. function gabor_k = compute(x,y,f0,theta)  
  2. r = 1; g = 1;  
  3. x1 = x*cos(theta) + y*sin(theta);  
  4. y1 = -x*sin(theta) + y*cos(theta);  
  5. gabor_k = f0^2/(pi*r*g)*exp(-(f0^2*x1^2/r^2+f0^2*y1^2/g^2))*exp(i*2*pi*f0*x1);   
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function gabor_k = compute(x,y,f0,theta)  
  2. r = 1; g = 1;  
  3. x1 = x*cos(theta) + y*sin(theta);  
  4. y1 = -x*sin(theta) + y*cos(theta);  
  5. gabor_k = f0^2/(pi*r*g)*exp(-(f0^2*x1^2/r^2+f0^2*y1^2/g^2))*exp(i*2*pi*f0*x1);   

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. %绘制一个Gabor滤波器的空域和频域函数图  
  2. clear;  
  3. x = 0;  
  4. theta = 0;  
  5. f0 = 0.2;  
  6. for i = linspace(-15,15,50)  
  7.     x = x + 1;  
  8.     y = 0;  
  9.     for j = linspace(-15,15,50)  
  10.         y = y + 1;  
  11.         z(y,x)=compute(i,j,f0,theta);  
  12.     end  
  13. end  
  14. x = linspace(-15,15,50);  
  15. y = linspace(-15,15,50);  
  16. surf(x,y,real(z))  
  17. title('Gabor filter:real component');  
  18. xlabel('x');  
  19. ylabel('y');  
  20. zlabel('z');  
  21. figure(2);  
  22. surf(x,y,imag(z))  
  23. title('Gabor filter:imaginary component');  
  24. xlabel('x');  
  25. ylabel('y');  
  26. zlabel('z');  
  27.   
  28. Z = fft2(z);  
  29. u = linspace(-0.5,0.5,50);  
  30. v = linspace(-0.5,0.5,50);  
  31. figure(3);  
  32. surf(u,v,abs(fftshift(Z)))  
  33. title('Gabor filter:frequency component');  
  34. xlabel('u');  
  35. ylabel('v');  
  36. zlabel('Z');  
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. %绘制一个Gabor滤波器的空域和频域函数图  
  2. clear;  
  3. x = 0;  
  4. theta = 0;  
  5. f0 = 0.2;  
  6. for i = linspace(-15,15,50)  
  7.     x = x + 1;  
  8.     y = 0;  
  9.     for j = linspace(-15,15,50)  
  10.         y = y + 1;  
  11.         z(y,x)=compute(i,j,f0,theta);  
  12.     end  
  13. end  
  14. x = linspace(-15,15,50);  
  15. y = linspace(-15,15,50);  
  16. surf(x,y,real(z))  
  17. title('Gabor filter:real component');  
  18. xlabel('x');  
  19. ylabel('y');  
  20. zlabel('z');  
  21. figure(2);  
  22. surf(x,y,imag(z))  
  23. title('Gabor filter:imaginary component');  
  24. xlabel('x');  
  25. ylabel('y');  
  26. zlabel('z');  
  27.   
  28. Z = fft2(z);  
  29. u = linspace(-0.5,0.5,50);  
  30. v = linspace(-0.5,0.5,50);  
  31. figure(3);  
  32. surf(u,v,abs(fftshift(Z)))  
  33. title('Gabor filter:frequency component');  
  34. xlabel('u');  
  35. ylabel('v');  
  36. zlabel('Z');  

运行结果:






   

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. %4个方向的Gabo滤波器通过图像显示  
  2. clear;  
  3. x = 0;  
  4. theta = pi*3/4;%用弧度0,pi/4,pi/2,pi*3/4  
  5. f0 = 0.2;   
  6. for i = linspace(-15,15,50)  
  7.     x = x + 1;  
  8.     y = 0;  
  9.     for j = linspace(-15,15,50)  
  10.         y = y + 1;  
  11.         z(y,x)=compute(i,j,f0,theta);  
  12.     end  
  13. end  
  14. z_real = real(z);  
  15. m = min(z_real(:));  
  16. z_real = z_real+abs(m);  
  17. M = max(z_real(:));  
  18. imshow(1/M*z_real);  
  19. figure(2)  
  20. z_imag = imag(z);  
  21. m = min(z_imag(:));  
  22. z_imag = z_imag+abs(m);  
  23. M = max(z_imag(:));  
  24. imshow(1/M*z_imag);  
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. %4个方向的Gabo滤波器通过图像显示  
  2. clear;  
  3. x = 0;  
  4. theta = pi*3/4;%用弧度0,pi/4,pi/2,pi*3/4  
  5. f0 = 0.2;   
  6. for i = linspace(-15,15,50)  
  7.     x = x + 1;  
  8.     y = 0;  
  9.     for j = linspace(-15,15,50)  
  10.         y = y + 1;  
  11.         z(y,x)=compute(i,j,f0,theta);  
  12.     end  
  13. end  
  14. z_real = real(z);  
  15. m = min(z_real(:));  
  16. z_real = z_real+abs(m);  
  17. M = max(z_real(:));  
  18. imshow(1/M*z_real);  
  19. figure(2)  
  20. z_imag = imag(z);  
  21. m = min(z_imag(:));  
  22. z_imag = z_imag+abs(m);  
  23. M = max(z_imag(:));  
  24. imshow(1/M*z_imag);  

运行效果:

实数部分:

虚数部分:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. %4个方向的Gabor滤波器对lena进行滤波  
  2. clear;  
  3. I = imread('.\pic\lena.bmp');  
  4. f0 = 0.2;   
  5. count = 0;  
  6. for theta = [0,pi/4,pi/2,pi*3/4];%用弧度0,pi/4,pi/2,pi*3/4  
  7.     count = count + 1;  
  8.     x = 0;  
  9.     for i = linspace(-8,8,11)  
  10.         x = x + 1;  
  11.         y = 0;  
  12.         for j = linspace(-8,8,11)  
  13.             y = y + 1;  
  14.             z(y,x)=compute(i,j,f0,theta);  
  15.         end  
  16.     end  
  17.     figure(count);  
  18.     filtered = filter2(z,I,'valid');  
  19.     f = abs(filtered);  
  20.     imshow(f/max(f(:)))  
  21. end  
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. %4个方向的Gabor滤波器对lena进行滤波  
  2. clear;  
  3. I = imread('.\pic\lena.bmp');  
  4. f0 = 0.2;   
  5. count = 0;  
  6. for theta = [0,pi/4,pi/2,pi*3/4];%用弧度0,pi/4,pi/2,pi*3/4  
  7.     count = count + 1;  
  8.     x = 0;  
  9.     for i = linspace(-8,8,11)  
  10.         x = x + 1;  
  11.         y = 0;  
  12.         for j = linspace(-8,8,11)  
  13.             y = y + 1;  
  14.             z(y,x)=compute(i,j,f0,theta);  
  15.         end  
  16.     end  
  17.     figure(count);  
  18.     filtered = filter2(z,I,'valid');  
  19.     f = abs(filtered);  
  20.     imshow(f/max(f(:)))  
  21. end  

运行效果:

下面是自己修改的程序:

%4个方向的Gabo滤波器通过图像显示 
close all;
clear;  
x = 0;  
theta =0;%用弧度0,pi/4,pi/2,pi*3/4  
f0 = 0.2;
count=1;
I=imread('555.jpg');
imshow(I);
figure(1);
I1=rgb2gray(I);
for theta=[0,pi/4,pi/2,pi*3/4]
    count=count+1;
    x=0;
for i = linspace(-15,15,50)  
    x = x + 1;  
    y = 0;  
    for j = linspace(-15,15,50)  
        y = y + 1;  
        z(y,x)=Gabor_compter(i,j,f0,theta); 
    end  
end
figure(count);
tic
filtered=filter2(z,I1,'valid'); %滤波器的左上角与数据的左上角重合,2*2的滤波器则是以左上角得数为代替数
toc
f=abs(filtered);
imshow(f/max(f(:)));
end
count=count+1;
figure(count)  
z_real = real(z);  
m = min(z_real(:));  
z_real = z_real+abs(m);  
M = max(z_real(:));  
imshow(1/M*z_real); 
count=count+1;
figure(count)  
z_imag = imag(z); 
m = min(z_imag(:));  
z_imag = z_imag+abs(m); %这里是为了去掉负值很小的数e-5,、10几的小数。
M = max(z_imag(:));  
imshow(1/M*z_imag); 
% mi=min(z_imag(:));
% ma=max(z_imag(:));
% img2=1/(ma-mi)*z_imag;
% imshow(z_imag);
其中Gabor_compter.m里的函数Gabor_compter程序如下:

function gabor_k = Gabor_compter(x,y,f0,theta)  
r =1; g =1;    %其反映的就是长宽比,空间纵横比
x1 = x*cos(theta) + y*sin(theta);  
y1 = -x*sin(theta) + y*cos(theta);  
gabor_k = f0^2/(pi*r*g)*exp(-(f0^2*x1^2/r^2+f0^2*y1^2/g^2))*exp(i*2*pi*f0*x1); %f0就相当于波长的倒数,其反映波长λ

2、图像匹配上的作用

其在匹配上的方法步骤一般为:想进行Gabor滤波器进行纹理特征提取;利用DCT变换进行降维处理;选取DCT变换后的图像左上角的信息,进行Z字形取数,可以有效的提取表征图像的较大系数信息;然后把得到的特征向量与库里的特征向量进行计算:|e-Xi|/|X|,若相似度小于阈值,则说明匹配成功。



  • 15
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值