5

我已经用我在 matlab 中定义的 2D 高斯函数对我在 matlab 中创建的图像进行了卷积,现在我正在尝试对结果矩阵进行反卷积,以查看是否使用 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) [300x300 array]

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

img 与 Z (C) 的 2D 卷积的 % 代码 [599x599 数组]

C = conv2(img,Z);

% 我已经使用 img 和 C 的横截面轮廓向量测试了这个卷积是正确的,并且得到的 xy 图是我对卷积的期望。

%根据我对卷积的了解,该算法在傅立叶空间中用作乘数,因此通过将输出(卷积图像)的傅立叶变换除以输入(im​​g),我应该得到点扩散函数(Z - 2D Gaussian function ) 在通过除法对该结果应用傅里叶逆变换之后。

% 尝试 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

2

R = FC/Fimg需要R = FC./Fimg;你需要按元素进行划分。

于 2013-10-03T04:14:11.330 回答
0

这是该去卷积高斯的一些八度(版本 3.6.2)图。

% deconvolve in frequency domain
Fimg = fft2(img,599,599);
FC = fft2(C);
R = FC ./ Fimg;
r = ifft2(R);

% show deconvolved Gaussian
figure(1);
subplot(2,3,1), imshow(img), title('image');
subplot(2,3,2), imshow(Z), title('Gaussian');
subplot(2,3,3), imshow(C), title('image blurred by Gaussian');
subplot(2,3,4), mesh(X,Y,Z), title('initial Gaussian');
subplot(2,3,5), imagesc(real(r(1:300,1:300))), colormap gray, title('deconvolved Gaussian');
subplot(2,3,6), mesh(X,Y,real(r(1:300,1:300))), title('deconvolved Gaussian');

% show difference between Gaussian and deconvolved Gaussian
figure(2);
gdiff = Z - real(r(1:300,1:300));
imagesc(gdiff), colorbar, colormap gray, title('difference between initial Gaussian and deconvolved Guassian');

在此处输入图像描述 在此处输入图像描述

于 2014-08-15T12:28:55.350 回答