我正在进行一些非常简单的图像反卷积以证明概念。
目标是将图像与内核进行卷积(我使用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]])
答案 0 :(得分:1)
好的,所以我实际上能够搞清楚。结果证明这是我内核的“问题”。我发现,一般来说,高斯内核具有sigma> 1会产生这个奇怪的噪音问题。正如@MarkRansom在评论中指出的那样,滤波器的fft非常接近于零。出于某种原因,当我们使用σ<1的内核时,噪声放大要少得多。