简单的图像反卷积问题

3
我正在进行一些非常简单的图像去卷积以证明概念。目标是将一个图像与一个核(我使用的是一个5*5的高斯矩阵)卷积,然后在傅里叶域中去卷积它。通过对图像矩阵和过滤器核心进行FFT、元素乘法,然后对结果进行iFFT,我能够实现与滑动内核卷积相同的结果。要撤消这个卷积,我应该能够元素地分割图像的FFT和过滤器的FFT。但是,当我尝试实现这个时,我得到了一个非常奇怪的纹理东西。我知道我的方法是正确的,但我似乎找不到代码中的错误,这让我疯狂。
# blur image
imblur = filters.convolve(im1, blurfilter)

# compute fft of kernel with padding
padfilfft = np.fft.fft2(blurfilter, s=im1.shape[:2], axes=(0,1))    

# take fft of image
imfft = np.fft.fft2(imblur)

# element division
deconvolveimfft = np.divide(imfft, padfilfft)
deconvolveim = np.abs(np.fft.ifft2(deconvolveimfft))

以下是使用plt.imshow()的输出结果:

典型的问题输出

这是原始图片。我使用misc.imread进行读取并压平: 欢呼

值得一提的是,blurfilter定义如下: blurfilter = (1./273.) * np.array([[1,4,7,4,1],[4,16,26,16,4],[7,26,41,26,7],[4,16,26,16,4],[1,4,7,4,1]])


1
那个滤波器的FFT结果中不会有一些接近或等于零吗?当你试图除以它们时会发生什么? - Mark Ransom
@MarkRansom非常接近于零,但结果只是那张糟糕的图片。我使用scipy.misc.bytescale()确保最终输出处于正确的范围...如果没有它,值会高得多。 - ajdigregorio
1
@paintedcones - 我们能够获得原始图像的访问权限吗?我想尝试一下你的代码并查看其中的问题,但是如果没有原始图像,我无法这样做。 - rayryeng
@rayryeng 添加了图像文件。希望它是可访问的。我尝试了多个不同的图像,并尝试将图像读入为float、float32、uint8等格式。 - ajdigregorio
好的。我会在工作时进行调查。请继续关注! - rayryeng
相关 - http://dsp.stackexchange.com/questions/26433/use-matlab-to-restore-the-signal-from-a-given-degraded-signal-using-tikhonov-reg. - Royi
1个回答

1

好的,我实际上已经找到了解决方法。原来是我的内核存在问题。我发现,一般来说,sigma大于1的高斯内核会产生奇怪的噪声问题。正如@MarkRansom在评论中指出的那样,滤波器的fft变得非常接近于零。由于某种原因,当我们使用σ小于1的内核时,噪声放大要少得多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接