2016-09-18 68 views
1
import numpy as np 
    from numpy.fft import fft2, ifft2 
    import cv2 
    from PIL import Image 
    def wiener_filter(img,kernel,K = 10): 
     kernel=([3,1],[2,1]) 
     dummy = np.copy(img) 
     kernel = np.pad(kernel, [(0, dummy.shape[0] - kernel.shape[0]), (0, dummy.shape[1] - kernel.shape[1])], 'constant') 
     # Fourier Transform 
     dummy = fft2(dummy) 
     kernel = fft2(kernel) 
     kernel = np.conj(kernel)/(np.abs(kernel) ** 2 + K) 
     dummy = dummy * kernel 
     dummy = np.abs(ifft2(dummy)) 
     return np.uint8(dummy) 

    img = cv2.imread("C:\\Users\\anup\\Desktop\\New folder\\leo.jpg") 
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
    #gray1 = cv2.cvtColor(gray,cv2.COLOR_GRAY2RGB) 
    kernel=([3,1],[2,1]) 
    fm = wiener_filter(img,kernel) 
    cv2.imshow("Image", img) 
    key = cv2.waitKey(0) 

我想實現維納濾波器對模糊圖像執行反捲積。我的實現是這樣的爲什麼它在說我已經申報內核

雖然實現這個我有錯誤

Traceback (most recent call last): 
    File "C:\Python27\deblur.py", line 21, in <module> 
    fm = wiener_filter(img,kernel) 
    File "C:\Python27\deblur.py", line 8, in wiener_filter 
    kernel = np.pad(kernel, [(0, dummy.shape[0] - kernel.shape[0]), (0, dummy.shape[1] - kernel.shape[1])], 'constant') 
AttributeError: 'tuple' object has no attribute 'shape' 
+1

正在重用的變量'kernel'很多在這裏,儘量不會破壞這個名字。 – shuttle87

+1

這就是說,你如何定義'kernel'與你如何使用它不相容。你創建了一個元組,但是像使用數組一樣使用它。 – hpaulj

+0

現在我得到錯誤,因爲內核沒有定義......其實我試圖去模糊圖像 –

回答

2

有:

def wiener_filter(img,kernel,K = 10): 
    kernel=([3,1],[2,1]) 

你定義一個函數,kernel作爲參數,並可以直接覆蓋。

然後您嘗試使用kernel.shape這顯然不([3,1],[2,1])

顯然存在,shape是用於numpyndarray對象的方法。 因此,也許這對你的作品:

def wiener_filter(img,kernel,K = 10): 
    kernel=np.array([[3,1],[2,1]]) 

或者作爲mentionned由@Eric:

def wiener_filter(img,kernel,K = 10): 
    kernel=np.array(kernel) 
+2

更好的辦法是隻執行'kernel = np.asarray(kernel)',然後堅持從PIL導入內核 – Eric

+0

內核,K = 10: kernel = np.array([[0,1,0],[1,-4,1],[0,1,0]])但是im獲取errorTraceback(最近調用最後一次): 文件「C:\ Python27 \ deblur.py」,第21行,在 fm = wiener_filter(img,kernel) 文件「C:\ Python27 \ deblur.py」,行13,在wiener_filter中 dummy = dummy * kernel ValueError:操作數無法與形狀一起廣播(121,161,3)(121,161) –

+0

@anupchoudhary這是另一個問題, nd我不知道這個答案。你應該創建一個新的。 –

相關問題