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

理論來源 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;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章