http://blog.csdn.net/fengbingchun/article/details/42153261

2014-12-25 21:27 2959人阅读 评论(0) 收藏 举报
 分类:
OpenCV(72)  Image Processing(18) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

感知哈希算法(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实现的测试代码:

  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;

图像相似度计算之哈希值方法OpenCV实现的更多相关文章

  1. win10下计算文件哈希值的方法

    cmd下使用certutil命令 使用方法: certutil -hashfile FILE_NAME ALGORITHM_NAME 支持的加密算法包括:MD2,MD4,MD5,SHA1,SHA256 ...

  2. Opencv python图像处理-图像相似度计算

    一.相关概念 一般我们人区分谁是谁,给物品分类,都是通过各种特征去辨别的,比如黑长直.大白腿.樱桃唇.瓜子脸.王麻子脸上有麻子,隔壁老王和儿子很像,但是儿子下巴涨了一颗痣和他妈一模一样,让你确定这是你 ...

  3. Java 对象的哈希值是每次 hashCode() 方法调用重计算么?

    对于没有覆盖hashCode()方法的对象 如果没有覆盖 hashCode() 方法,那么哈希值为底层 JDK C++ 源码实现,实例每次调用hashcode()方法,只有第一次计算哈希值,之后哈希值 ...

  4. 我用JAVA做了个简易图像相似度计算器

    简单说两句: 笔主利用这个七夕前后两天的寂寞时光,用JAVA磨了一个简单的图像相似度计算小程序,就在刚才终于纠结完毕,输出了1.0版本,小小的满足了一下可怜的虚荣心..→_→ 使用最简单最基础的感知哈 ...

  5. 转-------CNN图像相似度匹配 2-channel network

    基于2-channel  network的图片相似度判别 原文地址:http://blog.csdn.net/hjimce/article/details/50098483 作者:hjimce 一.相 ...

  6. 加解密(校验哈希值、MD5值)

    1.计算文本哈希值: public static string ComputeHash(string password) { byte[] buffer = System.Text.Encoding. ...

  7. 上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中

    上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中 前端:要用到一个插件,点击下载 <!DOCTYPE html> <html xmlns=&q ...

  8. 红黑树规则,TreeSet原理,HashSet特点,什么是哈希值,HashSet底层原理,Map集合特点,Map集合遍历方法

    ==学习目标== 1.能够了解红黑树 2.能够掌握HashSet集合的特点以及使用(特点以及使用,哈希表数据结构) 3.能够掌握Map集合的特点以及使用(特点,常见方法,Map集合的遍历) 4.能够掌 ...

  9. Java中String的哈希值计算

    下面都是从String类的源码中粘贴出来的 private int hash; // Default to 0 public int hashCode() { int h = hash; if (h ...

随机推荐

  1. 一个JQuery发送ajax请求

    环境: 1.jQuery v2.1.1 2.ThinkPHP 3.2.3 HTML页面: <button type="button" id="cat" o ...

  2. Maven中央仓库地址

    Maven 中央仓库地址: 1. http://www.sonatype.org/nexus/ 2. http://mvnrepository.com/ (本人推荐仓库) 3. http://repo ...

  3. Voting

    Voting time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  4. setAction方法 Snackbar 右侧按钮可以被点击并处理一些事件

    从数据库同一记录取得的字段所组装成的对象应该是同一个对象,然后由不同的Session从数据库同一条记录上分别取得对象,它们的内存地址是不一样的. 一般来说,常见的数字加密方式都可以分为两类,即对称加密 ...

  5. 安装mysql的遇到的问题

    源:安装用的是mysql官网的binary包. 之前装mysql都是直接放到/usr/local,就想试试放到其他地方,然后..就悲剧了. 安装步骤没啥说的,官网上有.因为放置的位置不一样所以有些执行 ...

  6. ERROR Worker: All masters are unresponsive! Giving up

    启动spark的时候发现,主节点(master)上的Master进程还在,子节点(Worker)上的Worker进程自动关闭. 在子节点上查询log发现: ERROR Worker: All mast ...

  7. jquery学习笔记3 jq遍历

    遍历方式:向上(父级元素)  向下(子元素)    水平(同胞元素) 一.向上遍历 parent()      向上一级   放回被选元素的直接父元素 parents()          返回被选元 ...

  8. ZZNU 1988: Sn

    题目描述 给你两个数 n, p(0 < n,p <= 10^15); a1 = 1;  a2 = 1+2;  a3 = 1+2+3;  ... an = 1+2+3+...+n    Sn ...

  9. nagios监控mysql主从状态

    看了网上很多mysql主从监控的,大部分都是shell的,就算是python的,也是在python下跑shell语句.我写了一个python的监控脚本,用到了mysqldb这个包.脚本如下: [roo ...

  10. python3.4项目打包

    1.首先下载pyinstaller并且解压(就直接解压再桌面就可以,这样子比较方便) 2.然后就去下载pywin32(按照电脑和python的版本去下载) 我电脑是64位的,python是3.4版本的 ...