感知哈希算法是一种匹配大量图片的方法,速度很快,也很容易理解,它大致上的思想就是用一个字符串来表征一副图像,然后比较两个字符串间的汉明距离,汉明距离小的将其匹配。
感知哈希算法步骤:
(1)将原图像缩小成8*8的大小(具体可以按照需要设计,越小越快,但精度会损失)。
(2)图像转化成灰度图像。
(3)将灰度图像的图像空间缩小成64位。
(4)计算缩小后的图像的平均灰度值。
(5)将每一个像素与平均灰度值进行比较,大的设置为1,小的设置为0(反之亦可,只需要前后对应即可)。
(6)在步骤(5)中我们会得到一个8*8=64的一个字符串,这就是这幅图像的哈希值,接下来就直接计算两幅图像哈希值的汉明距离,设置一个阈值,将汉明距离大与阈值的看成不匹配,将小于阈值的看成匹配。
Mat tempImage = imread("xx");
QString hashNum;
cv::resize(tempImage,tempImage,Size(8,8));
cvtColor(tempImage,tempImage,CV_BGR2GRAY);
//lookUpTable为一个查表,将图像空间由256位缩小到64位
LUT(tempImage,this->lookUpTable,tempImage);
double meanValue = mean(tempImage).val[0]; //计算平均灰度
for(int row=0;row < 8;row++)
{
//得到hashNum
for(int col=0;col < 8;col++)
{
if(meanValue <= (double)tempImage.at<uchar>(row,col))
{
hashNum.append('1');
}
else
{
hashNum.append('0');
}
}
}
//计算两个hashNum的汉明距离
int count = 0;
for(int index=0;index < 64;index++)
{
if(str1.at(index) != str2.at(index))
{
count++;
}
}