[英]Using fft2 with reshaping for an RGB filter
我想在圖像上應用濾鏡,例如,模糊濾鏡[[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]]
。
此外,我想使用空間域中的卷積等效於頻域中的乘法的方法。
所以,我的算法就像。
以下是我使用的基本代碼,圖像被加載並顯示為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)
lena.image.shape
(512, 512, 3)
..
因此,當使用scipy.fttpack.ftt2
說"When given, Shape and Axes should be of same length"
時,它會給我一個錯誤。
我接下來嘗試的是將我的過濾器轉換為3-D .. as
[[[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的輸出形狀可以工作。
但是,當然這不是正確的價值。 事情變得更糟。
我的最終試驗是在每個組件2-D矩陣上使用fft2函數,然后使用以下代碼重新制作3-D矩陣。
# 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和彩色圖片。
最簡單的解決方案是將圖像分割成單獨的r / g / b圖像並獨立過濾每個圖像。
在最后,您將3D矩陣分成三個2D矩陣,從而朝着正確的方向前進。 這是我將如何做到的 - 顯然這是未經測試的(我沒有你的Image
類等),但它應該給你一個良好的開端:
for i, channel in enumerate(self.image):
channel_ = spf.fftshift(spf.fft2(channel)) # take FFT of each channel (r,g,b) separately
channel_ = scipy.multiply(channel_,ff) # multiply each channel by the filter (freq. domain)
filtered_image[:][:][i] = spf.fftshift(spf.ifft2(channel_)) # inverse FFT each channel separately
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.