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

7.6 DHash算法

DHash(Difference Hash)算法基於漸變實現,它工作在相鄰像素之間。首先需要將圖像縮小到8×9(行×列)像素大小,再將圖像進行灰度化。每行9個像素之間產生了8個不同的差異,一共8行,共產生64個差異值。若左邊像素比右邊像素更亮,則記為1,否則記為0。因此,我們就得到了圖像對應的64位哈希值。本節內容將介紹DHash的算法實現和相關分析。

7.6.1 DHash算法的使用

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

該算法對應的項目名稱為「dhashProject.sln」,位於「..\dhash」目錄下。

該算法的具體使用步驟如下:

(1)打開dhashProject文件夾,使用Visual Studio 2010打開dhashProject.sln。然後,打開項目下的源文件dhash.cpp。

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

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

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

按照以上步驟提示執行即可。

7.6.2 DHash算法原理

DHash算法是基於圖像相鄰像素之間的漸變。第一步,將圖像尺度歸一化,本算法中我們將圖像縮放至8×9(行×列)像素。當然,讀者也可以根據自己的情況設定大小。第二步,將圖像灰度化。第三步,計算圖像的哈希值。如果左邊的像素值比右邊相鄰的像素值高,則記為1;反之,則記為0。每行的9個像素產生8個差異值,一共8行,最後產生64個差異值。第四步,利用漢明距離進行相似性匹配。

其中,漢明距離是從一個哈希值到另一個哈希值需要替換(不相同)的位數。

7.6.3 DHash算法實現

下面介紹一下DHash算法實現的具體步驟。

1.縮小圖像

resize(image1, image, Size(9,8));

縮小圖像的尺寸為8×9(行×列)像素。

2.轉化成灰度圖

將第一步得到的圖像轉化成256階的灰度圖(此步驟已在讀取圖像時執行)。

3.計算哈希值

首先DHash算法是基於漸變的,因此它工作在相鄰像素之間。如果左邊的像素值比右邊相鄰的像素值高,則記為1;反之,則記為0。每行的9個像素產生8個差異值,一共8行,最後產生64個差異值。

4.指紋(hash值)匹配

計算兩張圖像哈希值之間的漢明距離(從一個哈希值到另一個哈希值需要變幾位,即不同的位數)。顯然,漢明距離越大,表示圖片越不相似。

7.6.4 DHash算法的實驗數據、實驗結果及分析

1.實驗數據

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

輸入的查詢圖像在.cpp文件主函數中的代碼中:

2.實驗結果

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

圖7-3 查詢圖像(2)

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

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

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

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

續表

續表

3.實驗分析

算法中我們設置的漢明距離的閾值為3。所得到的實驗結果,查全率為28/42×100%=67.7%,但是噪聲極大,查准率很低。該算法更適用於圖像集中是否存在完全相同的圖像的查詢(而非近似圖像的查詢)。