感知哈希算法:pHash算法实现图像相似度比较(附完整c++代码) 您所在的位置:网站首页 源代码相似度多少是侵权 感知哈希算法:pHash算法实现图像相似度比较(附完整c++代码)

感知哈希算法:pHash算法实现图像相似度比较(附完整c++代码)

2023-09-23 19:44| 来源: 网络整理| 查看: 265

数字内容安全课实验

感知哈希算法

在浏览器的图片搜索中,用户可以上传一张图片,浏览器显示因特网中与此图片相同或者相似的图,实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm), 意思是为图片生成一个指纹(字符串格式), 两张图片的指纹越相似, 说明两张图片就越相似。感知哈希算法是一类算法的总称,包括

aHash:平均值哈希pHash:感知哈希dHash:差异值哈希

在这里我使用的是pHash算法,即对图像进行DCT变换,获取DCT系数均值,基于其变换域特征来实现图片相似度计算。

实现原理

第一步 缩小图片尺寸 将图片缩小到32x32的尺寸, 这一步的作用是去除各种图片尺寸和图片比例的差异, 只保留结构、明暗等基本信息 (我一开始缩小尺寸到8x8,但检测后发现性能很差,于是改成32x32,性能得到大幅提高)

第二步 转为灰度图片 将缩小后的图片转为灰度图片

第三步 计算DCT 计算DCT,但只取左上角8*8的矩阵,这部分呈现了图片中的最低频率

第四步 计算平均值 计算DCT系数平均值

第五步 计算哈希值 将每个像素的灰度与DCT系数平均值进行比较, 如果大于或等于平均值记为1, 小于平均值记为0,结果组合在一起就构成了一个64位的二进制整数, 这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了

第六步 对比图片指纹 得到图片的指纹后, 就可以对比不同的图片的指纹, 计算出64位中有多少位是不一样的. 如果不相同的数据位数不超过5, 就说明两张图片很相似, 如果大于10, 说明它们是两张不同的图片

实验环境 vs2017opencv库 代码实现 #include #include #include #include #include #include #include #include #include using namespace std; using namespace cv; string pHashValue(Mat &srcImg);//pHash方法计算图片哈希值 int hanmingDist(string &str1, string &str2);//计算哈希值字符串的汉明距离 int main() { Mat orgImg = imread("图片1路径"); Mat img = imread("图片2路径"); imshow("OrgImg", orgImg); imshow("Img", img); string str1 = pHashValue(orgImg); string str2 = pHashValue(img); int distance = hanmingDist(str1, str2); cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有