函数


CV_EXPORTS_W double compareHist( InputArray H1, InputArray H2, int method );//! compares two histograms stored in sparse arrays
CV_EXPORTS double compareHist( const SparseMat& H1, const SparseMat& H2, int method );

标志参数

简记

作用

HISTCMP_CORREL

0

相关法

HISTCMP_CHISQR

1

卡方法

HISTCMP_INTERSECT

2

直方图相交法

HISTCMP_BHATTACHARYYA

3

巴塔恰里雅距离(巴氏距离)法

HISTCMP_HELLINGER

3

与HISTCMP_BHATTACHARYYA方法相同

HISTCMP_CHISQR_ALT

4

替代卡方法

HISTCMP_KL_DIV

5

相对熵法(Kullback-Leibler散度)

用途

  • 利用直方图的方式进行批量的图片缺陷检测(方法简单)
  • 图像相似度比较

如果我们有两张图像,并且这两张图像的直方图一样,或者有极高的相似度,那么在一定程度上,我们可以认为这两幅图是一样的,这就是直方图比较的应用之一。

  • 分析图像之间关系

两张图像的直方图反映了该图像像素的分布情况,可以利用图像的直方图,来分析两张图像的关系。

步骤

a.加载图像

b.将图像从BGR空间转化为HSV空间

cvtColor()把图像从RGB色彩空间转换到HSV色彩空间

c.计算直方图并归一化处理,

计算图像的直方图,然后归一化到[0~1]之间,用到函数 calcHist() 和 normalize() ;

d.直方图比较

HISTCMP_CORREL 相关性比较 值越大,相关度越高,最大值为1,最小值为0

HISTCMP_CHISQR 卡方法 值为0最好,值越小,相关度越高,最大值无上界,最小值0

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

HISTCMP_BHATTACHARYYA  巴氏距离(比较结果是很准的,计算结果范围为 0-1 ,0表示两个直方图非常相关,1最不相似) 在直方图相似度计算时,巴氏距离获得的效果最好,但计算是最为复杂的。

HISTCMP_HELLINGER

HISTCMP_CHISQR_ALT

该方法与巴氏距离法相同,常用于替代巴氏距离法用于纹理比较

HISTCMP_KL_DIV

该方法名为相对熵法,又名Kullback-Leibler散度法,在该方法中如果两个图像直方图完全一致,则计算数值为0,两个图像的相似性越小,计算数值越大。

使用上述方法之一进行比较,用到函数compareHist()。

 std::array<char, 256> cwd;std::cout << "exe 路径: " << _getcwd(cwd.data(), (int)cwd.size()) << std::endl;size_t pos = (std::string(cwd.data())).find_last_of("\\");std::string path = std::string(cwd.data()).substr(0, pos) + "\\image";std::vector<std::string> paths;cv::glob(path, paths);cv::Mat src1 = cv::imread(paths[0], cv::IMREAD_COLOR);cv::Mat src2 = cv::imread(paths[1], cv::IMREAD_COLOR);//计算相似度if (src2.channels() == 1) {//单通道时std::vector<cv::Mat>(src1);std::vector<int> channels{ 0 }; //单通道索引std::vector<int> histSizes{ 256 }; //直方图横轴大小std::vector<float>  ranges{ 0, 256 }; //统计范围 像素值cv::MatND hist1;cv::calcHist(std::vector<cv::Mat>(src1), channels, cv::Mat(), hist1, histSizes, ranges);cv::normalize(hist1, hist1, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());cv::Mat hist2;cv::calcHist(std::vector<cv::Mat>(src2), channels, cv::Mat(), hist1, histSizes, ranges);cv::normalize(hist2, hist2, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());double correl = cv::compareHist(hist1, hist2, cv::HISTCMP_CORREL);double chisqr = cv::compareHist(hist1, hist2, cv::HISTCMP_CHISQR);double intersect = cv::compareHist(hist1, hist2, cv::HISTCMP_INTERSECT);double bhattacharyya = cv::compareHist(hist1, hist2, cv::HISTCMP_BHATTACHARYYA);cout << "correl = " << correl << endl;cout << "chisqr = " << chisqr << endl;cout << "intersect = " << intersect << endl;cout << "bhattacharyya = " << bhattacharyya << endl;}else{//三通道时cv::cvtColor(src2, src1, cv::COLOR_BGR2HSV);cv::cvtColor(src1, src2, cv::COLOR_BGR2HSV);int h_bins = 50, s_bins = 60;int histSize[] = { h_bins, s_bins }; //柱状个数(横轴)float h_ranges[] = { 0, 180 };float s_ranges[] = { 0, 256 };//像素值 统计范围const float* ranges[] = { h_ranges, s_ranges };int channels[] = { 0, 1 };cv::MatND hist1;cv::calcHist(&src2, 1, channels, cv::Mat(), hist1, 2, histSize, ranges);cv::normalize(hist1, hist1, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());//计算二维cv::MatND hist2;cv::calcHist(&src1, 1, channels, cv::Mat(), hist2, 2, histSize, ranges);cv::normalize(hist2, hist2, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());//只比较二维double correl = cv::compareHist(hist1, hist2, cv::HISTCMP_CORREL); double chisqr = cv::compareHist(hist1, hist2, cv::HISTCMP_CHISQR);double intersect = cv::compareHist(hist1, hist2, cv::HISTCMP_INTERSECT);double bhattacharyya = cv::compareHist(hist1, hist2, cv::HISTCMP_BHATTACHARYYA);cout << "3 channels correl = " << correl << endl;cout << "3 channels chisqr = " << chisqr << endl;cout << "3 channels intersect = " << intersect << endl;cout << "3 channels bhattacharyya = " << bhattacharyya << endl;}

opencv 直方图比较相关推荐

  1. OpenCV直方图比较Histogram Comparison

    OpenCV直方图比较Histogram Comparison 直方图比较Histogram Comparison 目标 理论 代码 这个程序做什么? 解释 结果 直方图比较Histogram Com ...

  2. OpenCV学习-P29-P32 Opencv直方图均衡化、掩膜

    OpenCV学习-P29-P32 Opencv直方图均衡化及掩膜 1 直方图 2 直方图均衡化 3 直方图自适应均衡化 1 直方图 直方图原理:统计图像各个灰度区间的像素数 cv2.calcHist( ...

  3. OpenCV基础(16)OpenCV直方图均衡化和自适应直方图均衡化(CLAHE)

    在本教程中,您将学习使用OpenCV实现直方图均衡化和自适应直方图均衡化(CLAHE). 直方图均衡化是一种基本的图像处理技术,通过更新图像直方图的像素强度分布来调整图像的全局对比度.这样做可以使低对 ...

  4. Python,OpenCV直方图均衡化以提高图像对比度

    Python,OpenCV直方图均衡化以提高图像对比度 1. 效果图 2. 原理 2.1 直方图均衡化应用 2.2 直方图均衡化分类 3. 源代码 参考 这篇博客将介绍直方图均衡化(全局 & ...

  5. OpenCV 直方图的计算和绘制

    图像直方图 是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素个数.这种直方图中,横坐标的左侧为较暗的区域,而右侧为较亮的区域.因此一张较暗图片的直方图中的数据多集中于左侧和中间部分, ...

  6. OpenCV直方图计算Histogram Calculation

    OpenCV直方图均衡Histogram Equalization 直方图均衡Histogram Equalization 目标 什么是直方图? OpenCV为您提供什么 代码 解释 结果 直方图均衡 ...

  7. opencv 直方图_OpenCV之图像直方图反向投影

    python代码: import cv2 as cv import numpy as np from matplotlib import pyplot as pltdef back_projectio ...

  8. [Python图像处理] 三十七.OpenCV直方图统计两万字详解(掩膜直方图、灰度直方图对比、黑夜白天预测)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  9. python opencv直方图_【python opencv】直方图均衡

    搜索热词 考虑这样一个图像,它的像素值仅局限于某个特定的值范围.例如,较亮的图像将把所有像素限制在高值上.但是一幅好的图像会有来自图像所有区域的像素.因此,您需要将这个直方图拉伸到两端(如下图所示,来 ...

  10. opencv 直方图反向投影

    转载至:http://www.cnblogs.com/zsb517/archive/2012/06/20/2556508.html 直方图反向投影式通过给定的直方图信息,在图像找到相应的像素分布区域, ...

最新文章

  1. 系统、应用监控的缜密思路,性能瓶颈的克星
  2. excel表格行宽列高怎么设置_excel表格怎么设置行高列宽
  3. 【Asp.Net】:如何处理大量页面的身份验证跳转
  4. Js中for循环的阻塞机制
  5. Cortex-M3-寄存器
  6. python函数库_10. 标准库简介
  7. hdfs fsck命令查看HDFS文件对应的文件块信息(Block)和位置信息(Locations)
  8. java线程同步的实现_【Java多线程系列三】实现线程同步的方法
  9. java将图片传给页面,java将图片传为设定编码值显示(可做刺绣)
  10. SQL Server中的功能与存储过程
  11. 微信小程序全面开放近一年,姗姗来迟的阿里还有胜局吗?| 畅言
  12. OSPF邻接关系状态机
  13. 从mysql中检索数据后,通过userId的链接去delete数据
  14. 什么是协方差(covariance)?(延伸到 协方差矩阵、多元高斯分布、PCA)
  15. oracle 创建表格乱码,数据库导出excel表格是乱码怎么办-oracle 导出excel 乱码怎么办...
  16. cad批量打印_CAD如何进行批量打印图纸
  17. 3D视觉笔记(1) - 双目视觉三维测量原理
  18. (6)LinuxI2C驱动--I2C设备驱动
  19. 推荐几个优秀的echarts 图表网站,让你轻松搞定全部报表
  20. json格式问题解决方式!

热门文章

  1. 阿里巴巴iconfont字体图标使用方法
  2. 指针:const与指针
  3. [pwn]格式化字符串:0ctf 2015 login writeup
  4. Cox 比例风险模型中HR和置信区间
  5. 优先队列 HDU4544
  6. 创建BUG时增加字段
  7. HTML Hover 的巧用。
  8. Matlab计算波形的总谐波失真--THD(附完整代码)
  9. python 实现差商
  10. otg usb 定位_USB OTG插入检测识别