5

matlabで作成した画像を、matlabでも定義した2Dガウス関数で畳み込みました。現在、結果の行列をデコンボリューションして、fft2およびifft2コマンドを使用して2Dガウス関数が返されるかどうかを確認しようとしています。ただし、結果として得られる行列は(私の知る限り)正しくありません。これまでに行ったことのコードは次のとおりです。

% 入力画像 (img) のコード [300x300 配列]

N = 100;
t = linspace(0,2*pi,50);
r = (N-10)/2;
circle = poly2mask(r*cos(t)+N/2+0.5, r*sin(t)+N/2+0.5,N,N);
img = repmat(circle,3,3);

% c = 0 sig = 1/64 (Z) の 2D ガウス関数のコード [300x300 配列]

x = linspace(-3,3,300);
y = x';
[X Y] = meshgrid(x,y);
Z = exp(-((X.^2)+(Y.^2))/(2*1/64));

% img と Z の 2D Convolution のコード (C) [599x599 配列]

C = conv2(img,Z);

% img と C の断面プロファイル ベクトルを使用して、この畳み込みが正しいことをテストしました。結果の xy プロットは、畳み込みから期待されるものです。

% 畳み込みに関する私の知識から、アルゴリズムはフーリエ空間の乗数として機能するため、出力 (畳み込み画像) のフーリエ変換を入力 (img) で除算することにより、点広がり関数 (Z - 2D ガウス関数) を取得する必要があります。 )逆フーリエ変換が除算によってこの結果に適用された後。

% 試行された 2D デコンボリューションのコード

Fimg = fft2(img,599,599);

% 結果を 599x599 配列に増やすために追加されたゼロ パディング

FC = fft2(C);
R = FC/Fimg;

% 次のエラー プロンプトが表示されます。結果が不正確になる場合があります。RCOND = 2.551432e-22

iFR = ifft2(R);

iFR は Z に近いと予想していますが、まったく異なる結果が得られています。複雑な値を持つ Z の近似値かもしれませんが、matlab で 3D 複素行列をプロットする方法がわからないため、チェックできないようです。誰かが私の答えが正しいか間違っているか、そしてこのデコンボリューションを機能させる方法を教えてもらえますか? よろしくお願いします。

4

2 に答える 2