国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

opencv3/C++ PHash算法圖像檢索詳解

2020-01-26 13:22:51
字體:
來源:轉載
供稿:網友

PHash算法即感知哈希算法/Perceptual Hash algorithm,計算基于低頻的均值哈希.對每張圖像生成一個指紋字符串,通過對該字符串比較可以判斷圖像間的相似度.

PHash算法原理

將圖像轉為灰度圖,然后將圖片大小調整為32*32像素并通過DCT變換,取左上角的8*8像素區域。然后計算這64個像素的灰度值的均值。將每個像素的灰度值與均值對比,大于均值記為1,小于均值記為0,得到64位哈希值。

PHash算法實現

將圖片轉為灰度值

將圖片尺寸縮小為32*32

resize(src, src, Size(32, 32));

DCT變換

 Mat srcDCT;  dct(src, srcDCT);

計算DCT左上角8*8像素區域均值,求hash值

 double sum = 0; for (int i = 0; i < 8; i++)  for (int j = 0; j < 8; j++)   sum += srcDCT.at<float>(i,j); double average = sum/64; Mat phashcode= Mat::zeros(Size(8, 8), CV_8U); for (int i = 0; i < 8; i++)  for (int j = 0; j < 8; j++)   phashcode.at<char>(i,j) = srcDCT.at<float>(i,j) > average ? 1:0;

hash值匹配

  int d = 0;  for (int n = 0; n < srchash.size[1]; n++)   if (srchash.at<uchar>(0,n) != dsthash.at<uchar>(0,n)) d++; 

即,計算兩幅圖哈希值之間的漢明距離,漢明距離越大,兩圖片越不相似。

OpenCV實現

如圖在下圖中對比各個圖像與圖person.jpg的漢明距離,以此衡量兩圖之間的額相似度。

#include <iostream> #include <stdio.h>#include <fstream>#include <io.h>#include <string>#include <opencv2/opencv.hpp> #include <opencv2/core/core.hpp>#include <opencv2/core/mat.hpp>using namespace std; using namespace cv; int fingerprint(Mat src, Mat* hash);int main(){ Mat src = imread("E://image//image//image//person.jpg", 0);  if(src.empty()) {  cout << "the image is not exist" << endl;   return -1; } Mat srchash, dsthash; fingerprint(src, &srchash); for(int i = 1; i <= 8; i++) {   string path0 = "E://image//image//image//person";  string number;   stringstream ss;   ss << i;   ss >> number;   string path = "E://image//image//image//person" + number +".jpg";   Mat dst = imread(path, 0);   if(dst.empty())  {   cout << "the image is not exist" << endl;    return -1;  }  fingerprint(dst, &dsthash);  int d = 0;  for (int n = 0; n < srchash.size[1]; n++)   if (srchash.at<uchar>(0,n) != dsthash.at<uchar>(0,n)) d++;   cout <<"person" << i <<" distance= " <<d<<"/n";  } system("pause"); return 0;}int fingerprint(Mat src, Mat* hash){ resize(src, src, Size(32, 32)); src.convertTo(src, CV_32F); Mat srcDCT;  dct(src, srcDCT); srcDCT = abs(srcDCT); double sum = 0; for (int i = 0; i < 8; i++)  for (int j = 0; j < 8; j++)   sum += srcDCT.at<float>(i,j); double average = sum/64; Mat phashcode= Mat::zeros(Size(8, 8), CV_8U); for (int i = 0; i < 8; i++)  for (int j = 0; j < 8; j++)   phashcode.at<char>(i,j) = srcDCT.at<float>(i,j) > average ? 1:0; *hash = phashcode.reshape(0,1).clone(); return 0;}

輸出漢明距離:

可以看出若將閾值設置為20則可將后三張其他圖片篩選掉。

以上這篇opencv3/C++ PHash算法圖像檢索詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 甘肃省| 涞水县| 封丘县| 理塘县| 花垣县| 和静县| 旌德县| 衡山县| 定日县| 丹江口市| 柳林县| 龙泉市| 兴化市| 万源市| 鄱阳县| 万荣县| 古丈县| 扎囊县| 中方县| 百色市| 日土县| 义乌市| 吉安县| 海口市| 弥勒县| 达日县| 淮安市| 陈巴尔虎旗| 本溪市| 东阿县| 蒙城县| 德清县| 中西区| 昌黎县| 阿图什市| 息烽县| 城步| 冕宁县| 富锦市| 肃宁县| 隆林|