最簡(jiǎn)單的搜索算法:均值hash
其工作流程如下:
- 縮小尺寸: 去除高頻和細(xì)節(jié)的最快方法是縮小圖片孝治,將圖片縮小到8x8的尺寸审磁,總共64個(gè)像素。不要保持縱橫比杭措,只需將其變成8*8的正方形钾恢。這樣就可以比較任意大小的圖片,摒棄不同尺寸赘那、比例帶來的圖片差異。
- 簡(jiǎn)化色彩: 將8*8的小圖片轉(zhuǎn)換成灰度圖像。
- 計(jì)算平均值: 計(jì)算所有64個(gè)像素的灰度平均值拱礁。
- 比較像素的灰度: 將每個(gè)像素的灰度辕漂,與平均值進(jìn)行比較。大于或等于平均值鸯乃,記為1跋涣;小于平均值鸟悴,記為0奖年。
- 計(jì)算hash值: 將上一步的比較結(jié)果,組合在一起陋守,就構(gòu)成了一個(gè)64位的整數(shù)水评,這就是這張圖片的指紋。組合的次序并不重要中燥,只要保證所有圖片都采用同樣次序就行了。
一點(diǎn)解釋: 如果圖片放大或縮小幽纷,或改變縱橫比博敬,結(jié)果值也不會(huì)改變。增加或減少亮度或?qū)Ρ榷仁栈郑蚋淖冾伾?strong>對(duì)hash值都不會(huì)太大的影響祭往。
最大優(yōu)點(diǎn):-----計(jì)算速度快!
那么完成了以上步驟,一張圖片就相當(dāng)于有了自己的"指紋"了,然后就是計(jì)算不同位的個(gè)數(shù)---漢明距離了
如果漢明距離小于5驮肉,則表示有些不同已骇,但比較相近,如果漢明距離大于10則表明完全不同的圖片卵渴。
缺點(diǎn): 但受均值的影響非常大鲤竹。如對(duì)圖像進(jìn)行伽馬校正或直方圖均衡就會(huì)影響均值,從而影響最終的hash值碘橘。
改良版:pHash
pHash的工作過程如下:
(1)縮小尺寸:pHash以小圖片開始,但圖片大于88蛹屿,3232是最好的错负。這樣做的目的是簡(jiǎn)化了DCT的計(jì)算,而不是減小頻率犹撒。
(2)簡(jiǎn)化色彩:將圖片轉(zhuǎn)化成灰度圖像识颊,進(jìn)一步簡(jiǎn)化計(jì)算量。
(3)計(jì)算DCT:計(jì)算圖片的DCT變換祥款,得到32*32的DCT系數(shù)矩陣。
(4)縮小DCT:雖然DCT的結(jié)果是3232大小的矩陣抠艾,但我們只要保留左上角的88的矩陣桨昙,這部分呈現(xiàn)了圖片中的最低頻率。
(5)計(jì)算平均值:如同均值哈希一樣齐苛,計(jì)算DCT的均值桂塞。
(6)計(jì)算hash值:這是最主要的一步,根據(jù)8*8的DCT矩陣炊甲,設(shè)置0或1的64位的hash值欲芹,大于等于DCT均值的設(shè)為”1”吟吝,小于DCT均值的設(shè)為“0”。組合在一起浙宜,就構(gòu)成了一個(gè)64位的整數(shù),這就是這張圖片的指紋粟瞬。
優(yōu)點(diǎn):只要圖片的整體結(jié)構(gòu)保持不變裙品,hash結(jié)果值就不變。能夠避免伽馬校正或顏色直方圖被調(diào)整帶來的影響市怎。
與均值哈希一樣区匠,pHash同樣可以用漢明距離來進(jìn)行比較。