感知哈希算法(perceptual hash algorithm),它的作用是对每张图像生成一个“指纹”(fingerprint)字符串,然后比较不同图像的指纹。结果越接近,就说明图像越相似。

实现步骤:

1.      缩小尺寸:将图像缩小到8*8的尺寸,总共64个像素。这一步的作用是去除图像的细节,只保留结构/明暗等基本信息,摒弃不同尺寸/比例带来的图像差异;

2.      简化色彩:将缩小后的图像,转为64级灰度,即所有像素点总共只有64种颜色;

3.      计算平均值:计算所有64个像素的灰度平均值;

4.      比较像素的灰度:将每个像素的灰度,与平均值进行比较,大于或等于平均值记为1,小于平均值记为0;

5.      计算哈希值:将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图像的指纹。组合的次序并不重要,只要保证所有图像都采用同样次序就行了;

6.      得到指纹以后,就可以对比不同的图像,看看64位中有多少位是不一样的。在理论上,这等同于”汉明距离”(Hamming distance,在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数)。如果不相同的数据位数不超过5,就说明两张图像很相似;如果大于10,就说明这是两张不同的图像。

以上内容摘自:http://www.ruanyifeng.com/blog/2011/07/principle_of_similar_image_search.html

下面是用OpenCV实现的测试代码:

[cpp] view plaincopy
  1. string strSrcImageName = "src.jpg";
  2. cv::Mat matSrc, matSrc1, matSrc2;
  3. matSrc = cv::imread(strSrcImageName, CV_LOAD_IMAGE_COLOR);
  4. CV_Assert(matSrc.channels() == 3);
  5. cv::resize(matSrc, matSrc1, cv::Size(357, 419), 0, 0, cv::INTER_NEAREST);
  6. //cv::flip(matSrc1, matSrc1, 1);
  7. cv::resize(matSrc, matSrc2, cv::Size(2177, 3233), 0, 0, cv::INTER_LANCZOS4);
  8. cv::Mat matDst1, matDst2;
  9. cv::resize(matSrc1, matDst1, cv::Size(8, 8), 0, 0, cv::INTER_CUBIC);
  10. cv::resize(matSrc2, matDst2, cv::Size(8, 8), 0, 0, cv::INTER_CUBIC);
  11. cv::cvtColor(matDst1, matDst1, CV_BGR2GRAY);
  12. cv::cvtColor(matDst2, matDst2, CV_BGR2GRAY);
  13. int iAvg1 = 0, iAvg2 = 0;
  14. int arr1[64], arr2[64];
  15. for (int i = 0; i < 8; i++) {
  16. uchar* data1 = matDst1.ptr<uchar>(i);
  17. uchar* data2 = matDst2.ptr<uchar>(i);
  18. int tmp = i * 8;
  19. for (int j = 0; j < 8; j++) {
  20. int tmp1 = tmp + j;
  21. arr1[tmp1] = data1[j] / 4 * 4;
  22. arr2[tmp1] = data2[j] / 4 * 4;
  23. iAvg1 += arr1[tmp1];
  24. iAvg2 += arr2[tmp1];
  25. }
  26. }
  27. iAvg1 /= 64;
  28. iAvg2 /= 64;
  29. for (int i = 0; i < 64; i++) {
  30. arr1[i] = (arr1[i] >= iAvg1) ? 1 : 0;
  31. arr2[i] = (arr2[i] >= iAvg2) ? 1 : 0;
  32. }
  33. int iDiffNum = 0;
  34. for (int i = 0; i < 64; i++)
  35. if (arr1[i] != arr2[i])
  36. ++iDiffNum;
  37. cout<<"iDiffNum = "<<iDiffNum<<endl;
  38. if (iDiffNum <= 5)
  39. cout<<"two images are very similar!"<<endl;
  40. else if (iDiffNum > 10)
  41. cout<<"they are two different images!"<<endl;
  42. else
  43. cout<<"two image are somewhat similar!"<<endl;

感知哈希算法(perceptual hash algorithm),相关推荐

  1. 感知哈希算法——找出相似的图片

    参考Neal Krawetz博士的这篇文章, 实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm), 意思是为图片生成一个指纹(字符串格 ...

  2. 【转】感知哈希算法——找出相似的图片

    Google 图片搜索功能 在谷歌图片搜索中, 用户可以上传一张图片, 谷歌显示因特网中与此图片相同或者相似的图片. 比如我上传一张照片试试效果: 原理讲解 参考Neal Krawetz博士的这篇文章 ...

  3. 基于感知哈希算法的中药标本相似图片的搜索

    一 前言 笔者最近在开发中药标本相似图片的搜索,就是根据用户上传的图片,然后到中药标本库里找到相似的图片,从而帮助用户识别标本,获取标本信息.查阅了大量资料,看到了阮一峰的一篇文章,经过一个月的开发终 ...

  4. 感知哈希算法(Perceptual hash algorithm)的OpenCV实现

    1.前言 目前"以图搜图"的引擎越来越多,可参考博文: http://blog.csdn.net/forthcriminson/article/details/8698175 此篇 ...

  5. 感知哈希算法(Perceptual hash algorithm) 以图搜图

    1.序 目前"以图搜图"的引擎越来越多,可参考博文: http://blog.csdn.net/forthcriminson/article/details/8698175 此篇博 ...

  6. 相似图片检测:感知哈希算法之aHash,dHash,pHash的Python实现

    相似图片检测:感知哈希算法之aHash,dHash,pHash的Python实现 原文:http://blog.sina.com.cn/s/blog_56fd58ab0102xpqf.html 感知哈 ...

  7. 相似图片检测:感知哈希算法之dHash的Python实现

    原文:https://blog.csdn.net/haluoluo211/article/details/52769325 相似图片检测:感知哈希算法之dHash的Python实现 某些情况下,我们需 ...

  8. 感知哈希算法原理与实现

    今天忽然想做一个图像识别的APP,但是在两张图片相似度的问题上产生了问题,感知哈希算法并不能解决这个问题,只是我在试着解决问题的过程中学到的一点知识. 这里的关键技术叫做"感知哈希算法&qu ...

  9. 图片识别——感知哈希算法

    所谓感知哈希算法(Perceptual hash algorithm,PHA),它是用于对多种格式的数据生成一个指纹的算法.当然本文只讨论图片格式.感知哈希不同于密码哈希(如md5云云),它对于相似特 ...

最新文章

  1. GitHub使用指南!(ubuntu)
  2. 【杂谈】GAN对人脸图像算法产生了哪些影响?
  3. 复数卷积 tensorflow_PyTorch 中的傅里叶卷积
  4. mysql下载备份数据库命令行_MYSQL 数据库导入导出命令 | 很文博客
  5. vue在开发环境中配置本地hosts修改域名
  6. 电力系统稳态matlab,基于MATLAB的电力系统稳态仿真分析
  7. 学习Java必读的10本书籍
  8. Burst(突发)信号
  9. html页面banner空白,css banner不拉伸
  10. 深澜校园网web认证自动登录脚
  11. 绘制一只奥特曼DIY
  12. 89canvas制作时钟
  13. 强化学习 (Reinforcement Learning)
  14. APS生产排程的依据和原则
  15. django值jwt认证提示身份认证信息未提供
  16. 服务器安全部署文档(转载)
  17. “网淘”新主张 跳蚤市场成风尚
  18. kisso是什么牌子_marie elie是什么牌子?marie elie品牌介绍
  19. 【PyTorch基础教程29】DIN模型
  20. 图记逆置单链表的两种方法(C语言)

热门文章

  1. pytorch bert文本分类_一起读Bert文本分类代码 (pytorch篇 四)
  2. wpf listview 添加控件_WPF开源控件扩展库 MaterialDesignExtensions
  3. awk,sed,grep基本用法列举
  4. 是否能领先e步 浅析SSD中的eTLC和eMLC颗粒
  5. (30)导入时如何定制spring-boot依赖项的版本【转载】【从零开始学Spring Boot】...
  6. 用Access作为后台数据库支撑,书写一个C#写入记录的案例
  7. hdu 5534(dp)
  8. 基于实体模型开发主题管理简析
  9. 戴尔/Dell R420服务器在 CentOS 5.6 64bit环境下安装网卡驱动
  10. ExtJs Form 表单验证