相似图片搜索原理一(ahash-c++)

时间:2021-10-04 19:06:18

理论来源 http://blog.csdn.net/Lu597203933/article/details/45101859
理论部分:

理论部分主要包括以下几个步骤:

<1> 图像缩放—将图像缩放到8*8大小

<2>灰度化—对8*8大小的图像进行灰度化

<3>计算均值—计算这8*8大小图片中64个像素的均值

<4>得到8*8图像的ahash—8*8的像素值中大于均值的则用1表示,小于的用0表示,这样就得到一个64位二进制码作为该图像的ahash值。

<5>计算两幅图像ahash值的汉明距离,距离越小,表明两幅图像越相似;距离越大,表明两幅图像距离越大。
代码实现

/* ahash,全称叫做average hash,应该是phash(perceptual hash, 感知哈希)算法的一种。 主要用于由图像的缩略图搜原图,对于图像的旋转、平移、对比度和微变形等都无能为力,所以很局限。 */
#include<opencv2/opencv.hpp>
#include<bitset>
using namespace std;
using namespace cv;
#define hashlength 64
const int size = 8;
void alike(Mat_<uchar> img, bitset<hashlength> &vec){

float temp = 0;
for (int i = 0; i < size; i++){
for (int j = 0; j < size; j++){
temp += img(i, j);
}
}
float average = temp / hashlength;
cout << average << endl;
for (int i = 0; i < size; i++){
int pos = i * size;
for (int j = 0; j < size; j++){
vec[pos + j] = img(i, j) >= average ? 1 : 0;
}
}
}

int main(){
Mat img = imread(“1.jpg”);
Mat img1 = imread(“2.jpg”);

resize(img, img, Size(size, size));
cvtColor(img, img, CV_BGR2GRAY);
resize(img1, img1, Size(size, size));
cvtColor(img1, img1, CV_BGR2GRAY);

bitset<hashlength> hash_vec;
bitset<hashlength> hash_vec_;
alike(img,hash_vec);
alike(img1,hash_vec_);

int num = 0;
for (int i = 0; i < hashlength; i++){
cout << hash_vec.at(i);
}
cout << endl;
for (int i = 0; i < hashlength; i++){
cout << hash_vec_.at(i);
num += hash_vec[i] == hash_vec_[i] ? 0 : 1;
}
cout << endl;
cout << num;
cout << “相似性:” << (float)(hashlength-num )/ hashlength;
cin.get();
return 0;

}