2017-07-25 55 views
-4

我從this link找到了一個很好的Gabor濾波器源代碼。代碼非常乾淨並且有很好的文檔記錄。Gabor濾波器如何工作?

我的問題就在這裏,

for i = 1:u  
    ............... 
    ............... 
    ...............   
    for j = 1:v 
     tetav = ((j-1)/v)*pi; 
     .....................    
     for x = 1:m 
      for y = 1:n 
       xprime = ........ 
       yprime = ........ 
       gFilter(x,y) = ........ 
      end 
     end 
     gaborArray{i,j} = gFilter;   
    end 
end 

是什麼意思tetav = ((j-1)/v)*pi;?它是弧度還是度數?如果它是弧度,爲什麼它不是180分呢?

爲什麼內核計算從1mn?爲什麼不從-(m/2)(m+1)/2


源代碼

gaborFeatures.m

function gaborResult = gaborFeatures(img,gaborArray,d1,d2) 

if (nargin ~= 4)  % Check correct number of arguments 
    error('Please use the correct number of input arguments!') 
end 

if size(img,3) == 3  % Check if the input image is grayscale 
    warning('The input RGB image is converted to grayscale!') 
    img = rgb2gray(img); 
end 

img = double(img); 


% Filter input image by each Gabor filter 
[u,v] = size(gaborArray); 
gaborResult = cell(u,v); 
for i = 1:u 
    for j = 1:v 
     gaborResult{i,j} = imfilter(img, gaborArray{i,j}); 
    end 
end 

gaborFilterBank.m

function gaborArray = gaborFilterBank(u,v,m,n)  
if (nargin ~= 4) % Check correct number of arguments 
    error('There must be four input arguments (Number of scales and orientations and the 2-D size of the filter)!') 
end 

% Create u*v gabor filters each being an m by n matrix 
gaborArray = cell(u,v); 
fmax = 0.25; 
gama = sqrt(2); 
eta = sqrt(2); 

for i = 1:u 

    fu = fmax/((sqrt(2))^(i-1)); 
    alpha = fu/gama; 
    beta = fu/eta; 

    for j = 1:v 
     tetav = ((j-1)/v)*pi; 
     gFilter = zeros(m,n); 

     for x = 1:m 
      for y = 1:n 
       xprime = (x-((m+1)/2))*cos(tetav)+(y-((n+1)/2))*sin(tetav); 
       yprime = -(x-((m+1)/2))*sin(tetav)+(y-((n+1)/2))*cos(tetav); 
       gFilter(x,y) = (fu^2/(pi*gama*eta))*exp(-((alpha^2)*(xprime^2)+(beta^2)*(yprime^2)))*exp(1i*2*pi*fu*xprime); 
      end 
     end 
     gaborArray{i,j} = gFilter;   
    end 
end 
+3

只要爲'v'選擇一個值,看看'((j-1)/ v)'在'j'從1變爲'v'時的確很容易。你嘗試過嗎? – gnovice

+2

cos文檔頁面的標題是[「以弧度表示的參數的餘弦」](https://www.mathworks.com/help/matlab/ref/cos.html),如果有幫助的話。 (我希望「sin」的文檔能夠說出同樣的內容,但我會留給你來驗證。) – beaker

回答

1

這是什麼意思tetav =((j-1)/ v)* pi;?

這意味着tetav將承擔越來越大的pi;從0開始並增加到整個事物(即3.14159 ...)。半圈有180度或pi弧度。所以tetav將會佔據半個圈子的越來越多的部分。

它是弧度還是度數?

它是弧度。

如果它是弧度,爲什麼它不是180除?

弧度是這裏所需的單位(無論誰編程)。如果他們想要度數的所有東西,他們本可以乘以pi。如果假設你認爲表達式((j-1)/v)是度數並且需要通過pi/180的乘法轉換爲弧度,那麼這意味着該函數最多會覆蓋1度的圓。

爲什麼內核計算從1到m或n?爲什麼不從 - (m/2)到(m + 1)/ 2?

這是因爲他們選擇在循環內部處理 - (m/2)到(m + 1)/ 2。這是您發佈的gaborFilterBank.m文件的代碼:

xprime = (x-((m+1)/2))*cos(tetav)+(y-((n+1)/2))*sin(tetav); 
yprime = -(x-((m+1)/2))*sin(tetav)+(y-((n+1)/2))*cos(tetav); 

由於他們正弦和餘弦函數被組合,你會得到這個Gabor濾波器覆蓋了完整的圓。偏移量通過 - ((m + 1)/ 2)調用針對x和y中心點進行調整。例如,當x = 1時,表達式(x-((m + 1)/ 2))變爲 - (m + 1)/ 2 + 1或-m/2 + 0.5,並且當x = m時,米/ 2 + 0.5,所以它仍然覆蓋你想知道的範圍。