”感知哈希算法”(Perceptual hash algorithm),它的作用是對每張圖片生成一個”指紋”(fingerprint)字符串,然后比較不同圖片的指紋。結果越接近,就說明圖片越相似。
優點:簡單快速,不受圖片大小縮放的影響。
缺點:圖片的內容不能更改。
主要用途:根據縮略圖找出原圖,搜索引擎中的相似圖片搜索。
Hash算法原理
第一步,縮小尺寸。
將圖片縮小到8×8的尺寸,總共64個像素。這一步的作用是去除圖片的細節,只保留結構、明暗等基本信息,摒棄不同尺寸、比例帶來的圖片差異。
第二步,簡化色彩。
將縮小后的圖片,轉為64級灰度。也就是說,所有像素點總共只有64種顏色。
第三步,計算平均值。
計算所有64個像素的灰度平均值。
第四步,比較像素的灰度。
將每個像素的灰度,與平均值進行比較。大於或等於平均值,記為1;小於平均值,記為0。
第五步,計算哈希值。
將上一步的比較結果,組合在一起,就構成了一個64位的整數,這就是這張圖片的指紋。組合的次序並不重要,只要保證所有圖片都采用同樣次序就行了。
得到指紋以后,就可以對比不同的圖片,看看64位中有多少位是不一樣的。在理論上,這等同於計算“漢明距離”(Hamming distance)。如果不相同的數據位不超過5,就說明兩張圖片很相似;如果大於10,就說明這是兩張不同的圖片。
PHash算法原理:
均值哈希雖然簡單,但受均值的影響非常大。例如對圖像進行伽馬校正或直方圖均衡就會影響均值,從而影響最終的hash值。存在一個更健壯的算法叫pHash。它將均值的方法發揮到極致。使用離散余弦變換(DCT)來獲取圖片的低頻成分。
提取過程如下:
(1)縮小尺寸:pHash以小圖片開始,但圖片大於8*8,32*32是最好的。這樣做的目的是簡化了DCT的計算,而不是減小頻率。
(2)簡化色彩:將圖片轉化成灰度圖像,進一步簡化計算量。
(3)計算DCT:計算圖片的DCT變換,得到32*32的DCT系數矩陣。
(4)縮小DCT:雖然DCT的結果是32*32大小的矩陣,但我們只要保留左上角的8*8的矩陣,這部分呈現了圖片中的最低頻率。
(5)計算平均值:如同均值哈希一樣,計算DCT的均值。
(6)計算hash值:這是最主要的一步,根據8*8的DCT矩陣,設置0或1的64位的hash值,大於等於DCT均值的設為”1”,小於DCT均值的設為“0”。組合在一起,就構成了一個64位的整數,這就是這張圖片的指紋。
結果並不能告訴我們真實性的低頻率,只能粗略地告訴我們相對於平均值頻率的相對比例。只要圖片的整體結構保持不變,hash結果值就不變。能夠避免伽馬校正或顏色直方圖被調整帶來的影響。
與均值哈希一樣,pHash同樣可以用漢明距離來進行比較。(只需要比較每一位對應的位置並算計不同的位的個數)
pHash算法和SIFT算法可以找到變形不超過25%的圖片。
相關的博文有: