大家都用google或baidu的識(shí)圖功能,上面就是我搜索一幅圖片的結(jié)果,該引擎實(shí)現(xiàn)相似圖片搜素的關(guān)鍵技術(shù)叫做“感知哈希算法”(Perceptual hash algorithm),它的作用是對(duì)每張圖片生成一個(gè)“指紋”(fingerprint)字符串,然后比較不同圖片的指紋。結(jié)果越接近,就說(shuō)明圖片越相似。達(dá)到圖片比較目的且利用信息指紋比較有三種算法,這些算法都很易懂,下面分別介紹一下:
1、基于低頻的均值哈希
一張圖片就是一個(gè)二維信號(hào),它包含了不同頻率的成分。如下圖所示,亮度變化小的區(qū)域是低頻成分,它描述大范圍的信息。而亮度變化劇烈的區(qū)域(比如物體的邊緣)就是高頻的成分,它描述具體的細(xì)節(jié)。或者說(shuō)高頻可以提供圖片詳細(xì)的信息,而低頻可以提供一個(gè)框架。
而一張大的,詳細(xì)的圖片有很高的頻率,而小圖片缺乏圖像細(xì)節(jié),所以都是低頻的。所以我們平時(shí)的下采樣,也就是縮小圖片的過(guò)程,實(shí)際上是損失高頻信息的過(guò)程。下面5張圖依次是原圖,放縮至64*64、32*32、16*16、8*8的圖。
均值哈希算法主要是利用圖片的低頻信息,其工作過(guò)程如下:
(1)縮小尺寸:去除高頻和細(xì)節(jié)的最快方法是縮小圖片,將圖片縮小到8x8的尺寸,總共64個(gè)像素。不要保持縱橫比,只需將其變成8*8的正方形。這樣就可以比較任意大小的圖片,摒棄不同尺寸、比例帶來(lái)的圖片差異。
(2)簡(jiǎn)化色彩:將8*8的小圖片轉(zhuǎn)換成灰度圖像。
(3)計(jì)算平均值:計(jì)算所有64個(gè)像素的灰度平均值。
(4)比較像素的灰度:將每個(gè)像素的灰度,與平均值進(jìn)行比較。大于或等于平均值,記為1;小于平均值,記為0。
(5)計(jì)算hash值:將上一步的比較結(jié)果,組合在一起,就構(gòu)成了一個(gè)64位的整數(shù),這就是這張圖片的指紋。組合的次序并不重要,只要保證所有圖片都采用同樣次序就行了。(我設(shè)置的是從左到右,從上到下用二進(jìn)制保存)。