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%,但是噪声极大,查准率很低。该算法更适用于图像集中是否存在完全相同的图像的查询(而非近似图像的查询)。