【发布时间】:2013-10-09 15:20:39
【问题描述】:
我已经将我在 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) [300x300 数组] 的二维高斯函数代码
x = linspace(-3,3,300);
y = x';
[X Y] = meshgrid(x,y);
Z = exp(-((X.^2)+(Y.^2))/(2*1/64));
% img 与 Z (C) [599x599 数组] 的二维卷积代码
C = conv2(img,Z);
% 我已经使用 img 和 C 的横截面轮廓向量测试了这个卷积是正确的,得到的 x-y 图是我对卷积的期望。
% 根据我对卷积的了解,该算法在傅立叶空间中用作乘数,因此通过将输出(卷积图像)的傅立叶变换除以输入(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 复矩阵。那么,如果有人能告诉我我的答案是正确还是不正确,以及如何让这种反卷积起作用?我将不胜感激。
【问题讨论】:
-
有点跑题了:你对信号进行卷积,而不是卷积
-
既然除法得到一个599x599的矩阵,那么如何得到300x300的二维高斯函数呢?
-
@IssamLaradji 结果图像为 599x599,2D 高斯包含在前 300x300 行中。我使用矩阵索引来取回一个 300x300 数组
标签: arrays matlab fft convolution ifft