2D ガボール フィルターを実装しようとしていますが、このフィルターのいくつかのパラメーターがわかりません。たとえば、h(x, y, f, theta, sigma_x, sigma_y) = exp(-.5 * ( x_theta^2/sigma_x^2 + y_theta^2/sigma_y^2 のような 2D ガボール フィルターの一般的な形式を使用します) * cos(2*pi*f*x_theta)、つまり偶数対称ガボール フィレット。
問題は、sigma_x と sigma_y が何を意味するかということです。ほとんどの論文で提示されているのは、x と y に沿ったガウス エンベロープの「標準偏差」です。OK、これは私を数日間混乱させました。
Gabor に関するいくつかのコードを読みましたが、この 2 つのパラメーターはフィルターのサイズを直接決定しませんでした。それらは次のように処理されます
if (isnan(SigmaX)==1) | isempty(SigmaX),
SigmaX = (3*sqrt(2*log(2)))/(2*pi*CtrFreq);
end
if (isnan(SigmaY)==1) | isempty(SigmaY),
SigmaY=sqrt(2*log(2))/(2*pi*tan(pi/8)*CtrFreq);
end
xlim=round(nstd*(SigmaX*abs(cos(Angle))+SigmaY*abs(sin(Angle))));
ylim=round(nstd*(SigmaY*abs(cos(Angle))+SigmaX*abs(sin(Angle))));
この場合、nstd はインパルス応答の長さと言われます。それを知らない。
また
sigmax = wavelength*kx;
sigmay = wavelength*ky.
したがって、フィルターのサイズをどのように決定できるのでしょうか。このため、波長と帯域幅について他にもいくつか質問があります。(信号処理のバックグラウンドがないため)
上記の 2 番目のケースでは、波長を使用して kx または ky を乗算します。sigma_x または sigma_y を直接使用できないのはなぜですか? この波長は何を意味するのでしょうか? ガボールフィルターの大きさでしょうか。その帯域幅とはどういう意味ですか? ガボールフィルターの大きさでしょうか。
簡単なプログラムを実装しましたが、以下のように正しくないようです
function [GR, GI, G] = yGabora(f, sigma_x, sigma_y, theta)
the = theta * pi/180; % Angular to degree.
% Rotation matrix
Rot = [ cos(the) sin(the);
-sin(the) cos(the)];
% Calculate gabor filter
for x=-sigma_u:1:sigma_u
for y=-sigma_v:1:sigma_v
% Calculate rotated position of Gaussian function
tmpRet = Rot*[x, y]';
xt = tmpRet(1);
yt = tmpRet(2);
h_even(x+sigma_u+1, y+sigma_v+1) = exp(-0.5* (xt^2/(sigma_u^2) + yt^2/(sigma_v^2))) * cos(2*pi*f*xt);
h_odd(x+sigma_u+1, y+sigma_v+1) = exp(-0.5* (xt^2/(sigma_u^2) + yt^2/(sigma_v^2))) * sin(2*pi*f*xt);
end
end
% Generate a complex unit.
j = sqrt(-1);
% Real part of G
GR = h_even;
% Imaginary part of G
GI = h_odd.*j;
% Gabor filter
G = GR + GI;