2011-04-04 189 views
1

好吧,我正在寫一個小型的Java應用程序,接受兩個圖像作爲輸入,比較它們,然後給出一個量化輸出作爲相似性度量(例如50%相似)。FFT圖像測量相似

我的理解FFT是測量兩幅圖像相似度的好方法。但是我不能因爲上帝的愛而弄清楚如何編碼/實現它。

到目前爲止,我已經實現了另一個函數,它基本上給了我兩個直方圖(每個圖像一個)。我現在需要的只是編寫一種方法,將FFT圖像並給我一個可量化的結果。

任何人都可以幫我解決這個問題嗎?我真的很想看到一些示例代碼,如果不是正確的方向,至少有一點。非常感謝提前。

回答

0

有許多很好的網站,其代碼爲一維數組的值。您只需在圖像上逐行應用此fft。之後,您會對結果進行分欄。

現在你需要一個度量來從轉換後的圖像中得到,我的建議是嘗試max-norm(L_inf)。那就是max_ {x,y} {fft2d(imag1)[x,y] - fft2d(imag2)[x,y]}。

+0

謝謝我會研究一下。有人告訴我查看JavaCV。你知道這可能會有幫助嗎? – Flynn 2011-04-04 15:24:39

1

在你嘗試編碼2DFT之前,你應該完全理解它背後的數學。 flolo是正確的,你可以通過首先對行和列進行一維FFT然後合併結果來計算它,但我沒有理由相信L_inf範數是將它們轉換爲度量的最佳方式,因爲它完全跳過通常的組合步驟來創建完整的2DFT。看看頁面底部的http://fourier.eng.hmc.edu/e101/lectures/Image_Processing/node6.html

也就是說,可能有更好的方法來比較不需要比較2D信息數組的圖像。例如,PCA(主成分分析,它只是在對圖像進行平均中心處理後對你的圖像進行SVD​​ {奇異值分解},儘管我會首先看一下它的維基百科文章)會給你一個一維向量,然後你可以直接應用一些L_p規範來進行比較,儘管在這種情況下,我會使用類似sum(min(a_i/b_i,b_i/a_i))/ length(a)的東西,其中a和b是從變換中獲得的1D向量。

2

相似性不是一個確切的術語。例如:如果你有圓和橢圓是否相似?它們都是圓形的物體,所以從這個意義上說,它們是 - 但是如果我們想過濾掉圓圈,它們就不是。您必須定義一個度量(或度量 - 例如圓度,強度分佈,大小,方向,物體數量,歐拉數等),然後計算每個圖像的尺寸。兩幅圖像的相似度將是兩個計算值之間的(某種)距離。這可能是歐氏距離(用於兩個實際測量)或某種誤差函數(用於強度分佈的RMS)。

你將不得不選擇其將應您的措施留不變(類似於原來的旋轉圖像?如果是的話,簡單的傅里葉變換是不恰當的)。如果你不得不這樣做,我會閱讀有關image stitching。如果您只需要區分BLOB-s,首先嚐試計算一些簡單的度量(我推薦計算矩 - 面積,方向;請參閱K-means clusteing),或輪廓距離質心中心的一維傅里葉變換(即更難一點)。

+0

如果你想使用直方圖作爲相似性度量,我認爲RMSD可能是一個很好的度量相似度。但我認爲直方圖不是太強大的措施。 – WebMonster 2011-04-04 15:55:09

+0

我擁有的圖像領域嚴格限制在同一個角度的汽車圖像。只有不同的照明,就方向和比例而言,變化非常小。 我也知道,直方圖是非常一般的,因爲白色房間可以具有與雪景相同的直方圖。這些只是我的程序的附加功能。 據我的理解,FFT提供了一個像樣的圖像相似度量,所以我想知道如何實現它並獲得相似性度量,最好是以某種方式從FFT結果中導出的百分比形式 – Flynn 2011-04-04 17:21:26

0

如果你只是想檢查,如果它是可能的一個形象是另一對類似股票攝影的DRM然後檢查可能的區域內的標準化調色板的比例快速編輯。如果它們在THRESHOLD中匹配NUMBER_OF_TEST_COLORS中的任何一個TEST_REGIONS,那麼你就有一個「嫌疑犯」......你仍然需要一個人來檢查嫌疑犯。但是,這是一種快速和骯髒的方式來找到許多圖像大小調整器,水平/垂直鰭狀肢,背景顏色轉換器,文件格式轉換器,以及其他細微變化......當然,「將顏色標準化」爲量化調色板本身就是一門藝術。爲了實用性,我建議將圖像量化爲最接近的「網頁安全」顏色。

與數學家相比,我是一個藍領垃圾人,但是垃圾男人很實用!我通過這種方法將相似的圖像分組和搜索彩色應用程序進行了很好的成功。