2016-11-25 110 views
1

我想在python中實現一些將圖像轉換爲其傅立葉域的功能,反之亦然,以實現圖像處理任務。
我使用重複的1D-DFT實現了2D-DFT,並且它工作得很好,但是當我試圖使用重複的反向1D-DFT實現2D反向DFT時,出現了一些奇怪的問題 - 當我將圖像轉換爲其傅里葉域時,然後再返回到圖像域,它看起來像圖像被反射,並與它的反射合併,如在這裏可以看到:使用1D變換實現二維逆傅里葉變換

這是輸入:

img

這就是輸出

img

這是負責亂七八糟的功能:

def IDFT2(fourier_image): 
    image = np.zeros(fourier_image.shape) 
    for col in range(image.shape[1]): 
     image[:, col] = IDFT1(fourier_image[:, col]) 

    for row in range(image.shape[0]): 
     image[row, :] = IDFT1(image[row,:]) 

    return image 

我做了什麼錯?我非常肯定IDFT1可以正常工作,常規2D-DFT也是如此。

+0

爲什麼你有你的結果IDFT1(fourier_image [:,col])列和IDFT1(圖像[行,:])行而不是IDFT1(fourier_image [row,:])?請爲IDFT1提供您的代碼。 – DimKoim

+0

據我所知,在第二階段(行),我需要操作上一階段的輸出(colums通過)。我錯了嗎? –

+0

@montecarlo您可能錯誤地編輯了圖像(我將它們添加回來)。在標記代碼中,'![bla bla] [1]'意味着從鏈接列表中首次鏈接到圖像。 '!'表示沒有它的圖像只是鏈接 – Spektre

回答

2

我不使用Python的所以我不自信來分析你的代碼,但我敢打賭,你最有可能忘記在某個階段實現複雜的價值觀....

它應該是:

  1. DFT從實際行到複雜域
  2. DFT結果列從複雜到複雜域
  3. 如果需要
  4. 任何或沒有處理...
  5. 的iDFT行從複雜到複雜域
  6. 的iDFT結果列從複雜到真實域名應用規範化
  7. 如果需要
  8. 應用規範化

如果您僅使用真實複雜域DFT/iDFT在第二次通過(項目符號#2,#6),那麼它會創建鏡像,因爲DFT真實值是一個鏡像序列... Btw。如果您先處理行或列,則無關緊要...您也可以先在DFT和列中首先處理行iDFT結果應該相同+/-浮動錯誤...

更多信息請參見

和所有的子鏈接有特別的2D FFT and wrapping example這樣你可以比較的東西的工作

+0

你是最正確的!行'np.real(signal).astype(np.float32)'將複數轉換爲真正的複數。刪除該行解決了問題。 –

+0

@NadavBorenstein樂於幫助 – Spektre