簡體   English   中英

使用fft2重塑整形RGB濾鏡

[英]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]]

此外,我想使用空間域中的卷積等效於頻域中的乘法的方法。

所以,我的算法就像。

  1. 加載圖片。
  2. 創建過濾器。
  3. 將過濾器和圖像轉換為頻域。
  4. 兩者相乘。
  5. 將輸出重新轉換為空間域,這應該是所需的輸出。

以下是我使用的基本代碼,圖像被加載並顯示為cv.cvmat對象。

Image是我的一個類,它有一個成員圖像,它是scipy.matrix的對象, toFrequencyDomain(size = None)使用spf.fftshift(spf.fft2(self.image, size)) ,其中spfscipy.fftpackdotMultiply(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM