2015-03-19 107 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的內核時,噪聲放大要少得多。