讀古今文學網 > 刷臉背後:人臉檢測 人臉識別 人臉檢索 > 7.5 PHash算法 >

7.5 PHash算法

PHash算法(Perceptual Hash algorithm),即感知哈希算法,計算基於低頻的均值哈希。它對每一張圖像生成一個指紋字符串,進而通過該字符串比較不同圖片對應的指紋。若結果越接近,就說明圖片相似度越高。可應用於以圖搜圖的應用中。下面是我們基於OpenCV實現的算法及相關分析。本算法思想見參考文獻[3]。

7.5.1 PHash算法的使用

在Windows7環境下,使用Microsoft Visual Studio 2010開發環境,配置OpenCV2.4.9及以上版本。

該算法的項目文件名稱是「phashProject.sln」,位於「..phash」路徑下。具體操作步驟如下。

(1)打開PHash→phashProject.sln,然後打開源文件phashproject.cpp。

(2)輸入訓練數據集路徑和格式替換時可在主函數下面兩行代碼中修改:

(3)修改輸入測試數據的路徑時,應在以下代碼中修改:

sprintf(model_fileName, \"image150x200\\S001-002.jpg");

(4)輸出數據在與項目phashproject.cpp文件同一路徑下的hanmingdistance.txt文件中。

按照以上步驟提示執行phashproject.cpp文件即可。

7.5.2 PHash算法原理

Phash算法的基本原理是:首先將圖片轉換為灰度圖,再將圖片調整到32×32像素的尺寸並通過DCT變換,取左上角8×8像素的區域。然後,計算這64個像素的灰度平均值,將每個像素的灰度值與平均值進行比較,大於平均值的記為1,否則記為0,從而得到64位哈希值。

7.5.3 PHash算法實現

PHash算法的具體計算步驟如下。

(1)將輸入圖片轉換成灰度圖:

若是RGB彩色圖像,則將其轉換成灰度圖像。

(2)縮小圖片的尺寸為32×32像素:

這樣做的目的是便於DCT變換,節省運行時間。

(3)DCT(Discrete Cosine Transform)變換:

dct(image, imageDct);//DCT變換

對於一般的圖像而言,大多數DCT係數值都接近於0,因此去掉這些係數不會對重建圖像的質量產生較大的影響。這樣,利用DCT進行圖像壓縮可以節省大量的存儲空間和運行時間。

(4)縮小DCT,保留左上角8×8像素的區域:

一般來說,變換後的DCT係數值較大的會集中在區域的左上部,即低頻份量都集中在左上部。所以,我們只取左上角8×8像素的區域。

(5)計算8×8像素區域的平均值,進行像素值比較並求hash值:

計算最終DCT變換後的所有像素點(8×8)的平均值,並對每一個像素點遍歷,若像素點大於平均值,則記為1;反之,則記為0。組合成64個信息位作為該圖像的信息指紋,順序保持一致性即可。

(6)指紋(hash值)匹配:

計算兩幅圖像哈希值之間的漢明距離(兩個相同長度的哈希值之間的漢明距離)。顯然,漢明距離越大,表示圖片越不相似。

7.5.4 PHash算法的實驗數據、實驗結果及分析

1.實驗數據

實驗的輸入圖像集在項目路徑下,若需要替換圖像集,則可在主函數的前兩行進行修改。其中,第一行表示圖像的路徑名,第二行表示圖像的類型。

輸入查詢圖像的路徑:

2.實驗結果

查詢圖像如圖7-1所示。

圖7-1 查詢圖像(1)

檢索出的部分相似圖像如圖7-2所示。

圖7-2 檢索出的部分相似圖像(1)

實驗結果保存在與phashproject.cpp同一路徑下的hanming-distance.txt和fileName.txt文件內。其中,fileName.txt表示圖像集的圖像名,hanming-distance.txt中每一行表示對應圖像與查詢圖像的漢明距離。部分結果如表7-1所示。

表7-1 部分實驗結果(1)

續表

續表

3.實驗分析

相似圖像的相似度(漢明距離)大多在小於等於5的範圍內。本算法中我們設置的閾值為6,也就是說,凡是漢明距離小於6的,都被我們認為是相似圖像,並輸出「yes」作標記。本算法中查准率為40/48×100%=83.3%,查全率為40/42×100%=95.2%。