相似圖片搜索的原理
![](http://image.woshipm.com/wp-files/img/37.jpg)
上個月,Google把“相似圖片搜索”正式放上了首頁。
你可以用一張圖片,搜索互聯(lián)網(wǎng)上所有與它相似的圖片。點擊搜索框中照相機(jī)的圖標(biāo)。
一個對話框會出現(xiàn)。
你輸入網(wǎng)片的網(wǎng)址,或者直接上傳圖片,Google就會找出與其相似的圖片。下面這張圖片是美國女演員Alyson Hannigan。
上傳后,Google返回如下結(jié)果:
類似的”相似圖片搜索引擎”還有不少,TinEye甚至可以找出照片的拍攝背景。
==========================================================
這種技術(shù)的原理是什么?計算機(jī)怎么知道兩張圖片相似呢?
根據(jù)Neal Krawetz博士的解釋,原理非常簡單易懂。我們可以用一個快速算法,就達(dá)到基本的效果。
這里的關(guān)鍵技術(shù)叫做”感知哈希算法”(Perceptual hash algorithm),它的作用是對每張圖片生成一個”指紋”(fingerprint)字符串,然后比較不同圖片的指紋。結(jié)果越接近,就說明圖片越相似。
下面是一個最簡單的實現(xiàn):
第一步,縮小尺寸。
將圖片縮小到8×8的尺寸,總共64個像素。這一步的作用是去除圖片的細(xì)節(jié),只保留結(jié)構(gòu)、明暗等基本信息,摒棄不同尺寸、比例帶來的圖片差異。
第二步,簡化色彩。
將縮小后的圖片,轉(zhuǎn)為64級灰度。也就是說,所有像素點總共只有64種顏色。
第三步,計算平均值。
計算所有64個像素的灰度平均值。
第四步,比較像素的灰度。
將每個像素的灰度,與平均值進(jìn)行比較。大于或等于平均值,記為1;小于平均值,記為0。
第五步,計算哈希值。
將上一步的比較結(jié)果,組合在一起,就構(gòu)成了一個64位的整數(shù),這就是這張圖片的指紋。組合的次序并不重要,只要保證所有圖片都采用同樣次序就行了。
=?
= 8f373714acfcf4d0
得到指紋以后,就可以對比不同的圖片,看看64位中有多少位是不一樣的。在理論上,這等同于計算“漢明距離”(Hamming distance)。如果不相同的數(shù)據(jù)位不超過5,就說明兩張圖片很相似;如果大于10,就說明這是兩張不同的圖片。
具體的代碼實現(xiàn),可以參見Wote用python語言寫的imgHash.py。代碼很短,只有53行。使用的時候,第一個參數(shù)是基準(zhǔn)圖片,第二個參數(shù)是用來比較的其他圖片所在的目錄,返回結(jié)果是兩張圖片之間不相同的數(shù)據(jù)位數(shù)量(漢明距離)。
這種算法的優(yōu)點是簡單快速,不受圖片大小縮放的影響,缺點是圖片的內(nèi)容不能變更。如果在圖片上加幾個文字,它就認(rèn)不出來了。所以,它的最佳用途是根據(jù)縮略圖,找出原圖。
實際應(yīng)用中,往往采用更強(qiáng)大的pHash算法和SIFT算法,它們能夠識別圖片的變形。只要變形程度不超過25%,它們就能匹配原圖。這些算法雖然更復(fù)雜,但是原理與上面的簡便算法是一樣的,就是先將圖片轉(zhuǎn)化成Hash字符串,然后再進(jìn)行比較。
P.S.
我在網(wǎng)站首頁加上了一些我喜歡的攝影作品,歡迎參觀。
(完)
來源:http://www.ruanyifeng.com/blog/2011/07/principle_of_similar_image_search.html
- 目前還沒評論,等你發(fā)揮!