简单问题:
我在Matlab中以一定的分辨率绘制了一个二维高斯函数。我测试方差或 sigma = 1.0 的情况。我想将其与FFT(高斯函数)的结果进行比较,这应该得到另一个方差为(1./sigma) 的高斯函数。由于我正在测试 sigma = 1.0,我认为我应该得到两个相等的二维核。
例如:
g1FFT = buildKernel(rows, cols, mu, sigma) % uses normpdf over arbitrary resolution (rows, cols, 3) with the peak in the center
构建内核:
function result = buildKernel(rows, cols, mu, sigma)
result = zeros(rows, cols, 3);
center_w = floor(cols / 2);
center_h = floor(rows / 2);
for i = 1:rows
for j = 1:cols
distance = sqrt((center_w - j).^2 + (center_h - i).^2);
g_val = normpdf(distance, mu, sigma);
result(i, j, :) = g_val;
end
end
% normalize so that kernel sums to 1
sumKernel = sum(result(:));
result = result ./ sumKernel;
end
我正在进行 mu = 0.0(始终如此)以及方差或 sigma = 1.0 的测试。我想将其与 FFT(高斯函数)的结果进行比较,这应该会产生另一个方差为(1./sigma)的高斯函数。
即,
g1FFT = circshift(g1FFT, [rows/2, cols/2, 0]); % fft2 expects center to be in corners
freq_G1 = fft2(g1FFT);
freq_G1 = circshift(freq_G1, [-rows/2, -cols/2, 0]); % shift back to center, for comparison's sake
因为我使用的是sigma = 1.0进行测试,所以我认为应该得到两个等效的2D卷积核,因为如果sigma = 1.0,那么1.0/sigma = 1.0。所以,g1FFT将等于freq_G1。
但是,事实并非如此。即使在归一化之后,它们也具有不同的幅度。我错过了什么吗?
fftshift
函数可以用来移动fft
操作的结果? - rubenvb