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濾波器可以在頻域的不同尺度,不同方向上提取相關特徵。
另一個二維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濾波器的這一性質,使得其在視覺領域中經常被用來作影象的預處理。
二、gabor函式實現:
matlab版本,我從pudn上找來的,但他的gabor函式,我沒怎麼看明白:
gabor函式:
- function gabor_k = compute(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);
- function gabor_k = compute(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);
- %繪製一個Gabor濾波器的空域和頻域函式圖
- clear;
- x = 0;
- theta = 0;
- f0 = 0.2;
- for i = linspace(-15,15,50)
- x = x + 1;
- y = 0;
- for j = linspace(-15,15,50)
- y = y + 1;
- z(y,x)=compute(i,j,f0,theta);
- end
- end
- x = linspace(-15,15,50);
- y = linspace(-15,15,50);
- surf(x,y,real(z))
- title('Gabor filter:real component');
- xlabel('x');
- ylabel('y');
- zlabel('z');
- figure(2);
- surf(x,y,imag(z))
- title('Gabor filter:imaginary component');
- xlabel('x');
- ylabel('y');
- zlabel('z');
- Z = fft2(z);
- u = linspace(-0.5,0.5,50);
- v = linspace(-0.5,0.5,50);
- figure(3);
- surf(u,v,abs(fftshift(Z)))
- title('Gabor filter:frequency component');
- xlabel('u');
- ylabel('v');
- zlabel('Z');
- %繪製一個Gabor濾波器的空域和頻域函式圖
- clear;
- x = 0;
- theta = 0;
- f0 = 0.2;
- for i = linspace(-15,15,50)
- x = x + 1;
- y = 0;
- for j = linspace(-15,15,50)
- y = y + 1;
- z(y,x)=compute(i,j,f0,theta);
- end
- end
- x = linspace(-15,15,50);
- y = linspace(-15,15,50);
- surf(x,y,real(z))
- title('Gabor filter:real component');
- xlabel('x');
- ylabel('y');
- zlabel('z');
- figure(2);
- surf(x,y,imag(z))
- title('Gabor filter:imaginary component');
- xlabel('x');
- ylabel('y');
- zlabel('z');
- Z = fft2(z);
- u = linspace(-0.5,0.5,50);
- v = linspace(-0.5,0.5,50);
- figure(3);
- surf(u,v,abs(fftshift(Z)))
- title('Gabor filter:frequency component');
- xlabel('u');
- ylabel('v');
- zlabel('Z');
執行結果:
- %4個方向的Gabo濾波器通過影象顯示
- clear;
- x = 0;
- theta = pi*3/4;%用弧度0,pi/4,pi/2,pi*3/4
- f0 = 0.2;
- for i = linspace(-15,15,50)
- x = x + 1;
- y = 0;
- for j = linspace(-15,15,50)
- y = y + 1;
- z(y,x)=compute(i,j,f0,theta);
- end
- end
- z_real = real(z);
- m = min(z_real(:));
- z_real = z_real+abs(m);
- M = max(z_real(:));
- imshow(1/M*z_real);
- figure(2)
- z_imag = imag(z);
- m = min(z_imag(:));
- z_imag = z_imag+abs(m);
- M = max(z_imag(:));
- imshow(1/M*z_imag);
- %4個方向的Gabo濾波器通過影象顯示
- clear;
- x = 0;
- theta = pi*3/4;%用弧度0,pi/4,pi/2,pi*3/4
- f0 = 0.2;
- for i = linspace(-15,15,50)
- x = x + 1;
- y = 0;
- for j = linspace(-15,15,50)
- y = y + 1;
- z(y,x)=compute(i,j,f0,theta);
- end
- end
- z_real = real(z);
- m = min(z_real(:));
- z_real = z_real+abs(m);
- M = max(z_real(:));
- imshow(1/M*z_real);
- figure(2)
- z_imag = imag(z);
- m = min(z_imag(:));
- z_imag = z_imag+abs(m);
- M = max(z_imag(:));
- imshow(1/M*z_imag);
執行效果:
實數部分:
虛數部分:
- %4個方向的Gabor濾波器對lena進行濾波
- clear;
- I = imread('.\pic\lena.bmp');
- f0 = 0.2;
- count = 0;
- for theta = [0,pi/4,pi/2,pi*3/4];%用弧度0,pi/4,pi/2,pi*3/4
- count = count + 1;
- x = 0;
- for i = linspace(-8,8,11)
- x = x + 1;
- y = 0;
- for j = linspace(-8,8,11)
- y = y + 1;
- z(y,x)=compute(i,j,f0,theta);
- end
- end
- figure(count);
- filtered = filter2(z,I,'valid');
- f = abs(filtered);
- imshow(f/max(f(:)))
- end
- %4個方向的Gabor濾波器對lena進行濾波
- clear;
- I = imread('.\pic\lena.bmp');
- f0 = 0.2;
- count = 0;
- for theta = [0,pi/4,pi/2,pi*3/4];%用弧度0,pi/4,pi/2,pi*3/4
- count = count + 1;
- x = 0;
- for i = linspace(-8,8,11)
- x = x + 1;
- y = 0;
- for j = linspace(-8,8,11)
- y = y + 1;
- z(y,x)=compute(i,j,f0,theta);
- end
- end
- figure(count);
- filtered = filter2(z,I,'valid');
- f = abs(filtered);
- imshow(f/max(f(:)))
- 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|,若相似度小於閾值,則說明匹配成功。