如何在空间和频域的每个尺度和方向上创建 64 个 Gabor 特征

Posted

技术标签:

【中文标题】如何在空间和频域的每个尺度和方向上创建 64 个 Gabor 特征【英文标题】:How to create 64 Gabor features at each scale and orientation in the spatial and frequency domain 【发布时间】:2014-01-22 04:31:08 【问题描述】:

通常情况下,Gabor 过滤器,顾名思义,用于过滤图像并提取与过滤方向相同的所有内容。

在这个问题中,你可以看到比这个Link写的更高效的代码

假设 4 个方向的 16 个过滤器尺度,所以我们得到 64 个 gabor 过滤器。

scales=[7:2:37], 7x7 到 37x37 以两个像素为步长,所以我们有 7x7, 9x9, 11x11, 13x13, 15x15, 17x17, 19x19, 21x21, 23x23, 25x25, 27x27, 29x29、31x31、33x33、35x35 和 37x37。

directions=[0, pi/4, pi/2, 3pi/4]。

空间域的Gabor滤波器方程为:

Gabor滤波器在频域的方程为:

【问题讨论】:

好的,你的问题是什么? 我没有问题:)。这是创建 Gabor 过滤器的高效代码。 您不应将答案作为问题发布。相反,发布一个问题,询问“如何创建 64 个 Gabor 过滤器”并自己回答这个问题。 【参考方案1】:

在空间域中:

function [fSiz,filters,c1OL,numSimpleFilters] = init_gabor(rot, RF_siz)    

    image=imread('xxx.jpg');
    image_gray=rgb2gray(image);
    image_gray=imresize(image_gray, [100 100]);
    image_double=double(image_gray);

    rot = [0 45 90 135]; % we have four orientations
                RF_siz    = [7:2:37]; %we get 16 scales (7x7 to 37x37 in steps of two pixels)
                minFS     = 7; % the minimum receptive field
                maxFS     = 37; % the maximum receptive field
                sigma  = 0.0036*RF_siz.^2 + 0.35*RF_siz + 0.18; %define the equation of effective width
                lambda = sigma/0.8; % it the equation of wavelength (lambda)
                G      = 0.3;   % spatial aspect ratio: 0.23 < gamma < 0.92


                numFilterSizes   = length(RF_siz); % we get 16

                numSimpleFilters = length(rot); % we get 4

                numFilters       = numFilterSizes*numSimpleFilters; % we get 16x4 = 64 filters

                fSiz             = zeros(numFilters,1); % It is a vector of size numFilters where each cell contains the size of the filter (7,7,7,7,9,9,9,9,11,11,11,11,......,37,37,37,37)

                filters          = zeros(max(RF_siz)^2,numFilters); % Matrix of Gabor filters of size %max_fSiz x num_filters, where max_fSiz is the length of the largest filter and num_filters the total number of filters. Column j of filters matrix contains a n_jxn_j filter (reshaped as a column vector and padded with zeros).




            for k = 1:numFilterSizes  
                for r = 1:numSimpleFilters
                    theta     = rot(r)*pi/180; % so we get 0, pi/4, pi/2, 3pi/4
                    filtSize  = RF_siz(k); 
                    center    = ceil(filtSize/2);
                    filtSizeL = center-1;
                    filtSizeR = filtSize-filtSizeL-1;
                    sigmaq    = sigma(k)^2;

                    for i = -filtSizeL:filtSizeR
                        for j = -filtSizeL:filtSizeR

                            if ( sqrt(i^2+j^2)>filtSize/2 )
                                E = 0;
                            else
                                x = i*cos(theta) - j*sin(theta);
                                y = i*sin(theta) + j*cos(theta);
                                E = exp(-(x^2+G^2*y^2)/(2*sigmaq))*cos(2*pi*x/lambda(k));
                            end
                            f(j+center,i+center) = E;
                        end
                    end

                    f = f - mean(mean(f));
                    f = f ./ sqrt(sum(sum(f.^2)));
                    p = numSimpleFilters*(k-1) + r;
                    filters(1:filtSize^2,p)=reshape(f,filtSize^2,1);
                    fSiz(p)=filtSize;
                end
            end

            % Rebuild all filters (of all sizes)

            nFilts = length(fSiz);
            for i = 1:nFilts
              sqfilteri = reshape(filters(1:(fSiz(i)^2),i),fSiz(i),fSiz(i));

            %if you will use conv2 to convolve an image with this gabor, so you should also add the equation below. But if you will use imfilter instead of conv2, so do not add the equation below.

                    sqfilteri = sqfilteri(end:-1:1,end:-1:1); %flip in order to use conv2 instead of imfilter (%bug_fix 6/28/2007);

    convv=imfilter(image_double, sqfilteri, 'same', 'conv');
    figure;

        imagesc(convv);
        colormap(gray);

                      end 

【讨论】:

感谢代码,但我很想知道这段代码的来源。我的意思是一些文件提到了这些细节,因为我对过滤器比例感到困惑?有人说比例是过滤器的大小,就像你提到的 RF_siz 一样,而其他人说比例只是 sigma 值。你能解释一下什么是规模。如果您可以提供一些指向该文档的链接会更好。谢谢。【参考方案2】:
phi = ij*pi/4; % ij = 0, 1, 2, 3
theta = 3;
sigma = 0.65*theta;
filterSize = 7;   % 7:2:37

G = zeros(filterSize);


for i=(0:filterSize-1)/filterSize
    for j=(0:filterSize-1)/filterSize
        xprime= j*cos(phi);
        yprime= i*sin(phi);
        K = exp(2*pi*theta*sqrt(-1)*(xprime+ yprime));
        G(round((i+1)*filterSize),round((j+1)*filterSize)) =...
           exp(-(i^2+j^2)/(sigma^2))*K;
    end
end

【讨论】:

亲爱的列侬,你知道如何应用逆 Gabor 滤波器来重建原始图像吗?提前致谢!:)【参考方案3】:

在频域中:

sigma_u=1/2*pi*sigmaq;
sigma_v=1/2*pi*sigmaq;
u0=2*pi*cos(theta)*lambda(k);
v0=2*pi*sin(theta)*lambda(k);

for u = -filtSizeL:filtSizeR
            for v = -filtSizeL:filtSizeR

                if ( sqrt(u^2+v^2)>filtSize/2 )
                    E = 0;
                else
                    v_theta = u*cos(theta) - v*sin(theta);
                    u_theta = u*sin(theta) + v*cos(theta);

                  E=(1/2*pi*sigma_u*sigma_v)*((exp((-1/2)*(((u_theta-u0)^2/sigma_u^2))+((v_theta-v0)^2/sigma_v^2))) + (exp((-1/2)*(((u_theta+u0)^2/sigma_u^2))+((v_theta+v0)^2/sigma_v^2))));

                end
                f(v+center,u+center) = E;
            end
        end

【讨论】:

您使用哪个公式生成此代码?为什么要在频域中构建滤波器? 我在上面编辑的问题中使用了公式。我从您给我的文章中提取公式以降低复杂性。但在我的测试中,我注意到空间域和频域的复杂性保持不变。这就是为什么我不确定我是否在代码中正确应用了频率公式 您的代码对我来说看起来不错。但它似乎在频域中是不可分离的【参考方案4】:

从图像处理工具箱的 R2015b 版本开始,您可以使用图像处理工具箱中的 gabor 函数创建一个 Gabor 滤波器组,并且可以使用 imgaborfilt 将其应用于图像。

【讨论】:

以上是关于如何在空间和频域的每个尺度和方向上创建 64 个 Gabor 特征的主要内容,如果未能解决你的问题,请参考以下文章

时域和频域的麦克斯韦方程组

时域缩小2倍,频域怎么变

4-SIFT特征提取和检测的基本步骤

时域,空域,频域的基本概念

python生成语谱图

python 实现wav的波形显示(时域和频域)