图像的逆卷积

Mar*_*rry 13 algorithm image convolution

我有源和结果图像.我知道,在源上使用了一些卷积矩阵来得到结果.可以计算这个卷积矩阵吗?或者至少不完全一个,但非常相似.

Ilm*_*nen 22

原则上,是的.只需使用FFT将两个图像转换为频率空间,并将结果图像的FFT除以源图像的FFT.然后应用逆FFT得到卷积核的近似值.

为了了解其工作原理,请注意空间域中的卷积对应于频域中的乘法,因此解卷积类似地对应于频域中的除法.在普通的去卷积中,可以将卷积图像的FFT除以内核的FFT以恢复原始图像.但是,由于卷积(如乘法)是一种可交换操作,因此内核和源的角色可以任意交换:内核对源进行卷积与源对卷内核进行卷积完全相同.

然而,正如其他答案所指出的那样,这不太可能产生内核的精确重建,原因与普通反卷积通常不会精确重建原始图像的原因相同:舍入和削波会将噪声引入过程,这是可能的为了使卷积完全消除一些频率(通过将它们乘以零),在这种情况下,这些频率不能被重建.

也就是说,如果你的原始内核尺寸有限(支持),重建的内核通常应该在原点周围有一个尖峰,接近原始内核,被低级噪声包围.即使您不知道原始内核的确切大小,也不应该太难以提取此峰值并丢弃其余的重建.

例:

以下是灰度级的Lenna测试图像,缩小到256×256像素,并在GIMP中与5×5内核进行卷积:

原版的*核心结果

我将使用Python和numpy/scipy进行解卷积:

from scipy import misc
from numpy import fft

orig = misc.imread('lena256.png')
blur = misc.imread('lena256blur.png')
orig_f = fft.rfft2(orig)
blur_f = fft.rfft2(blur)

kernel_f = blur_f / orig_f         # do the deconvolution
kernel = fft.irfft2(kernel_f)      # inverse Fourier transform
kernel = fft.fftshift(kernel)      # shift origin to center of image
kernel /= kernel.max()             # normalize gray levels
misc.imsave('kernel.png', kernel)  # save reconstructed kernel
Run Code Online (Sandbox Code Playgroud)

得到的256×256内核图像,以及围绕其中心的7×7像素区域的缩放,如下所示:

重构内核 重建内核的缩放

将重建与原始内核进行比较,您会发现它们看起来非常相似; 实际上,在重建中应用0.5到0.68之间的截止值将恢复原始内核.由于圆角和边缘效应,重建中峰值周围的微弱波纹是噪声.

我不完全确定是什么导致了重建中出现的十字形神器(虽然我确信有更多经验的人可以告诉你),但是从我的头脑中,我的猜测就是它与图像边缘有关.当我在GIMP中对原始图像进行卷积时,我告诉它通过扩展图像来处理边缘(基本上是复制最外面的像素),而FFT反卷积则假设图像边缘环绕.这可能会在重建中沿x和y轴引入虚假相关.