Gabor滤波器如何工作?
问题描述:
我从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分呢?
为什么内核计算从1
到m
或n
?为什么不从-(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
答
这是什么意思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,所以它仍然覆盖你想知道的范围。
只要为'v'选择一个值,看看'((j-1)/ v)'在'j'从1变为'v'时的确很容易。你尝试过吗? – gnovice
cos文档页面的标题是[“以弧度表示的参数的余弦”](https://www.mathworks.com/help/matlab/ref/cos.html),如果有帮助的话。 (我希望“sin”的文档能够说出同样的内容,但我会留给你来验证。) – beaker