opencv学习笔记(六)直方图比较图片相似度

  opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将图片转换成直方图,然后对直方图进行比较,在某些程度,真实地反映了图片的相似度。

代码如下:

  1. #include <iostream>
  2. #include <cv.h>
  3. #include <highgui.h>
  4. using namespace std;
  5. using namespace cv;
  6.  
  7. int main(void)
  8. {
  9. Mat pic1 = imread("pic1.jpg");
  10. Mat pic2 = imread("pic2.jpg");
  11. //计算相似度
  12. if (pic2.channels() == ) {//单通道时,
  13. int histSize = ;
  14. float range[] = { , };
  15. const float* histRange = { range };
  16. bool uniform = true;
  17. bool accumulate = false;
  18.  
  19. cv::Mat hist1, hist2;
  20.  
  21. cv::calcHist(&pic2, , , cv::Mat(), hist1, , &histSize, &histRange, uniform, accumulate);
  22. cv::normalize(hist1, hist1, , , cv::NORM_MINMAX, -, cv::Mat());
  23.  
  24. cv::calcHist(&pic1, , , cv::Mat(), hist2, , &histSize, &histRange, uniform, accumulate);
  25. cv::normalize(hist2, hist2, , , cv::NORM_MINMAX, -, cv::Mat());
  26.  
  27. double dSimilarity = cv::compareHist(hist1, hist2, CV_COMP_CORREL);//,CV_COMP_CHISQR,CV_COMP_INTERSECT,CV_COMP_BHATTACHARYYA CV_COMP_CORREL
  28.  
  29. cout << "similarity = " << dSimilarity << endl;
  30. }
  31. else {//三通道时
  32. cv::cvtColor(pic2, pic2, cv::COLOR_BGR2HSV);
  33. cv::cvtColor(pic1, pic1, cv::COLOR_BGR2HSV);
  34.  
  35. int h_bins = , s_bins = ;
  36. int histSize[] = { h_bins, s_bins };
  37. float h_ranges[] = { , };
  38. float s_ranges[] = { , };
  39. const float* ranges[] = { h_ranges, s_ranges };
  40. int channels[] = { , };
  41.  
  42. cv::MatND hist1, hist2;
  43.  
  44. cv::calcHist(&pic2, , channels, cv::Mat(), hist1, , histSize, ranges, true, false);
  45. cv::normalize(hist1, hist1, , , cv::NORM_MINMAX, -, cv::Mat());
  46.  
  47. cv::calcHist(&pic1, , channels, cv::Mat(), hist2, , histSize, ranges, true, false);
  48. cv::normalize(hist2, hist2, , , cv::NORM_MINMAX, -, cv::Mat());
  49.  
  50. double dSimilarity = cv::compareHist(hist1, hist2, CV_COMP_CORREL); //,CV_COMP_CHISQR,CV_COMP_INTERSECT,CV_COMP_BHATTACHARYYA CV_COMP_CORREL
  51.  
  52. cout << "similarity = " << dSimilarity << endl;
  53. }
  54. waitKey();
  55. return ;
  56.  
  57. }

  pic1:

  

  pic2:

  

  使用相关系数法(CV_COMP_CORREL)进行图片相似度比较时,取值范围为[-1,1];越接近1说明两幅图片越相似;

  比较pic1与pic2得到的结果为:

  similarity =0.926247

  pic与本身进行比较时,

  similarity =1

opencv学习笔记(六)直方图比较图片相似度的更多相关文章

  1. 【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  2. opencv学习笔记(六)---图像梯度

    图像梯度的算法有很多方法:sabel算子,scharr算子,laplacian算子,sanny边缘检测(下个随笔)... 这些算子的原理可参考:https://blog.csdn.net/poem_q ...

  3. opencv学习笔记D01

    目录 opencv学习笔记D01 一.图片读取 二.图片保存 三.图片展示 四.图片缩放 五.四种常用插值方式的比较 1.最近邻插值 2.双线性插值 3.区域插值 4.三次样条插值 我是尾巴: ope ...

  4. opencv学习笔记(七)SVM+HOG

    opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...

  5. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  6. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  7. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  8. opencv学习笔记(四)投影

    opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: #include <cv.h> #include <highgui.h> using namespace ...

  9. opencv学习笔记(一)IplImage, CvMat, Mat 的关系

    opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...

随机推荐

  1. 嵌入式实时操作系统μCOS原理与实践任务控制与时间的解析

    /*************************************************************************************************** ...

  2. eclipse 左边目录结构下五referenced library解决办法

    没有referenced library,加入多个jar包,导致项目看上去庞大 解决办法: 在Package Explorer窗口中会出现Referenced Libraries,但Java EE 透 ...

  3. Circular Sequence,ACM/ICPC Seoul 2004,UVa 1584

    #include <stdio.h> #include <string.h> #define maxn 105 int lss(const char *s,int p,int ...

  4. 在xib里,拖一个UIView到UITableView中作为tableHeaderView

    原贴地址:http://blog.csdn.net/haoxinqingb/article/details/41683881 内容 在xib里,拖一个UIView到UITableView中作为tabl ...

  5. php 获取后缀的几种方法

    1: function get_extension($file){ substr(strrchr($file, '.'), 1); } 2: function get_extension($file) ...

  6. php 命名空间

    命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀. 例:项目中有两个 ...

  7. ARP欺骗病毒,网页“篡改”,注入iframe代码!

    ---------------权威资料看这里--------------- 清华大学信息网络工程研究中心-中国教育和科研计算机网应急响应组<ARP 欺骗网页劫持攻击分析>PDF文件,直接I ...

  8. VS2013 EMMET插件学习

    在VS2013中搜索EMMET插件,安装,重启IDE,即可使用. 最简单的一个用法示例: 在编辑器里输入:ul>li*5 按快捷键:CTRL+1 即可生成如下代码: <ul> < ...

  9. webexam项目杂记

    sql 语句 数据库 本身 有数据类型的区分,对于mysql的字符串默认的用单引号''来表示,因此,整个sql 语句就要用双引号来括. 如: $sql = "SELECT * FROM us ...

  10. POJ 2418 Hardwood Species

                                                     Hardwood Species Time Limit: 10000MS   Memory Limit ...