2

假设我有一个一维高斯函数。它的长度是600。

我想将它内插成 600 X 600 大小的 2D 高斯。

这是我写的代码(OTFx 是高斯函数,OTF - 2d 插值函数):

[x, y] = meshgrid([-300:299], [-300:299]);
r = sqrt((x .^ 2) + (y .^ 2));

OTF = interp1([-300:299], OTFx, r(:), 'spline');
OTF = reshape(OTF, [600, 600]);

问题是我最后得到了 Overshoot: 替代文字

如何防止这种过冲?单调递减函数是否有更好的插值算法?

注意:我正在寻找一种通用解决方案,用于将 1D 函数内插到 2D 径向对称函数中,高斯只是一个示例。

4

3 回答 3

5

编辑:根据您的澄清,很清楚发生了什么。您正在尝试对超出可用数据范围的函数进行插值 - 即您正在从插值到外插。样条曲线将导致您观察到的过冲。解决方案只是确保您的一维函数具有区间 [min(r), max(r)] 中的值。请注意,在原始数据中,max(r) 约为 424,而您要插值的函数定义在 [-300,299] 范围内

% Simulated overshoot, see left figure:
x1d = [-300:299];
[x,y]=meshgrid(x1d,x1d);
r = sqrt(x.^2+y.^2);
gsn1d = exp(-x1d.^2/500);
lowpass = @(x)(x1d > -x & x1d < x);
gsn1dcutoff = ifft(fftshift(lowpass(10).*fftshift(fft(gsn1d))));
plot(gsn1dcutoff)
OTF2d = reshape(interp1(x1d,gsn1dcutoff,r(:),'spline'),[length(x1d),length(x1d)]);
mesh(OTF2d)

% Quick and dirty fix, see right figure:
x1dExtended = linspace(min(x1d*sqrt(2)),max(x1d*sqrt(2)),ceil(length(x1d)*sqrt(2)));
gsn1dE = exp(-x1dExtended.^2/500);
% ^^^ note that this has 600*sqrt(2) points and is defined on the diagonal of your square.   Now we can low-pass filter in the freq. domain to add ripple in space domain:
lowpass = @(x)(x1dExtended > -x & x1dExtended < x);
gsn1dcutoff = -real(ifft(fftshift(lowpass(10).*fftshift(fft(gsn1dE)))));
plot(gsn1dcutoff)
OTF2d = reshape(interp1(x1dExtended,gsn1dcutoff,r(:),'spline'),[length(x1d),length(x1d)]);
mesh(OTF2d)

替代文字 http://img54.imageshack.us/img54/8255/clipboard01vz.png

于 2010-03-14T19:02:11.050 回答
2

利奥的诊断是正确的。我想提出一个更简单(我希望)的补救措施:做你想做的事(基本上是围绕其对称轴旋转高斯)并在 600x600 正方形中获得合理的答案,你需要一个高斯 600*sqrt (2)=849 像素长。如果你能做到这一点,那么所有进一步的 thttp://stackoverflow.com/questions/2443046/interpolating-1d-gaussian-into-2d-gaussianrickery 都是不必要的。

编辑:换句话说:如果你围绕它的中心旋转 600 像素宽的东西,你会得到一个直径为 600 像素的圆。你想覆盖一个 600x600 的正方形。为此,您需要一个直径为 849 像素的圆,因为这是正方形的对角线。

于 2010-03-14T23:22:13.267 回答
1

在高斯的特殊情况下,您可以通过使用它是可分离的事实来计算高斯:

OTF2(x,y) = exp( - x^2 - y^2) = exp( - x^2) * exp( - y^2) = OTFx(x) * OTFx(y)

所以你仍然只需要在内存中存储 OTFx。

于 2010-03-15T09:09:54.820 回答