2017-07-25 53 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,所以它仍然覆盖你想知道的范围。