我嘗試使用Java中的FFT Cooley-Tukey算法獲取灰度圖像的光譜。 我不知道如何形成該算法的輸入以及要使用哪些值來形成光譜圖像。FFT圖像變換的輸入和輸出應該是什麼?
目前我的輸入是一個複數的數組,Re = 8位灰度域中的像素值,Im = 0; 運行該算法後,我獲得另一個複數數組,其中實數部分具有[0,255]範圍和虛數部分0以外的很多值。 我試圖從實數列數模256創建圖像。
這是頻譜應該是什麼樣子:
這是我的本錢:
顯然I'me做一些可怕的錯誤,但我不知道是什麼。
我嘗試使用Java中的FFT Cooley-Tukey算法獲取灰度圖像的光譜。 我不知道如何形成該算法的輸入以及要使用哪些值來形成光譜圖像。FFT圖像變換的輸入和輸出應該是什麼?
目前我的輸入是一個複數的數組,Re = 8位灰度域中的像素值,Im = 0; 運行該算法後,我獲得另一個複數數組,其中實數部分具有[0,255]範圍和虛數部分0以外的很多值。 我試圖從實數列數模256創建圖像。
這是頻譜應該是什麼樣子:
這是我的本錢:
顯然I'me做一些可怕的錯誤,但我不知道是什麼。
您沒有提供源代碼...
你的結果看起來像分辨率樹
用於遞歸解析/頻率信息縮放和特徵提取不FFT! !所以,可能是你的遞歸是錯誤的,或者您重疊數據(代碼就地FFT幾乎是瘋狂),你應該先從1D變換,然後利用它來進行2D和目視檢查每一個階段(也逆變換以匹配原始數據)
您的FFT輸出應該有非零虛部!!!
這裏看看How to compute Discrete Fourier Transform並進入我的這個答覆所有子鏈接
是你的圖像分辨率的2精確的力量?
如果不是零填充它或FFT將無法正常
你的榜樣工作是錯誤
這是怎麼看起來像在現實:
你可以將它們結合起來,功率譜=sqrt(Re*Re+Im*Im)
的重新和林圖像被放大,被其他人看到只有幾角落中的白色點將可見。這裏是一些例子:
您預期的結果看起來像移了圖像分辨率的一半(所以對稱的中心是圖像的中心,而不是在角落)
[EDIT1]功率和包裹
添加功率和封裝函數到礦井應用程序,以便在這裏是結果:
首先計算功率intensity=sqrt(Re^2+Im^2)
,然後通過將圖像向右和向下移動一半來完成包裝。什麼是來自對方的重疊,所以只需交換所有行中的所有點swap((x,y),(x+xs/2,y))
,然後對於所有列swap((x,y),(x,y+ys/2))
都是相同的。現在結果與來自OP的應用程序相匹配:here
您必須發佈一些代碼,以便我們可以嘗試找出錯誤的位置,您是在編寫自己的FFT算法還是在使用庫? – KillaKem 2014-11-03 11:53:30
我已經實現了從[這裏](http://example.com),用Java編寫的算法。我不知道代碼可能會如何幫助。 – mawus 2014-11-03 12:16:43
該鏈接似乎被打破 – KillaKem 2014-11-03 12:51:37