2011-12-27 13 views
2

我想弄清楚圖像的地理哈希方法。這很難,因爲可能的圖像的空間比lat/lng要高得多。 (地理哈希的位置轉換爲字符串,其中字符串逐步細化的位置)N張圖片之間的距離:遞增! (相同的作物,但重新壓縮/調整)

所以,我需要的是一些:

  • 輸入:JPG或PNG圖像的磁盤
  • 名單
  • 輸出:對於每個圖像,一個字符串在哪裏任意兩個圖像之間的字符串前綴的公共長度越長,這兩個圖像相同的可能性就越大。

它不需要完美,它不需要處理極端情況,如裁剪圖像或嚴重調整的圖像。它旨在用於不同分辨率和壓縮級別的同一圖像的多個副本。

我不能使用:

  • 文件或圖像數據散列,因爲兩個圖像之間甚至一個很小的變化使得一個完全不同的哈希值,你沒有得到任何接近
  • 圖像相減,因爲它不會是一個N對N的比較。

我讀過在其他的答案,試圖小波壓縮或拉普拉斯/高斯金字塔,但我不知道如何在Java或Python實現。但是,我已經取得了進展!

  1. 使用http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html調整爲32x32不丟棄數據。好吧,一切都變成了一個正方形。
  2. 創建一個連續縮小的金字塔,直到2x2。
  3. 在2x2中,編碼一串「是比當前更亮的下一個像素嗎?如果是,則爲1,否則爲0」(這會拋棄所有色調和飽和度,我可能想用某種方式使用色調)
  4. 對來自8x8和32x32金字塔的連續二進制數進行編碼
  5. 將較大的二進制數轉換爲Base62等較高的基數表示形式。

這似乎工作得很好!與壓縮或色彩平衡的細微差異不足以改變「該區域的左側比右側更亮」。但是,我認爲我正在重新發明輪子,某種漸進式編碼可能會更好? SIFT和其他功能檢測是過度殺傷,我不需要能夠處理裁剪或旋轉。

+0

我不知道我是否理解了這個問題,你輸入一個字符串,它的字符可以用來漸進地細化圖片? – 2011-12-27 18:00:05

+0

澄清問題 – 2011-12-27 19:19:53

+0

實際上,用灰度「更亮或更暗」的方法獲得相當不錯的結果!將更新最終結果 – 2012-01-06 23:25:59

回答

0

充分利用以下良好效果:

比例縮小(使用好尺度,不丟棄信息),以三幅影像: 1X7 7X1 和6x6的圖像。

將全部轉換爲灰度。

對於每個圖像,執行「是下一個象素更亮‘1’:‘0’編碼,輸出作爲base62

這些輸出成爲三列中的值尼斯依次精製差分,填充入2。字符,2個字符,和6個字符。真的,拋棄所有的顏色,但仍然不錯!

0

你所描述的在我看來是應用於圖像相似性問題的Locally Sensitive Hashing的一個例子。

我不確定公共前綴屬性對於一個好的散列函數是否可取。我期望一個好的散列函數有兩個屬性:

1)良好的定位 - 對於圖像I1和I2,範數(Hash(I1)-Hash(I2))應該表示I1和I2的視覺感知相似性。

2)良好的壓縮 - 高維圖像數據應該以最有辨別力的方式嵌入散列函數的低維空間。

+0

當然,我們可以擺脫的前綴部分,並說兩個「指紋」之間的增量是圖像的接近程度,稍微放鬆問題。隨着字符串的增長,圖像發生變化對DB索引具有優勢,但對於此問題並不重要。你有一個圖像的局部敏感散列的例子嗎? – 2012-01-03 00:30:17

+0

下面是一個:http://people.csail.mit.edu/indyk/p117-andoni.pdf – 2012-01-03 08:52:00

0

這個怎麼樣。散列字符串是由三個字符組,表示紅,綠,藍:

{R0, G0, B0}, {R1, G1, B1}, {R2, G2, B2}, ... 

對於每個組,所述圖像由2^N平方調整爲2^N。然後,該值是在某些步行通過像素時每種顏色的強度差的總和(mod,例如,255,或任何編碼)。

所以,作爲一個小例子,來計算如第1組(2×2圖像)人們可以使用下面的代碼(我只用了紅色像素打擾)

int rSum = 0; 
int rLast = 0; 
for (int i=0; i<2; i++) { 
    for (int j=0; j<2; j++) { 
    rSum += Math.abs(image[i][j].r - rLast); 
    rLast = image[i][j].r; 
    } 
} 
rSum %= 255; 

我相信這具有這樣的性質相似圖像應該彼此接近,無論是散列中的每個字符還是散列中的連續字符。儘管對於更高的N值,碰撞的可能性變得更高(許多圖像將具有相同的RG和B強度的差值和),但每次連續迭代應該揭示關於圖像的新信息這在以前的迭代中沒有經過測試。

可能在計算上相當昂貴,但您有一個優勢(根據您的問題推斷,您可能需要)只要在某個閾值內檢測到負值,您就可以結束散列計算。

只是一個想法,讓我知道如果我不清楚!

+0

我喜歡!從我所知道的情況來看,缺點是255模式 - 你會得到一些跳躍,其中一個小變化可能會將它推到一個頂部,但不是一個類似的圖像,一個假陰性。除此之外,很好! – 2012-01-03 00:28:23

+0

你是對的,但不要忘記每種顏色都是255,如果你使用模算術,那麼不應該有附近的輸入產生遠距輸出。 – gubby 2012-01-06 23:35:14