私はthis linkから良いGaborフィルタのソースコードを見つけました。コードは非常にきれいでよく文書化されています。Gaborフィルタはどのように機能しますか?
私の質問は、それがtetav = ((j-1)/v)*pi;
によってどういう意味
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
、ここですか?それはラジアンか度ですか?それがラジアンの場合、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
'v'の値を選び、'(j-1)/ v''が 'j'が1から' v'になるときに何が起きるかは本当に簡単です。それを試しましたか? – gnovice
'cos'のドキュメンテーション・ページのタイトルは、「ラジアンの引数のコサイン」です(https://www.mathworks.com/help/matlab/ref/cos.html)。 (私は同じことを言うために 'sin 'のドキュメントを期待していますが、確認するために残しておきます) – beaker