圖片相似度——hash算法簡介


一、均值hash

均值hash方法是對每幅圖片生成一個“指紋”字符串,然后通過比較不同圖片的指紋來確定圖片的相似性,比較結果越接近,則說明圖片越相似。 
計算均值hash的步驟。 
1、縮小尺寸 
去除高頻和細節的最快方法是縮小圖片,將圖片縮小到8x8的尺寸,總共64個像素。不要保持縱橫比,只需將其變成8*8的正方形。這樣就可以比較任意大小的圖片,摒棄不同尺寸、比例帶來的圖片差異。 
2、簡化色彩 
將8*8的小圖片轉換成灰度圖像,將64個像素的顏色(red,green,blue)轉換成一種顏色(黑白灰度)。 
3、計算平均值 
計算所有64個像素的灰度平均值。 
4、比較像素的灰度 
將每個像素的灰度,與平均值進行比較。大於或等於平均值,記為1;小於平均值,記為0。 
5、計算hash值 
將上一步的比較結果,組合在一起,就構成了一個64位的整數,這就是這張圖片的指紋。組合的次序並不重要,只要保證所有圖片都采用同樣次序就行了。(我設置的是從左到右,從上到下用二進制保存)。

二、感知hash(phash)

感知hash和均值hash非常相似,使用離散余弦(DCT)降低頻率。 
二維DCT變換就是將二維圖像從空間域轉換到頻率域。形象的說,就是計算出圖像由哪些二維余弦波構成,計算出的結果為c(u ,v), 其中u為二維波的水平方向頻率,v為二維波的垂直方向頻率; 最終會計算出很多的c(u,v) ; 每一個c稱為一個DCT系數,代表的是頻率為(u,v)的二維波的振幅(或者能量),所有這些二維波的疊加就是那個原始的圖片。 
 
 
計算phash的步驟: 
1、縮小尺寸 
pHash以小圖片開始,但圖片大於8*8,32*32是最好的。這樣做的目的是簡化了DCT的計算,而不是減小頻率。 
2、簡化色彩 
將圖片轉化成灰度圖像,進一步簡化計算量。 
3、計算DCT 
DCT是把圖片分解頻率聚集和梯狀形,雖然JPEG使用8*8的DCT變換,在這里使用32*32的DCT變換。 
4、縮小DCT 
雖然DCT的結果是32*32大小的矩陣,但我們只要保留左上角的8*8的矩陣,這部分呈現了圖片中的最低頻率。 
5、計算平均值 
如同均值哈希一樣,計算DCT的均值, 
6、進一步減小DCT 
這是最主要的一步,根據8*8的DCT矩陣,設置0或1的64位的hash值,大於等於DCT均值的設為”1”,小於DCT均值的設為“0”。 
7、構造hash值 
將64bit設置成64位的長整型,組合的次序並不重要,只要保證所有圖片都采用同樣次序就行了。與均值哈希一樣,pHash同樣可以用漢明距離來進行比較。(只需要比較每一位對應的位置並算計不同的位的個數)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM