【问题标题】:How does the Gabor filter work?Gabor 过滤器是如何工作的?
【发布时间】:2017-12-31 22:46:11
【问题描述】:

我从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

【问题讨论】:

  • 只需为v 选择一个值并查看((j-1)/v)j 从1 变为v 时会做什么,这将非常容易。你试过了吗?
  • cos 的文档页面的标题是 "Cosine of argument in radians",如果有帮助的话。 (我希望sin 的文档会说同样的话,但我会留给您验证。)

标签: matlab image-processing gabor-filter


【解决方案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);

由于它们的 sin 和 cosine 被合并,您将得到这个 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,所以它仍然覆盖了你想知道的范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-22
    • 2017-09-01
    • 1970-01-01
    • 2014-05-29
    • 2013-12-07
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多