直方图比较方法-概述

对输入的两张图像计算得到直方图H1与H2,归一化到相同的尺度空间
然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度进
而比较图像本身的相似程度。Opencv提供的比较方法有四种:

  • Correlation 相关性比较 -(计算结果范围为 -1到1 -1很不相关,1完全一样 )
  • Chi-Square 卡方比较 -(计算结果越接近0,两个直方图越相似)
  • Intersection 十字交叉性 -(计算公式为取两个直方图每个相同位置的值的最小值,然后求和,这个比较方式不是很好,不建议使用)
  • Bhattacharyya distance 巴氏距离 - (比较结果是很准的,计算结果范围为 0-1 ,0表示两个直方图非常相关,1最不相似)

1. 直方图比较方法-相关性计算(CV_COMP_CORREL)

计算结果范围为 -1到1 -1很不相关,1完全一样

2. 直方图比较方法-卡方计算(CV_COMP_CHISQR)

计算结果越接近0,两个直方图越相似

H1,H2分别表示两个图像的直方图数据

3. 直方图比较方法-十字计算(CV_COMP_INTERSECT)

计算公式为取两个直方图每个相同位置的值的最小值,然后求和,这个比较方式不是很好,不建议使用

H1,H2分别表示两个图像的直方图数据

4. 直方图比较方法-巴氏距离计算(CV_COMP_BHATTACHARYYA )

比较结果是很准的,计算结果范围为 0-1 ,0表示两个直方图非常相关,1最不相似


H1,H2分别表示两个图像的直方图数据

相关API(cv::compareHist)

  1. 首先把图像从RGB色彩空间转换到HSV色彩空间cvtColor
  2. 计算图像的直方图,然后归一化到[0~1]之间calcHist和normalize;
  3. 使用上述四种比较方法之一进行比较compareHist

compareHist(
InputArray h1, // 直方图数据,下同
InputArray H2,
int method// 比较方法,上述四种方法之一
)

程序步骤:

  • 加载图像数据
  • 从RGB空间转换到HSV空间
  • 计算直方图并归一化
  • 比较直方图,并返回值

程序代码

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>using namespace std;
using namespace cv;string convertToString(double d);int main(int argc, char** argv) {// 1. 声明储存基准图像和另外两张对比图像的矩阵( RGB 和 HSV )Mat base, test1, test2;Mat hsvbase, hsvtest1, hsvtest2;// 2. 装载基准图像(src_base) 和两张测试图像:base = imread("E:/Experiment/OpenCV/Pictures/lenanoise.jpg");if (!base.data) {printf("could not load image...\n");return -1;}test1 = imread("E:/Experiment/OpenCV/Pictures/lena.jpg");test2 = imread("E:/Experiment/OpenCV/Pictures/lena1.jpg");// 3. 将图像转化到HSV格式:cvtColor(base, hsvbase, CV_BGR2HSV);//转换为 HSV 颜色空间,也是3通道cvtColor(test1, hsvtest1, CV_BGR2HSV);cvtColor(test2, hsvtest2, CV_BGR2HSV);// 4. 初始化计算直方图需要的实参(bins, 范围,通道 H 和 S ).int h_bins = 50; int s_bins = 60;     int histSize[] = { h_bins, s_bins };// hue varies from 0 to 179, saturation from 0 to 255     float h_ranges[] = { 0, 180 };     float s_ranges[] = { 0, 256 };const float* ranges[] = { h_ranges, s_ranges };// Use the o-th and 1-st channels     int channels[] = { 0, 1 };// 5. 创建储存直方图的 MatND 实例://ND 表示二维或多维的Mat ,typedef Mat MatND; 源码中MatND的声明。 Mat表示二维的数组MatND hist_base;MatND hist_test1;MatND hist_test2;// 6. 计算基准图像,两张测试图像calcHist(&hsvbase, 1,  channels, Mat(), hist_base, 2, histSize, ranges, true, false);normalize(hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat());//归一化到 0-1 之间calcHist(&hsvtest1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false);normalize(hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat());calcHist(&hsvtest2, 1, channels, Mat(), hist_test2, 2, histSize, ranges, true, false);normalize(hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat());// 7. 使用4种对比标准将基准图像(hist_base)的直方图与其余各直方图进行对比://比较的算法 CV_COMP_CORREL CHISQR INTERSECT BHATTACHARYYAdouble basebase = compareHist(hist_base, hist_base, CV_COMP_CORREL);double basetest1 = compareHist(hist_base, hist_test1, CV_COMP_CORREL);double basetest2 = compareHist(hist_base, hist_test2, CV_COMP_CORREL);double tes1test2 = compareHist(hist_test1, hist_test2, CV_COMP_CORREL);printf("test1 compare with test2 correlation value :%f", tes1test2);Mat test12;test2.copyTo(test12);// 8. 将比较的结果转换为string,然后以文字的方式绘制到图形上putText(base, convertToString(basebase), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);putText(test1, convertToString(basetest1), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);putText(test2, convertToString(basetest2), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);putText(test12, convertToString(tes1test2), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);namedWindow("base", CV_WINDOW_AUTOSIZE);namedWindow("test1", CV_WINDOW_AUTOSIZE);namedWindow("test2", CV_WINDOW_AUTOSIZE);imshow("base", base);imshow("test1", test1);imshow("test2", test2);imshow("test12", test12);waitKey(0);return 0;
}string convertToString(double d) {ostringstream os;if (os << d)  // << 运算符重载了,将double转成stringreturn os.str();return "invalid conversion";
}

运行截图


参考博客:

  1. https://blog.csdn.net/huanghuangjin/article/details/81175339
  2. https://blog.csdn.net/LYKymy/article/details/83210430

OpenCV-图像处理(25、直方图比较)相关推荐

  1. Python OpenCV 图像处理之直方图的应用,取经之旅第 26 天

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧. Python OpenCV 基础知识铺垫 cv2.compareHist 函数 橡皮擦的小节 基础知识铺垫 上篇博客 Py ...

  2. c++ opencv 图像处理:直方图处理(直方图均衡化,直方图匹配(规定化))

    文章目录 前言 一.直方图(histogram) 二.直方图处理 1.直方图均衡化 2.直方图匹配(规定化) 三.opencv函数总结 1.equalizeHist图像均衡化 2.calcHist获取 ...

  3. Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图

    一步一步来吧 上一节:Python+Opencv图像处理新手入门教程(一):介绍,安装与起步 1.什么是图像 对于计算机而言,图像的本质是一个由像素点构成的矩阵. 例如我们用肉眼很容易分辨一辆汽车的后 ...

  4. python+opencv图像处理之七:直方图均衡化

    python+opencv图像处理之七:直方图均衡化 目录 python+opencv图像处理之七:直方图均衡化 一.直方图均衡化 二.直方图绘制 三.直方图均衡化 四.有限对比适应性直方图均衡化 一 ...

  5. OpenCV图像处理专栏九 | 基于直方图的快速中值滤波算法

    转载自:https://zhuanlan.zhihu.com/p/98092747  侵删 前言 这是OpenCV图像处理专栏的第9篇文章,主要介绍一个基于直方图的快速中值滤波算法,希望对大家有帮助. ...

  6. opencv图像处理总结

    opencv图像处理基本操作 1. 矩阵数据类型 通用矩阵数据类型: CV_<bit_depth>(S|U|F)C<number_of_channels> 其中,S表示带符号整 ...

  7. OpenCV-数字图像处理之直方图均衡化

    OpenCV-数字图像处理之直方图均衡化 从这篇博文开始,小生正式从一个毫不相干专业转投数字图像处理.废话不多说了,talk is cheap. show me the code. 直方图均衡化目的 ...

  8. halcon opencv 图像处理面试指南

    珠海某上市公司算法总监: 1.相机标定的原理与坐标系之间的转换,如何转换 2.激光三角原理,如何搭建 3.测量拟合的过程中有哪些算子,原理什么,接着问5,跌代多少次?什么情况最优,如何优化, 4.那个 ...

  9. OPENCV图像处理基础

    OPENCV图像处理基础 1.图像处理基础 1.1 数字图像 1.1.1 数字图像概念: 1.1.2 数字图像起源: 1.1.3 常见成像方式: 1.1.4 数字图像的应用: 1.1.5 Opencv ...

  10. 使用Python,OpenCV计算图像直方图(cv2.calcHist)

    使用Python,OpenCV计算图像直方图(cv2.calcHist 1. 效果图 2. 原理 2.1 什么是图像直方图? 2.2 计算直方图 2.3 可视化蒙版区域 3. 源码 参考 这篇博客将介 ...

最新文章

  1. 【数学专题】整除相关 - 素数
  2. This function or variable may be unsafe
  3. linux插光驱自动重启,Linux两种光驱自动挂载的方法
  4. mysql 怎么实现组内排名_MySQL 实现排名(分组排名)
  5. php选择排序算法原理_PHP排序算法之选择排序
  6. java 链表删除头结点,删除链表的倒数第N个节点,并返回链表的头节点
  7. JDBC入门案例及相关API概述
  8. 惠普企业:自今年10月起,固件 bug 将导致某些 SSD 不可用
  9. 【iOS开发】修改图片的大小分辨率 使用mac
  10. python 关于反射和类的特殊成员方法
  11. 超简单的Springboot中的日志管理配置
  12. 56. Yii Modules
  13. 京东万能转链API接口 含商品信息优惠券转链 京东线报如何转链?
  14. Word解析之Word内部结构
  15. mac怎么压缩pdf文件最小
  16. IPTV和宽带网络融合
  17. 一道代码分析题浅析String的intern()方法
  18. 二值化网络的发展——从原始BNN到MeliusNet
  19. 我写的阿拉伯数字转中文大写的一个方法
  20. 交易风云-MAM、PAMM、社区交易&KlipC:如何选择多账户管理系统

热门文章

  1. linux下免密认证登录失败原因总结
  2. activity启动模式之standard
  3. 从用户洞察到数据应用 诸葛io让“增长”深入场景
  4. Oracle Active database duplication
  5. Javascript之基本包装类型
  6. mysql 手注 写shell_php+mysql手注拿shell教程【朋友给的】
  7. c# Conditional用法详解
  8. 阿里巴巴Java开发文档2020版学习-OOP 规约
  9. linux网络编程 mingw,Windows网络编程
  10. 路由器修改hosts实现域名劫持