如何在空间和频域的每个尺度和方向上创建 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 特征的主要内容,如果未能解决你的问题,请参考以下文章