老司機放招:以圖搜圖到底是怎麼回事?

想象這樣一個場景,你在逛貼吧的時候得到一張圖片,是這樣子的。

你的好奇心來了,很想知道她是誰,有什麼車牌號或者作品可以學習學習。咋辦呢,手裡頭只有一張圖,其它信息沒有,百度一下看來幫不了你。

於是去請教老司機,他向你推薦了以圖搜圖的搜索引擎。顧名思義,上傳一張圖片,它就能幫你找到類似的圖片或者圖片的出處。類似這樣子:

果然有效果!於是你通過以圖搜圖的方法,找到了圖片上美女的信息,還順藤摸瓜的找到了她的作品,後面的事情就不用說了。現在的互聯網真是強大,只要有一點點線索,就能把一個人的老底翻個遍。

感嘆之餘,我們來看下以圖搜圖是什麼原理吧。

其實說起搜索,就是一個匹配的過程。你伺服器上存了互聯網上幾乎所有的網頁,這些網頁絕大部分都是由文本構成的。當你以某個關鍵詞查找的時候,只需要一一比對(當然這裡為了速度會用到「倒排索引」等高深的演算法),只要找出能夠匹配的內容即可。

Advertisements

文本信息的匹配很簡單,但是換成圖片就不一樣了。以圖搜圖面臨的首要問題,就是如何判斷兩張圖片是相似的。最簡單的辦法是,圖片本身就是二進位數據,可以通過比對二進位數據來判斷。但這樣做要求的精度太高,圖片的格式不一樣,尺寸不一樣,相應的二進位數據天壤之別,所以幾乎是不可行的。從另一個角度講,如果按二進位比對,每張圖片都要保存它原始的二進位數據,互聯網上的圖片是海量的,這個存儲壓力一般人扛不住。

有一個演算法可以做到,叫「感知哈希演算法」。顧名思義,它仿照人眼對圖片相似的判斷,只需要輪廓、大體顏色一致,就認為兩張圖片是相似的,至於圖片是什麼格式,大小如何,在比較的時候都排除在外。

1、把圖片縮小成8*8,縮小之後,整個圖片就變模糊了,但是基本的結構還在。這就人為降低了匹配的精度,要的就是這種效果。

Advertisements

2、把圖片的顏色信息轉化成64階灰度。怎麼理解呢?現在既然圖片壓縮成了8*8大小,一共64個像素,這樣只需要64個等級,就能表示每個像素的顏色強弱。我們的目標是比較顏色的相對強弱,並不關心每個像素原來是紅色還是黃色。

3、計算所有像素的灰度的平均值,然後記錄信息,每個像素,大於均值的標1,小均值的標0,最後形成一個64個bit的二進位數,這個數就是這張圖的hash值。這樣做的好處是存儲空間大大降低了。最後的結果是:

1100000011000001111000011110100011111101111010011110100111100000

4、兩張圖進行對比的時候,對比他們的hash值,如果64位里,相同的越多,越相似。

感知哈希演算法說簡單其實很簡單,它把圖片的大致結構,大致顏色抽出來,做成一個數字,既容易存儲,又容易比較,而且效果還不錯。發散一下,感知哈希演算法如果拿來鑒別小黃圖,應該也不錯。

解決了比較的問題,剩下的,就是搜索引擎的老一套了,輸入,對比,展示相似的結果。

Advertisements

你可能會喜歡