以圖搜圖

以圖搜圖,查找類似圖片

點擊搜圖,上傳圖片,會找出與之相似的圖片(google搜圖,百度搜圖),圖片相似度越高就越排在前面。

根據Neal Krawetz博士的解釋,實現相似圖片搜索的關鍵技術叫做“感知哈希算法”(Perceptualhash algorithm),它的作用是對每張圖片生成一個“指紋”(fingerprint)字符串,然後比較不同圖片的指紋,結果越相近,就說明圖片越相似。

從網上看到一個簡單的java實現,如下:

首先,預處理:讀取圖片

第一步,縮小尺寸

將圖片縮小到8x8的尺寸,總共64個像素。這一步的作用是去除圖片的細節,只保留結構、明暗信息等基本信息,摒棄不同尺寸、比例帶來的圖片差異。

第二步,簡化色彩

將縮小後的圖片,轉爲64級灰度。也就是說,所有像素點總共只有64種顏色。

第三步,計算平均值

計算所有64個像素的灰度平均值。

第四步,比較像素的灰度。

將每個像素的灰度,與平均值進行比較。大於或等於平均值,記爲1;小於平均值,記爲0.

第五步,計算哈希值。

將上一步的比較結果,組合在一起,就構成了一個64位的整數,這就是這張圖片的指紋。組合的次序並不重要,只要保證所有圖片都採用同樣的次序就行了。

得到指紋後,就可以對比不同的圖片,看看64位中有多少位是不一樣的。在理論上,這等同於計算“漢明距離”(Hammingdistance)。如果不相同的數據位不超過5,就說明兩張圖片很相似;如果大於10,就說明這是兩張不同的圖片。可以將幾張圖放在一起,也計算出其漢明距離對比,就可以看看兩張圖片是否相似。

該算法的優點:快速簡單,不受圖片大小縮放的影響,缺點是圖片的內容不能變更。如果在圖片上加幾個文字,它就認不出來。所以,其最佳用途是根據縮略圖,找出原圖。

實際中,往往採用更強大的pHash算法和SIFT算法,他們能夠識別圖片的變形。只要變形程度不超過25%,他們就能匹配原圖。這些算法雖然更復雜,但是原理與上面的簡便算法是一樣的,就是先將圖片轉化成Hash字符串,然後進行比較。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章