顧名思義,以圖找圖就是你定一張圖片,搜索引擎幫你搜索相同或相似的圖片。以下是在tineye上搜索美國派演員艾麗森·漢尼根的結果:

類似的更神奇的,甚至可以找出照片的拍攝背景。

這種技術的原理是什么?計算機怎么知道兩張圖片相似呢?
其實方法有很多。我們先來了解一個快速算法,就能達到基本的效果。這個關鍵技術叫做"感知哈希算法"(Perceptualhash algorithm),它的作用是對每張圖片生成一個"指紋"(fingerprint)字符串,然后比較不同圖片的指紋。結果越接近,就說明圖片越相似。

下面是一個最簡單的實現(xiàn):
第一步,縮小尺寸。
將圖片縮小到8x8的尺寸,總共64個像素。這一步的作用是去除圖片的細節(jié),只保留結構、明暗等基本信息,摒棄不同尺寸、比例帶來的圖片差異。
第二步,簡化色彩。
將縮小后的圖片,轉為64級灰度。也就是說,所有像素點總共只有64種顏色。
第三步,計算平均值。
計算所有64個像素的灰度平均值。
第四步,比較像素的灰度。
將每個像素的灰度,與平均值進行比較。大于或等于平均值,記為1;小于平均值,記為0。
第五步,計算哈希值。
將上一步的比較結果,組合在一起,就構成了一個64位的整數(shù),這就是這張圖片的指紋。組合的次序并不重要,只要保證所有圖片都采用同樣次序就行了。

得到指紋以后,就可以對比不同的圖片,看看64位中有多少位是不一樣的。在理論上,這等同于計算"漢明距離"(Hamming distance)。如果不相同的數(shù)據(jù)位不超過5,就說明兩張圖片很相似;如果大于10,就說明這是兩張不同的圖片。
這種算法的優(yōu)點是簡單快速,不受圖片大小縮放的影響,缺點是圖片的內容不能變更。如果在圖片上加幾個文字,它就認不出來了。所以,它的最佳用途是根據(jù)縮略圖,找出原圖。
實際應用中,往往采用更強大的pHash算法和SIFT算法,它們能夠識別圖片的變形。只要變形程度不超過25%,它們就能匹配原圖。這些算法雖然更復雜,但是原理與上面的簡便算法是一樣的,就是先將圖片轉化成Hash字符串,然后再進行比較。

另外類似的軟件還有“百度魔圖”的明星臉PK,我用我自己女兒的照片做了實驗,結果顯示我女兒與一位童星有80%的相似度,雖然她們年齡有差距,但至少她們都是小女孩,并且她們有共同的特征,小眼睛,小臉盤,尖下巴,小酒窩,并且她們都正在笑。
那么百度魔圖是怎么做到的?憑我的猜測,可能利用了“大數(shù)據(jù)”,大數(shù)據(jù)不僅是軟件,它更是一個解決問題的思路,一個“將一個復雜作業(yè)變成成千上萬個簡單動作,然后讓一群簡單的節(jié)點并行完成這些動作”的思路”。百度魔圖就是利用了這個思路,它將一個智能比對的復雜算法分解成若干個簡單特征算法:長臉or圓臉、大眼睛or小眼睛、黑人or白人、帶不帶眼鏡、長不長胡子、是笑還是哭...等等,可能有一百多種,它將這些算法分別在你的臉上和明星的臉上進行計算(明星的臉事先已經(jīng)計算好,將特征數(shù)據(jù)存在數(shù)據(jù)庫),然后將你的特征集合和明星的特征集合利用分布式計算進行逐個比對,算出和你匹配項最多的那張明星臉(就是相似度,90%、80%、70%...)。
大數(shù)據(jù)的好處是,你可以利用海量的資源完成這件事情,我們知道圖像識別算法是非常消耗資源的。上面的第一個算法例子還只是單機的實現(xiàn),那么下面的百度魔圖就可以利用分布式的計算提高準群率,只要不斷的增加特征識別的基本算法,然后增加計算機源完成它,理論上就可以以一種無限接近方式去搜圖了。