2

1Dガウス関数があるとしましょう。その長さは600です。

サイズ600X600の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]);

問題は、最後にオーバーシュートが発生することです。 代替テキスト

このオーバーシュートを防ぐにはどうすればよいですか?単調な降順関数のためのより良い補間アルゴリズムはありますか?

注: 1D関数を2D放射状対称関数に内挿するための一般的なソリューションを探しています。ガウス関数は単なる例です。

4

3 に答える 3

5

編集:あなたの説明に基づいて、何が起こっているのかは明らかです。利用可能なデータの範囲を超えて関数を内挿しようとしています。つまり、内挿から外挿へと進んでいます。スプラインは、観察しているオーバーシュートを引き起こします。解決策は、1D 関数が [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 に答える