opencv3/C++ PHash算法图像检索详解
PHash算法即感知哈希算法/PerceptualHashalgorithm,计算基于低频的均值哈希.对每张图像生成一个指纹字符串,通过对该字符串比较可以判断图像间的相似度.
PHash算法原理
将图像转为灰度图,然后将图片大小调整为32*32像素并通过DCT变换,取左上角的8*8像素区域。然后计算这64个像素的灰度值的均值。将每个像素的灰度值与均值对比,大于均值记为1,小于均值记为0,得到64位哈希值。
PHash算法实现
将图片转为灰度值
将图片尺寸缩小为32*32
resize(src,src,Size(32,32));
DCT变换
MatsrcDCT; dct(src,srcDCT);
计算DCT左上角8*8像素区域均值,求hash值
doublesum=0; for(inti=0;i<8;i++) for(intj=0;j<8;j++) sum+=srcDCT.at(i,j); doubleaverage=sum/64; Matphashcode=Mat::zeros(Size(8,8),CV_8U); for(inti=0;i<8;i++) for(intj=0;j<8;j++) phashcode.at (i,j)=srcDCT.at (i,j)>average?1:0;
hash值匹配
intd=0; for(intn=0;n(0,n)!=dsthash.at (0,n))d++;
即,计算两幅图哈希值之间的汉明距离,汉明距离越大,两图片越不相似。
OpenCV实现
如图在下图中对比各个图像与图person.jpg的汉明距离,以此衡量两图之间的额相似度。
#include#include #include #include #include #include #include #include usingnamespacestd; usingnamespacecv; intfingerprint(Matsrc,Mat*hash); intmain() { Matsrc=imread("E:\\image\\image\\image\\person.jpg",0); if(src.empty()) { cout<<"theimageisnotexist"< >number; stringpath="E:\\image\\image\\image\\person"+number+".jpg"; Matdst=imread(path,0); if(dst.empty()) { cout<<"theimageisnotexist"< (0,n)!=dsthash.at (0,n))d++; cout<<"person"<(i,j); doubleaverage=sum/64; Matphashcode=Mat::zeros(Size(8,8),CV_8U); for(inti=0;i<8;i++) for(intj=0;j<8;j++) phashcode.at (i,j)=srcDCT.at (i,j)>average?1:0; *hash=phashcode.reshape(0,1).clone(); return0; }
输出汉明距离:
可以看出若将阈值设置为20则可将后三张其他图片筛选掉。
以上这篇opencv3/C++PHash算法图像检索详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。