2014-11-02 49 views
0

我嘗試使用Java中的FFT Cooley-Tukey算法獲取灰度圖像的光譜。 我不知道如何形成該算法的輸入以及要使用哪些值來形成光譜圖像。FFT圖像變換的輸入和輸出應該是什麼?

目前我的輸入是一個複數的數組,Re = 8位灰度域中的像素值,Im = 0; 運行該算法後,我獲得另一個複數數組,其中實數部分具有[0,255]範圍和虛數部分0以外的很多值。 我試圖從實數列數模256創建圖像。

這是頻譜應該是什麼樣子:enter image description here

這是我的本錢:

enter image description here

顯然I'me做一些可怕的錯誤,但我不知道是什麼。

+0

您必須發佈一些代碼,以便我們可以嘗試找出錯誤的位置,您是在編寫自己的FFT算法還是在使用庫? – KillaKem 2014-11-03 11:53:30

+0

我已經實現了從[這裏](http://example.com),用Java編寫的算法。我不知道代碼可能會如何幫助。 – mawus 2014-11-03 12:16:43

+0

該鏈接似乎被打破 – KillaKem 2014-11-03 12:51:37

回答

2

您沒有提供源代碼...

  1. 你的結果看起來像分辨率樹

    用於遞歸解析/頻率信息縮放和特徵提取不FFT! !所以,可能是你的遞歸是錯誤的,或者您重疊數據(代碼就地FFT幾乎是瘋狂),你應該先從1D變換,然後利用它來進行2D和目視檢查每一個階段(也逆變換以匹配原始數據)

  2. 您的FFT輸出應該有非零虛部!!!

    這裏看看How to compute Discrete Fourier Transform並進入我的這個答覆所有子鏈接

  3. 是你的圖像分辨率的2精確的力量?

    如果不是零填充它或FFT將無法​​正常

  4. 你的榜樣工作是錯誤

    這是怎麼看起來像在現實:

    2D FFT example

    • left是輸入圖像(c從你的問題)
    • 中間opied是真實的一部分
    • 右邊是虛部

    你可以將它們結合起來,功率譜=sqrt(Re*Re+Im*Im)重新圖像被放大,被其他人看到只有幾角落中的白色點將可見。這裏是一些例子:

    more examples

    您預期的結果看起來像移了圖像分辨率的一半(所以對稱的中心是圖像的中心,而不是在角落)

[EDIT1]功率和包裹

添加功率和封裝函數到礦井應用程序,以便在這裏是結果:

power and wrap result

首先計算功率intensity=sqrt(Re^2+Im^2),然後通過將圖像向右和向下移動一半來完成包裝。什麼是來自對方的重疊,所以只需交換所有行中的所有點swap((x,y),(x+xs/2,y)),然後對於所有列swap((x,y),(x,y+ys/2))都是相同的。現在結果與來自OP的應用程序相匹配:here