2015-03-19 108 views
2

我正在研究一些非常简单的图像解卷积以进行概念验证。简单图像解卷积问题

目标是将图像与内核(我使用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():

typical, problematic output

这是原始图片。我读它使用misc.imread与扁平化: cheering

对于它的价值,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结果是否会达到或接近零?当你试图按照他们划分时会发生什么? – 2015-03-19 03:43:00

+0

@MarkRansom绝对接近于零,但结果就是这样糟糕的图片。我使用'scipy.misc.bytescale()'来确保最终的输出是正确的范围...没有它值更高。 – ajdigregorio 2015-03-19 03:47:47

+1

@paintedcones - 我们可以访问原始图像吗?我想玩你的代码,看看发生了什么,但没有原始图像我不能这样做。 – rayryeng 2015-03-19 04:12:10

回答

1

好了,我居然能弄明白。原来,这是我的内核的一个“问题”。我发现一般情况下,sigma> 1的高斯内核会产生这种奇怪的噪声问题。正如@MarkRansom在评论中指出的,过滤器的fft变得非常接近零。出于某种原因,当我们使用σ< 1的内核时,噪声放大要少得多。