網上看了兩篇很是不錯的圖片類似搜索的文章,轉載以下:php
上個月,Google把"類似圖片搜索"正式放上了首頁。html
你能夠用一張圖片,搜索互聯網上全部與它類似的圖片。點擊搜索框中照相機的圖標。python
一個對話框會出現。算法
你輸入網片的網址,或者直接上傳圖片,Google就會找出與其類似的圖片。下面這張圖片是美國女演員Alyson Hannigan。ide
上傳後,Google返回以下結果:搜索引擎
相似的"類似圖片搜索引擎"還有很多,TinEye甚至能夠找出照片的拍攝背景。google
==========================================================orm
這種技術的原理是什麼?計算機怎麼知道兩張圖片類似呢?htm
根據Neal Krawetz博士的解釋,原理很是簡單易懂。咱們能夠用一個快速算法,就達到基本的效果。blog
這裏的關鍵技術叫作"感知哈希算法"(Perceptual hash algorithm),它的做用是對每張圖片生成一個"指紋"(fingerprint)字符串,而後比較不一樣圖片的指紋。結果越接近,就說明圖片越類似。
下面是一個最簡單的實現:
第一步,縮小尺寸。
將圖片縮小到8x8的尺寸,總共64個像素。這一步的做用是去除圖片的細節,只保留結構、明暗等基本信息,摒棄不一樣尺寸、比例帶來的圖片差別。
第二步,簡化色彩。
將縮小後的圖片,轉爲64級灰度。也就是說,全部像素點總共只有64種顏色。
第三步,計算平均值。
計算全部64個像素的灰度平均值。
第四步,比較像素的灰度。
將每一個像素的灰度,與平均值進行比較。大於或等於平均值,記爲1;小於平均值,記爲0。
第五步,計算哈希值。
將上一步的比較結果,組合在一塊兒,就構成了一個64位的整數,這就是這張圖片的指紋。組合的次序並不重要,只要保證全部圖片都採用一樣次序就好了。
= = 8f373714acfcf4d0
獲得指紋之後,就能夠對比不一樣的圖片,看看64位中有多少位是不同的。在理論上,這等同於計算"漢明距離"(Hamming distance)。若是不相同的數據位不超過5,就說明兩張圖片很類似;若是大於10,就說明這是兩張不一樣的圖片。
具體的代碼實現,能夠參見Wote用python語言寫的imgHash.py。代碼很短,只有53行。使用的時候,第一個參數是基準圖片,第二個參數是用來比較的其餘圖片所在的目錄,返回結果是兩張圖片之間不相同的數據位數量(漢明距離)。
這種算法的優勢是簡單快速,不受圖片大小縮放的影響,缺點是圖片的內容不能變動。若是在圖片上加幾個文字,它就認不出來了。因此,它的最佳用途是根據縮略圖,找出原圖。
實際應用中,每每採用更強大的pHash算法和SIFT算法,它們可以識別圖片的變形。只要變形程度不超過25%,它們就能匹配原圖。這些算法雖然更復雜,可是原理與上面的簡便算法是同樣的,就是先將圖片轉化成Hash字符串,而後再進行比較。