我想對圖像應用濾鏡,例如,模糊濾鏡[[1/9.0, 1/9.0, 1/9.0], [1/9.0, 1/9.0, 1/9.0], [1/9.0, 1/9.0, 1/9.0]]
。將fft2用於RGB濾鏡的變形
另外,我想使用空間域中的卷積相當於頻域中的乘法的方法。
所以,我的算法會像。
- 加載圖像。
- 創建過濾器。
- 將兩個濾鏡&轉換爲頻域。
- 兩者相乘。
- 將輸出重新轉換爲空間域,並且應該是所需的輸出。
以下是我使用的基本代碼,將圖像加載並顯示爲cv.cvmat
對象。
Image
是一類由我創造的,它有一個成員圖像這是scipy.matrix
對象和toFrequencyDomain(size = None)
使用spf.fftshift(spf.fft2(self.image, size))
其中spf
是scipy.fftpack
和dotMultiply(img)
使用scipy.multiply(self.image, image)
f = Image.fromMatrix([[1/9.0, 1/9.0, 1/9.0],
[1/9.0, 1/9.0, 1/9.0],
[1/9.0, 1/9.0, 1/9.0]])
lena = Image.fromFile("Test/images/lena.jpg")
print lena.image.shape
lenaf = lena.toFrequencyDomain(lena.image.shape)
ff = f.toFrequencyDomain(lena.image.shape)
lenafm = lenaf.dotMultiplyImage(ff)
lenaff = lenafm.toTimeDomain()
lena.display()
lenaff.display()
所以,上面的代碼工作得很好,如果我告訴OpenCV通過GRAY_SCALE加載圖片。
但是,如果我讓顏色要加載的圖像... lena.image.shape
將(512, 512, 3)
..
如此,它使用scipy.fttpack.ftt2
說"When given, Shape and Axes should be of same length"
當給我一個錯誤。
是我的嘗試下一個轉變我的過濾器,以3 d ..作爲
[[[1/9.0, 1/9.0, 1/9.0],
[1/9.0, 1/9.0, 1/9.0],
[1/9.0, 1/9.0, 1/9.0]],
[[1/9.0, 1/9.0, 1/9.0],
[1/9.0, 1/9.0, 1/9.0],
[1/9.0, 1/9.0, 1/9.0]],
[[1/9.0, 1/9.0, 1/9.0],
[1/9.0, 1/9.0, 1/9.0],
[1/9.0, 1/9.0, 1/9.0]]]
而且,不知道軸參數做什麼,我用隨機數增加一條,作爲(-2, -1, -1), (-1, -1, -2), .. etc.
直到它給了我正確的過濾dotMultiply的輸出形狀。
但是,它當然不是正確的價值。事情完全變得更糟。
我的最終試驗是在每個組件二維矩陣上使用fft2函數,然後使用以下代碼重新制作三維矩陣。
# Spiltting the 3-D matrix to three 2-D matrices.
for i, row in enumerate(self.image):
r.append(list())
g.append(list())
b.append(list())
for pixel in row:
r[i].append(pixel[0])
g[i].append(pixel[1])
b[i].append(pixel[2])
rfft = spf.fftshift(spf.fft2(r, size))
gfft = spf.fftshift(spf.fft2(g, size))
bfft = spf.fftshift(spf.fft2(b, size))
newImage.image = sp.asarray([[[rfft[i][j], gfft[i][j], bfft[i][j]] for j in xrange(len(rfft[i]))] for i in xrange(len(rfft))])
return newImage
任何幫助我做錯了什麼,或者我怎麼能達到GreyScale和彩色圖片。
是否有一個原因,你需要在頻域做這個過濾?我對這兩種方式都很感興趣,我只是好奇你爲什麼決定這麼做。 – aganders3
好吧,我們被要求在圖像處理課程實驗室的灰度級中使用它,使用MatLab很容易,所以我試圖用Python和Scipy重新制作它,所以它不想實際工作,所以我寧願讓它工作。 :D –