千家信息网

如何进行opencv3/C++PHash算法图像检索

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,如何进行opencv3/C++PHash算法图像检索,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。PHash算法即感知哈希算法/Pe
千家信息网最后更新 2026年11月04日如何进行opencv3/C++PHash算法图像检索

如何进行opencv3/C++PHash算法图像检索,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

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(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(i,j) = srcDCT.at(i,j) > average ? 1:0;

hash值匹配

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

即,计算两幅图哈希值之间的汉明距离,汉明距离越大,两图片越不相似。

OpenCV实现

如图在下图中对比各个图像与图person.jpg的汉明距离,以此衡量两图之间的额相似度。

#include #include #include #include #include #include #include #include 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(0,n) != dsthash.at(0,n)) d++;

cout <<"person" << i <<" distance= " <

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(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(i,j) = srcDCT.at(i,j) > average ? 1:0;

*hash = phashcode.reshape(0,1).clone(); return 0;}

输出汉明距离:

可以看出若将阈值设置为20则可将后三张其他图片筛选掉。

关于如何进行opencv3/C++PHash算法图像检索问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

图像 算法 均值 像素 图片 灰度 哈希 j++ 汉明 相似 问题 检索 之间 区域 字符 字符串 左上角 更多 变换 帮助 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 精品咖啡豆 美国互联网保险保险科技 金融科技还是互联网 互联网科技资迅 互联网科技公司怎么样 互联网金融科技创新 云电互联网科技 互联网科技公司名称 佰商互联网科技有限公司 滨湖区互联网智能科技产品供应 成都铂石互联网科技做什么的 广州市恰铎互联网科技有限公司 启辰互联网科技 互联网科技资金流入 从那以后互联网科技有限公司 扫呗互联网科技有限公司 上海乐五互联网科技有限公司 济南小医互联网科技有限公司招聘 中国互联网公司的科技投入 科技互联网专业务虚会材料 广州万易互联网科技有限公司 湖南永感互联网科技有限公司 工业互联网科技新基建 互联网科技开发公司 广州优美互联网科技 互联网系的金融科技公司 互联网科技产业特征 锡山区互联网智能科技产品供应 广东工业互联网大赛深圳学泰科技 福仕德教育科技互联网
0