2017-07-25 23 views
-4

私はthis linkから良いGaborフィルタのソースコードを見つけました。コードは非常にきれいでよく文書化されています。Gaborフィルタはどのように機能しますか?

私の質問は、それがtetav = ((j-1)/v)*pi;によってどういう意味

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 

、ここですか?それはラジアンか度ですか?それがラジアンの場合、180で割ったのはなぜですか?

なぜカーネル計算が1からmまたはnになるのですか?なぜ-(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がますます大きくなる部分を占めることを意味します。 0から始まり、全体に向かって(すなわち、3.14159 ...)増加します。半円に180度またはπラジアンあります。だからテタブはますます半円の部分を占めるようになります。

ラジアンまたは度ですか?

ラジアンです。

ラジアンの場合、なぜ180で除算されませんでしたか?

(これをプログラムしている人は誰でも)ラジアンが望ましい単位です。彼らは、度にすべてが欲しければ、代わりにpiで乗算することができました。仮に、式((j-1)/v)が度であり、π/ 180の倍数でラジアンに変換される必要があると考えていたら、関数があなたのサークルの最大1度をカバーすることになります。

カーネル計算が1からmまたはnになるのはなぜですか?なぜ〜(m/2)から(m + 1)/ 2へ?

ループ内で - (m/2)〜(m + 1)/ 2を代わりに処理したからです。彼らは罪と余弦が組み合わされているので

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); 

、あなたはこのガボールフィルタによってカバーされ、完全な円を取得することがあります:それはあなたがgaborFilterBank.mファイルの投稿をコードです。オフセットは、 - ((m + 1)/ 2)コールによってxとyの中心点に対して調整されます。例えば、x = 1のとき、式(x - ((m + 1)/ 2))は - (m + 1)/ 2 + 1または-m/2 + 0.5となり、x = m/2 + 0.5であるため、あなたが思っている範囲をカバーしています。

関連する問題