2012-12-15 57 views
3

任何人都可以建議使用正確的FFT(實數還是複數)?我看了here但仍有問題。使用蘋果加速框架選擇實數與複數二維FFT

我想要做圖像關聯來識別主圖像中子圖像的位置。我瞭解FFT和iFFT的基本知識。

計劃:

  1. 主圖像上執行FFT。 512x512
  2. 獲取子圖像的複共軛。
  3. 對子圖像執行FFT。 30×30,但用零填充到512×512
  4. 複數乘法的兩個結果矩陣
  5. 的結果
  6. 進行IFFT
  7. 即使結果應該是(主要)實,取結果矩陣
  8. 查找最大值的大小這應該對應於最大相關性。

我很難得到我預期的結果。

如果我使用真正的2d fft(vDSP_fft2dzrip),結果是壓縮格式,使得很難使用vDSP_zvmul將其乘以兩個結果矩陣。

如果我使用複雜的fft(vDSP_fft2dzip),我根本得不到任何關聯。

蘋果示例和大多數音頻示例對正向FFT的結果不做任何處理,除了做相反的處理。

任何人都可以幫助我開始使用圖像關聯嗎?第一個問題......我可以使用複雜的FFT並避免打包格式?

回答

3

實數和複數FFT之間的唯一區別是,通過使用將2^n實數FFT變換成2 ^(n-1)複數FFT的巧妙打包方案,真實FFT可以稍微高效。兩種情況下的結果應該相同。因此,如果我是你,我會堅持使用複雜的FFT,至少在你有所有工作之前。您是否也看過vImageConvolve_ARGB8888?它似乎做你正在做什麼,用很少的努力:)

+0

我想在不確定的環境中識別路牌,當我嘗試vImageConvolve圖像的白色區域超載目標圖像。我不確定如何歸一化卷積,所以決定嘗試頻域方法。 –

+0

'vImageConvolve'函數肯定會使用頻域實現,它是實現這個算法的唯一實用方法,用於非平凡的圖像。也許你可以嘗試浮點變體,或者先縮放你的圖像? – Tark

+0

vImageConvolve的文檔說它正在做Kernel(x,y)* Pixel(x,y)/ M x N的總和。我相信它在空間模式下進行卷積運算。它將目標滑過大圖像並計算每個點的平均值。白色區域覆蓋和細節區域。我確實在兩幅圖像上嘗試了Sobel邊緣檢測,但樹木有很多邊緣,因此無法工作。 –