感知哈希算法是一類哈希算法的總稱攒射,其作用在于生成每張圖像的“指紋”(fingerprint)字符串,比較不同圖像的指紋信息來判斷圖像的相似性浑度。結(jié)果越接近圖像越相似。感知哈希算法包括均值哈希(aHash)箩张、感知哈希(pHash)和dHash(差異值哈希)先慷。
aHash速度較快论熙,但精確度較低;pHash則反其道而行之脓诡,精確度較高但速度較慢祝谚;dHash兼顧二者酣衷,精確度較高且速度較快。
在得到64位hash值后穿仪,使用漢明距離量化兩張圖像的相似性啊片。漢明距離越大,圖像的相似度越小齐饮,漢明距離越小碴里,圖像的相似度越大咬腋。
漢明距離是使用在數(shù)據(jù)傳輸差錯控制編碼里面的睡互,漢明距離是一個概念,它表示兩個(相同長度)字對應(yīng)位不同的數(shù)量寇壳,我們以d(x,y)表示兩個字x,y之間的漢明距離。對兩個字符串進行異或運算泞歉,并統(tǒng)計結(jié)果為1的個數(shù)匿辩,那么這個數(shù)就是漢明距離铲球。例如:
1011101與1001001之間的漢明距離是2。
2143896與2233796之間的漢明距離是3稼病。
"toned"與"roses"之間的漢明距離是3然走。
aHash
a) 縮放圖片:為了保留圖像的結(jié)構(gòu)丰刊,降低圖像的信息量,需要去掉細(xì)節(jié)啄巧、大小和橫縱比的差異秩仆,建議把圖片統(tǒng)一縮放到8*8澄耍,共64個像素的圖片;
b) 轉(zhuǎn)化為灰度圖:把縮放后的圖片轉(zhuǎn)化為256階的灰度圖痢站;
灰度圖相關(guān)算法(R = red选酗, G = green, B = blue)
對于彩色轉(zhuǎn)灰度呜叫,其基礎(chǔ)的心理學(xué)公式為: Gray = R0.299 + G0.587 + B0.114,部分變種也很流行:
i. 浮點算法:Gray=R0.3+G0.59+B0.11
ii. 整數(shù)方法:Gray=(R30+G59+B11)/100
iii. 移位方法:Gray =(R76+G151+B28)>>8;
iv. 平均值法:Gray=(R+G+B)/3;
v. 僅取綠色:Gray=G盛泡;
c) 計算平均值: 計算進行灰度處理后圖片的所有像素點的平均值傲诵;
d) 比較像素灰度值:遍歷灰度圖片每一個像素箱硕,如果大于平均值記錄為1,否則為0殖熟;
e) 構(gòu)造hash值:組合64個bit位生成hash值斑响,順序隨意但前后保持一致性即可;
f) 對比指紋:計算兩幅圖片的指紋纽门,計算漢明距離营罢。
pHash
感知哈希算法可以獲得更精確的結(jié)果饲漾,它采用的是DCT(離散余弦變換)來降低頻率考传。
a) 縮小尺寸
為了簡化了DCT的計算,pHash以小圖片開始(建議圖片大于8x8勤晚,32x32)赐写。
b) 簡化色彩
與aHash相同膜赃,需要將圖片轉(zhuǎn)化成灰度圖像,進一步簡化計算量(具體算法見aHash算法步驟)。
c) 計算DCT
DCT是把圖片分解頻率聚集和梯狀形躺坟。這里以32x32的圖片為例咪橙。
DCT變換的全稱是離散余弦變換(Discrete Cosine Transform),主要用于將數(shù)據(jù)或圖像的壓縮产舞,能夠?qū)⒖沼虻男盘栟D(zhuǎn)換到頻域上易猫,具有良好的去相關(guān)性的性能准颓。DCT變換本身是無損的棺妓,但是在圖像編碼等領(lǐng)域給接下來的量化怜跑、哈弗曼編碼等創(chuàng)造了很好的條件,同時峡眶,由于DCT變換時對稱的幌陕,所以汽煮,我們可以在量化編碼后利用DCT反變換,在接收端恢復(fù)原始的圖像信息心例。對原始圖像進行離散余弦變換止后,變換后DCT系數(shù)能量主要集中在左上角译株,其余大部分系數(shù)接近于零歉糜,DCT具有適用于圖像壓縮的特性匪补。將變換后的DCT系數(shù)進行門限操作夯缺,將小于一定值得系數(shù)歸零踊兜,這就是圖像壓縮中的量化過程捏境,然后進行逆DCT運算,可以得到壓縮后的圖像曙砂。
離散余弦變換的原理:
一維DCT變換:
其中鸠澈,f(i)為原始的信號笑陈,F(xiàn)(u)是DCT變換后的系數(shù)涵妥,N為原始信號的點數(shù)蓬网,c(u)可以認(rèn)為是一個補償系數(shù)帆锋,可以使DCT變換矩陣為正交矩陣锯厢。
二維離散余弦變換的正變換公式為:
d) 縮小DCT
DCT的結(jié)果為32x32大小的矩陣实辑,但只需保留左上角的8x8的矩陣剪撬,這部分呈現(xiàn)了圖片中的最低頻率婿奔。
e) 計算平均值
如同均值哈希一樣萍摊,計算DCT的均值
f) 進一步減小DCT
根據(jù)8x8的DCT矩陣進行比較冰木,大于等于DCT均值的設(shè)為”1”笼恰,小于DCT均值的設(shè)為“0”踊沸。圖片的整體結(jié)構(gòu)保持不變的情況下,hash結(jié)果值不變社证。
g) 構(gòu)造hash值
組合64個bit位生成hash值逼龟,順序隨意但前后保持一致性即可。
h)對比指紋:計算兩幅圖片的指紋追葡,計算漢明距離腺律。
dHash
相比pHash,dHash的速度更快宜肉,相比aHash匀钧,dHash在效率幾乎相同的情況下的效果要更好,它是基于漸變實現(xiàn)的谬返。
a) 縮小圖片:收縮至9*8的大小之斯,它有72的像素點;
b) 轉(zhuǎn)化為灰度圖:把縮放后的圖片轉(zhuǎn)化為256階的灰度圖遣铝。(具體算法見aHash算法步驟);
c) 計算差異值:計算相鄰像素間的差異值,這樣每行9個像素之間產(chǎn)生了8個不同的差異檀何,一共8行,則產(chǎn)生了64個差異值藕甩;
d) 比較差異值:如果前一個像素的顏色強度大于第二個像素腋妙,那么差異值就設(shè)置為“1”,如果不大于第二個像素济竹,就設(shè)置“0”。
e) 構(gòu)造hash值:組合64個bit位生成hash值,順序隨意但前后保持一致性即可。
f) 對比指紋:計算兩幅圖片的指紋榆纽,計算漢明距離鸵赫。