2014-02-14 101 views
5

我們有一個圖像數據庫,其中我使用Dr. Neal Krawetz's method來計算PHASH,如David Oftedal所示。使用SOLR計算兩個長度之間的「相似度」/「位數」

的示例代碼部分計算這些多頭的區別就在這裏:

ulong hash1 = AverageHash(theImage); 
ulong hash2 = AverageHash(theOtherImage); 

uint BitCount(ulong theNumber) 
{ 
    uint count = 0; 
    for (; theNumber > 0; theNumber >>= 8) { 
     count += bitCounts[(theNumber & 0xFF)]; 
    } 
    return count; 
} 

Console.WriteLine("Similarity: " + ((64 - BitCount(hash1^hash2)) * 100.0)/64.0 + "%"); 

的挑戰是,我只知道這些散列之一,我想查詢SOLR找到其他哈希以相似度順序。

的幾個注意事項:

  1. 使用SOLR這裏(只有我的選擇是HBASE)
  2. 想要避免安裝任何定製Java到Solr的(高興地安裝現有的插件)
  3. 快樂做大量的前期處理的C#
  4. 樂於使用多個字段,以數​​據存儲爲一個位串,長等
  5. 使用SOLRNet作爲客戶端

編輯,一些額外的信息(道歉我陷入了問題,並開始假設它是一個廣爲人知的領域)。這裏是一個直接下載到C#控制檯/樣品應用程式:http://01101001.net/Imghash.zip

此控制檯應用程序的一個例子輸出將是:

004143737f7f7f7f phash試驗001.JPG
0041417f7f7f7f7f phash - 測試 - 002.JPG
相似度:95.3125%

+0

如果比較,你可以給兩個哈希值和期望的結果嗎?我對PHASH不太熟悉。 – cheffe

+0

@cheffe添加了一些關於PHASH的信息,基本上它將一個圖像變成一個無符號的long/uint64,並對結果進行位計數以確定相似性。讓我知道如果還有什麼不清楚的地方! – CameraSchoolDropout

回答

3

您可以使用Solr's Fuzzy Search這一點,你需要向下滾動頁面上的位。

Solr的標準查詢解析器支持基於Levenshtein Distance或Edit Distance算法的模糊搜索。模糊搜索發現類似於指定術語的術語,而不一定完全匹配。要執行模糊搜索,請在單詞術語末尾使用代字符〜符號。

假設您有像下面這樣的模式,其中此字段phash包含您計算的phash。

<fields> 
    <!-- ... all your other fields ... --> 
    <field name="phash" type="string" indexed="true" stored="true" /> 
</fields> 

你可能想

q=phash:004143737f7f7f7f~0.8& 
fl=score,phash 

此執行查詢將返回具有至少80%Levenshtein Distance or Edit Distance一個PHASH所有文檔。你不會得到你在問題中給出的95.3125%,但是匹配/不匹配字符的數量是87.5%。

當你想看到的值,你可以執行以下查詢

q=phash:004143737f7f7f7f~0.8& 
fl=score,phash,strdist("0041417f7f7f7f7f", phash, edit) 

這是一個function call to fetch the String Distance使用萊文施泰因或編輯距離,將提供類似

+----------------+---------------------------------------+ 
|hash   |strdist("0041417f7f7f7f7f", hash, edit)| 
+----------------+---------------------------------------+ 
|0041417f7f7f7f7f|1.0         | 
+----------------+---------------------------------------+ 
|004143737f7f7f7f|0.875         | 
+----------------+---------------------------------------+ 

當結果你想減少95.3125%87,5%之間的差距,你應該考慮將PHASH存儲爲不是十六進制值,而是例如八進制值。

+0

謝謝@cheffe - 我現在會測試這個,以提高字符比字節更進一步,如果使用像這樣的單個字符串是有意義的:0000000001000001010000110111001101111111011111110111111101111111,我試圖儘可能接近像bitcount例。 (儘管我非常高興SOLR能夠讓我獲得90%的通路,並通過C#中的其餘工作) – CameraSchoolDropout

+0

感謝您的答覆 - 就像上述方法一樣,上述方法可以與bitcount算法完全匹配。 – CameraSchoolDropout

相關問題