我从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
变为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
答案 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,所以它仍然涵盖了你想知道的范围。