感知哈希算法


  ”感知哈希算法”(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%的圖片。

相關的博文有:

基於哈希算法的視覺目標跟蹤

看起來像它——圖像搜索其實也不難

相似圖片搜索原理 

TinEye圖片檢索網站

谷歌圖片搜索引擎

百度基於深度學習的百度識圖


免責聲明!

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



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