Gabor过滤器如何工作?

时间:2017-07-25 20:29:12

标签: matlab image-processing gabor-filter

我从this link找到了一个很好的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?

为什么内核计算从1变为mn?为什么不从-(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

1 个答案:

答案 0 :(得分:1)

  

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

这意味着Create proc [dbo].[SaveBudgetDetails] @Quarter nchar(10), @Year int, @LineID nvarchar(MAX), @Project nvarchar(MAX), @Budget decimal(18,0) AS BEGIN INSERT INTO [dbo].[BudgetDetails] ([Quarter] ,[Year] ,[LineID] ,[Project] ,[Budget]) VALUES ( @Quarter,@Year,@LineID,@Project,@Budget) END 会占用越来越大的pi;从0开始并增加到整个事物(即3.14159 ......)。半圈有180度或π弧度。所以tetav将占据半个圈的越来越多的部分。

  

是弧度还是度数?

是弧度。

  

如果它是弧度,为什么它除以180?

Radians是这里所需的单位(无论是谁编程)。如果他们想要所有的度数,他们可能会乘以pi。假设你假设表达式tetav是度,并且需要通过pi / 180的乘法转换为弧度,那么这意味着该函数最多可以覆盖1度的圆圈。

  

为什么内核计算从1到m或n?为什么不从 - (m / 2)到(m + 1)/ 2?

这是因为他们选择在循环内处理 - (m / 2)到(m + 1)/ 2。它位于您为gaborFilterBank.m文件发布的代码中:

((j-1)/v)

由于他们的罪与余弦相结合,你将得到这个Gabor滤波器覆盖的整个圆圈。并且通过 - ((m + 1)/ 2)次调用x和y中心点调整偏移量。例如,当x = 1时,表达式(x - ((m + 1)/ 2))变为 - (m + 1)/ 2 + 1或-m / 2 + 0.5,当x = m时,表达式变为m / 2 + 0.5,所以它仍然涵盖了你想知道的范围。