感知雜湊演算法是一類雜湊演算法的總稱,其作用在於生成每張影象的「指紋」(fingerprint)字串,比較不同影象的指紋資訊來判斷影象的相似性。結果越接近影象越相似。感知雜湊演算法包括均值雜湊(ahash)、感知雜湊(phash)和dhash(差異值雜湊)。
ahash速度較快,但精確度較低;phash則反其道而行之,精確度較高但速度較慢;dhash兼顧二者,精確度較高且速度較快。
在得到64位hash值後,使用漢明距離量化兩張影象的相似性。漢明距離越大,影象的相似度越小,漢明距離越小,影象的相似度越大。
漢明距離是使用在資料傳輸差錯控制編碼裡面的,漢明距離是乙個概念,它表示兩個(相同長度)字對應位不同的數量,我們以d(x,y)表示兩個字x,y之間的漢明距離。對兩個字串進行異或運算,並統計結果為1的個數,那麼這個數就是漢明距離。例如:ahash1011101與1001001之間的漢明距離是2。
2143896與2233796之間的漢明距離是3。
"toned"與"roses"之間的漢明距離是3。
a) 縮放:為了保留影象的結構,降低影象的資訊量,需要去掉細節、大小和橫縱比的差異,建議把統一縮放到8*8,共64個畫素的;
b) 轉化為灰度圖:把縮放後的轉化為256階的灰度圖;
灰度圖相關演算法(r = red, g = green, b = blue)c) 計算平均值: 計算進行灰度處理後的所有畫素點的平均值;對於彩色轉灰度,其基礎的心理學公式為: gray = r0.299 + g0.587 + b0.114,部分變種也很流行:
i. 浮點演算法:gray=r0.3+g0.59+b0.11
ii. 整數方法:gray=(r30+g59+b11)/100
iii. 移位方法:gray =(r76+g151+b28)>>8;
iv. 平均值法:gray=(r+g+b)/3;
v. 僅取綠色:gray=g;
d) 比較畫素灰度值:遍歷灰度每乙個畫素,如果大於平均值記錄為1,否則為0;
e) 構造hash值:組合64個bit位生成hash值,順序隨意但前後保持一致性即可;
f) 對比指紋:計算兩幅的指紋,計算漢明距離。
phash
感知雜湊演算法可以獲得更精確的結果,它採用的是dct(離散余弦變換)來降低頻率。
a) 縮小尺寸
為了簡化了dct的計算,phash以小開始(建議大於8x8,32x32)。
b) 簡化色彩
與ahash相同,需要將轉化成灰度影象,進一步簡化計算量(具體演算法見ahash演算法步驟)。
c) 計算dct
dct是把分解頻率聚集和梯狀形。這裡以32x32的為例。
dct變換的全稱是離散余弦變換(discrete cosine transform),主要用於將資料或影象的壓縮,能夠將空域的訊號轉換到頻域上,具有良好的去相關性的效能。dct變換本身是無損的,但是在影象編碼等領域給接下來的量化、哈弗曼編碼等創造了很好的條件,同時,由於dct變換時對稱的,所以,我們可以在量化編碼後利用dct反變換,在接收端恢復原始的影象資訊。對原始影象進行離散余弦變換,變換後dct係數能量主要集中在左上角,其餘大部分係數接近於零,dct具有適用於影象壓縮的特性。將變換後的dct係數進行門限操作,將小於一定值得係數歸零,這就是影象壓縮中的量化過程,然後進行逆dct運算,可以得到壓縮後的影象。d) 縮小dct離散余弦變換的原理:
一維dct變換:
一維dct變換
其中,f(i)為原始的訊號,f(u)是dct變換後的係數,n為原始訊號的點數,c(u)可以認為是乙個補償係數,可以使dct變換矩陣為正交矩陣。
二維離散余弦變換的正變換公式為:
二維離散余弦變換
dct的結果為32x32大小的矩陣,但只需保留左上角的8x8的矩陣,這部分呈現了中的最低頻率。
e) 計算平均值
如同均值雜湊一樣,計算dct的均值
f) 進一步減小dct
根據8x8的dct矩陣進行比較,大於等於dct均值的設為」1」,小於dct均值的設為「0」。的整體結構保持不變的情況下,hash結果值不變。
g) 構造hash值
組合64個bit位生成hash值,順序隨意但前後保持一致性即可。
h)對比指紋:計算兩幅的指紋,計算漢明距離。
dhash
相比phash,dhash的速度更快,相比ahash,dhash在效率幾乎相同的情況下的效果要更好,它是基於漸變實現的。
a) 縮小:收縮至9*8的大小,它有72的畫素點;
b) 轉化為灰度圖:把縮放後的轉化為256階的灰度圖。(具體演算法見ahash演算法步驟);
c) 計算差異值:計算相鄰畫素間的差異值,這樣每行9個畫素之間產生了8個不同的差異,一共8行,則產生了64個差異值;
d) 比較差異值:如果前乙個畫素的顏色強度大於第二個畫素,那麼差異值就設定為「1」,如果不大於第二個畫素,就設定「0」。
e) 構造hash值:組合64個bit位生成hash值,順序隨意但前後保持一致性即可。
f) 對比指紋:計算兩幅的指紋,計算漢明距離。
4人點贊
日記本
感知雜湊演算法
感知雜湊演算法 perceptual hash algorithm 它的作用是對每張生成乙個 指紋 fingerprint 字串,然後比較不同的指紋。結果越接近,就說明越相似。缺點 的內容不能更改。hash演算法原理 第一步,縮小尺寸。將縮小到8 8的尺寸,總共64個畫素。這一步的作用是去除的細節,...
感知雜湊演算法
有一些搜尋引擎有搜尋相似的功能,比如google,其中是什麼原理呢?其實我們利用乙個演算法就能達到相似的效果,其中涉及到的演算法就是 感知雜湊演算法 perceptual hash algorithm 下面就簡單介紹下該演算法。1.縮小的尺寸 將縮小到8 8的尺寸,總共64個畫素,這樣做的目的是去除...
感知雜湊演算法(pHash演算法)
第一步,縮小尺寸。將縮小到8x8的尺寸,總共64個畫素。這一步的作用是去除的細節,只保留結構 明暗等基本資訊,摒棄不同尺寸 比例帶來的差異。第二步,簡化色彩。將縮小後的,轉為64級灰度。也就是說,所有畫素點總共只有64種顏色。第三步,計算平均值。計算所有64個畫素的灰度平均值。第四步,比較畫素的灰度...