理论来源 http://blog.csdn.net/lu597203933/article/details/45798293
理论部分:
理论部分主要包括以下几个步骤:
<1> 图像缩放—将图像缩放到32*32大小
<2>灰度化—对32*32大小的图像进行灰度化
<3>离散余弦变换(DCT)—对32*32大小图像进行DCT
<4>计算均值—用32*32大小图片前面8*8大小图片处理并计算这64个像素的均值
<4>得到8*8图像的phash—8*8的像素值中大于均值的则用1表示,小于的用0表示,这样就得到一个64位二进制码作为该图像的phash值。
<5>计算两幅图像ahash值的汉明距离,距离越小,表明两幅图像越相似;距离越大,表明两幅图像距离越大。
这样做能够避免伽马校正或者颜色直方图调整带来的影响。
代码实现
using namespace std;
using namespace cv;
?#define phashlength 64 //去掉问好
const int size = 32;
float calc_dct_average(Mat_ img){
float sum = 0;
for (int i = 0; i < 8; i++){
for (int j = 0; j < 8; j++){
sum += img(i, j);
}
}
return sum / 64;
}
voi