Opencv中的直方图(3)直方图比较函数compareHist()的使用
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
比较两个直方图。
函数 cv::compareHist 使用指定的方法比较两个密集或两个稀疏直方图。
该函数返回 d ( H 1 , H 2 ) d(H_1, H_2) d(H1,H2)
虽然该函数在处理一维、二维或三维的密集直方图时效果很好,但它可能不适合高维的稀疏直方图。在这样的直方图中,由于别名(aliasing)和采样问题,非零直方图bin的坐标可能会略微偏移。为了比较这样的直方图或更一般的加权点的稀疏配置,可以考虑使用 EMD 函数。
compareHist 是 OpenCV 中用于比较两个直方图相似性的函数。这个函数可以用来衡量两个直方图之间的差异或相似程度,常用于图像处理和计算机视觉任务中,比如图像检索、图像匹配或特征比较等。
函数原型1
ouble cv::compareHist
(InputArray H1,InputArray H2,int method
)
参数1
- 参数H1 第一个被比较的直方图。
- 参数H2 第二个被比较的直方图,与 H1 具有相同的尺寸。
- 参数method 比较方法,参见 HistCompMethods。
函数原型2
这是一个重载的成员函数,为了方便而提供。它与上述函数的不同之处仅在于它接受的参数。
double cv::compareHist
(const SparseMat & H1,const SparseMat & H2,int method
)
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>int main()
{// 加载两幅图像cv::Mat image1 = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/qiu.jpg", cv::IMREAD_GRAYSCALE );cv::Mat image2 = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/qiu2.png", cv::IMREAD_GRAYSCALE );if ( image1.empty() || image2.empty() ){std::cerr << "Error: Images not found or unable to read." << std::endl;return -1;}// 计算两个图像的直方图int histSize = 256;float range[] = { 0, 256 };const float* histRange = { range };bool uniform = true;bool accumulate = false;cv::Mat hist1, hist2;calcHist( &image1, 1, 0, cv::Mat(), hist1, 1, &histSize, &histRange, uniform, accumulate );calcHist( &image2, 1, 0, cv::Mat(), hist2, 1, &histSize, &histRange, uniform, accumulate );// 归一化直方图cv::normalize( hist1, hist1, 0, 1, cv::NORM_MINMAX, -1, cv::Mat() );cv::normalize( hist2, hist2, 0, 1, cv::NORM_MINMAX, -1, cv::Mat() );// 比较两个直方图double result_correlation = compareHist( hist1, hist2, cv::HISTCMP_CORREL );double result_chisqr = compareHist( hist1, hist2, cv::HISTCMP_CHISQR );double result_intersect = compareHist( hist1, hist2, cv::HISTCMP_INTERSECT );double result_bhattacharyya = compareHist( hist1, hist2, cv::HISTCMP_BHATTACHARYYA );std::cout << "Correlation: " << result_correlation << std::endl;std::cout << "Chi-Squared: " << result_chisqr << std::endl;std::cout << "Intersection: " << result_intersect << std::endl;std::cout << "Bhattacharyya Distance: " << result_bhattacharyya << std::endl;return 0;
}
运行结果
输出结果解释
-
Correlation (相关性):
- 含义:相关性比较方法衡量两个直方图之间的线性关系。值范围通常在 -1 到 1 之间。
- 结果:result_correlation 表示两个直方图的相关性得分。
- 解释:如果结果接近 1,则表示两个直方图高度相关;如果接近 0,则表示没有相关性;如果接近 -1,则表示负相关。
-
Chi-Squared (卡方):
- 含义:卡方比较方法衡量两个直方图之间的差异。值范围通常是非负数。
- 结果:result_chisqr 表示两个直方图的卡方得分。
- 解释:如果结果接近 0,则表示两个直方图非常相似;如果结果较大,则表示两个直方图差异较大。
-
Intersection (交集):
- 含义:交集比较方法衡量两个直方图的交集部分。值范围通常在 0 到 1 之间。
- 结果:result_intersect 表示两个直方图的交集得分。
- 解释:如果结果接近 1,则表示两个直方图高度重合;如果接近 0,则表示几乎没有重合。
-
Bhattacharyya Distance (巴塔查里雅距离):
- 含义:巴塔查里雅距离衡量两个概率分布之间的相似性。值范围通常是非负数。
- 结果:result_bhattacharyya 表示两个直方图的巴塔查里雅距离。
- 解释:如果结果接近 0,则表示两个直方图非常相似;如果结果较大,则表示两个直方图差异较大。
相关文章:

Opencv中的直方图(3)直方图比较函数compareHist()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 比较两个直方图。 函数 cv::compareHist 使用指定的方法比较两个密集或两个稀疏直方图。 该函数返回 d ( H 1 , H 2 ) d(H_1, H_2) d(H1,H2…...

压力测试(内存、磁盘、网络、cpu)
压力测试 1. 内存压力测试工具stressmemtester 2. 磁盘压力测试工具fio (Flexible I/O Tester)dd (Data Duplicator) 3. 网络压力测试工具iperf3speedtest-cli 4. CPU压力测试工具stress-ng 为了满足更详细的需求,以下是针对内存、磁盘和网络压力测试工具的更深入介…...

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 原生代码实现动态扩散效果
ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 原生代码实现动态扩散效果 核心代码完整代码:在线示例 ArcGIS Maps SDK for JavaScript 从 4.29 开始增加 RenderNode 类,可以添加数据以及操作 FBO(ManagedFBO)&#…...

Java 设计模式-代理模式
目录 概述 一. 什么是代理模式 1. 举例说明 二. 代理模式作用 1. 保护代理 2. 增强功能 3. 代理交互 4. 远程代理: 三. 代理模式3个角色 四. 静态代理 1. 代码示例: 五. JDK动态代理 1. 代码示例: 六. CGLIB 动态代理 1.代码示…...

CTF靶场之BUUCTF介绍
最后开始关注CTF,我们先了解一下什么CTF:CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式,最后以夺取FLAG为成功。 从网上找了一个免费的靶场——BUUCTF…...

学会分析问题,画出分析图,解释问题过程,找出规律 ;整数数组分为左右2个部分,左边位奇数右边偶数
// 整数数组左边是奇数右边是偶数.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include<stdio.h> void swap(int& a,int& b) {int tempa;ab;btemp; } int main(int argc, char* argv[]) {int a[7]{1,2,3,4,5,…...

数学基础 -- 线性代数正交多项式之勒让德多项式展开推导
勒让德多项式展开的详细过程 勒让德多项式是一类在区间 [ − 1 , 1 ] [-1, 1] [−1,1] 上正交的多项式,可以用来逼近函数。我们可以将一个函数表示为勒让德多项式的线性组合。以下是如何推导勒让德多项式展开系数 a n a_n an 的详细过程。 1. 勒让德展开的基本…...

Redis实战宝典:从主从模式、哨兵模式、集群模式一步步理解Redis集群
目录标题 Redis 集群的三种模式主从复制主从复制概念主从复制原理主从复制优缺点 哨兵集群哨兵概念哨兵功能下线判断主库选举故障转移哨兵模式优缺点 Cluser 集群Redis 集群的数据分片 Redis 集群的三种模式 在生产环境中,我们使用 Redis 通常采用集群模式…...

828华为云征文|华为云Flexus X搭建借贷管理系统、二次开发借贷小程序 前端源码uniapp
在华为云828 B2B企业节的盛宴中,Flexus X实例以其卓越的算力性能和灵活的资源配置脱颖而出。对于追求极致性能、渴望在借贷管理、电商交易等场景中脱颖而出的您来说,Flexus X无疑是最佳拍档。搭载创新加速引擎,让您的自建MySQL、Redis、Nginx…...

网站安全需求分析与安全保护工程
网站安全威胁与需求分析 网站安全概念 网站:是基于B/S技术架构的综合信息服务平台,主要提供网页信息及业务后台对外接口服务。 网站安全性: 机密性:网站信息及相关数据不被授权查看或泄露完整性:网站信息及数据不能…...

后谷歌时代
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

【CMake编译报错小复盘】CMAKE_CUDA_ARCHITECTURES,CMake version,GCC version问题
今天在写大模型量化推理框架时遇到了一些编译上的错误,简单复盘一下问题和解决方案: 问题1:CMAKE_CUDA_ARCHITECTURES 报错信息: CMake Error: CMAKE_CUDA_ARCHITECTURES must be non-empty if set cmake和cuda相关的报错通常都…...

PMP--一、二、三模--分类--14.敏捷--技巧--DoDDoR
文章目录 技巧DoD&DoR 二模14.敏捷--术语表--完成的定义DoD--Definition of Done--是指一个项目什么时候可以被认为是“完成”的标准,它可以包括各种质量和功能的具体要求。--它是团队需要满足的所有标准的核对单,只有可交付成果满足该核对单才能视为…...

【大数据】如何读取多个Excel文件并计算列数据的最大求和值
导语: 在数据分析和处理中,我们经常需要从多个Excel文件中提取数据并进行计算。本文将带您通过一个实用的Python教程,学习如何读取D盘目录下特定文件夹内的多个Excel文件,并计算特定列数据的最大求和值。 文章目录 一、准备工作二…...

【运维项目经历|043】上云项目-服务从物理机迁移到AWS云服务器
🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专家博主 💊交流社区:CSDN云计算交流社区欢迎您的加入! 文章目录 项目名称项目背景项目目标项目成…...

【OpenCV】灰度化和二值化处理图像
文章目录 1. 图像灰度化处理对比2. 代码示例3. 二值化处理 1. 图像灰度化处理对比 2. 代码示例 #include <opencv2/opencv.hpp> using namespace cv;int main() {Mat currentImage imread("path_to_image.jpg"); // 读取彩色图像Mat grayImage;// 将彩色图像…...

【生命不息,动出奇迹!】多系统萎缩患者必看
亲爱的朋友们,当我们面对生活的挑战,尤其是像多系统萎缩(MSA)这样的复杂疾病时,保持乐观与积极,寻找适合自己的锻炼方式显得尤为重要!💪 MSA虽然会影响身体的多个系统,包…...

Verilog FPGA 仿真 控制任务
在Verilog仿真中,我们可以使用一些控制语句和系统任务来管理仿真过程。这些语句和任务可以帮助我们控制仿真的进行并输出必要的信息。 1. $stop:这是一个系统任务,用于停止运行仿真。在ModelSim中,可以继续仿真。 2. $stop(n)&…...

在Vision Pro上实现五子棋、益智休闲游戏:一个可二次开发的框架
苹果Vision Pro平台的推出,空间计算技术迎来了新的发展机遇。在这一背景下,物流游戏(Logistics Game)作为一个为Vision Pro平台量身打造的空间计算战略游戏,不仅展示了空间计算的魅力,也为开发者提供了一个可参考的框架。本文将介绍物流游戏的核心玩法,并总结其开发过程…...

使用 `Vitesse Uni App` 创建微信小程序并配置 uview-plus 和 alovajs
使用 Vitesse Uni App 创建微信小程序 Vitesse Uni App:https://vitesse-docs.netlify.app/ UI:https://uview-plus.jiangruyi.com/components/intro.html 编辑器:VScode 安装 Volar(Vue Offices)插件 创建项目 pnpm …...

C#迭代器和接口IEnumerable,IEnumerator
一.迭代器 学过C的都知道,迭代器是STL中的一个类,用来遍历容器。 vector<int>::iterator iter; for (iter v1.begin(); iter ! v1.end(); iter) C#中迭代器也是用来遍历集合,本质上是一个类/接口(IEnumerator),可以解决…...

通信工程学习:什么是IP-CAN(IP连接接入网)
IP-CAN:IP连接接入网 IP-CAN(IP连接接入网)是一个通过IP实现用户设备(UE)与IP多媒体子系统(IMS)实体之间连通的网络实体和接口的集合。以下是对IP-CAN的详细解释: 一、定义与概述 1…...

使用 MongoDB 构建 AI:Patronus 如何自动进行大语言模型评估来增强对生成式 AI 的信心
大语言模型可能不可靠,这几乎算不上头条新闻。对于某些用例,这可能会带来不便。而对于其他行业,尤其是受监管行业,后果则要严重得多。于是,业内首个大语言模型自动评估平台 Patronus AI 应运而生。 Patronus AI 由 Met…...

openpose1.7.0编译 cuda12.2 cudnn 8.9.7.29 python3.7
参考链接: openpose(windows11)安装及常见问题及解决方案_openpose windows-CSDN博客 openpose笔记--Win11编译安装OpenPose(Python API)_openpose安装-CSDN博客 https://zhuanlan.zhihu.com/p/383661308 遇到问题: 1、cmake时,手动设置…...

【华为OD流程】性格测试选项+注意事项
可上 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1441了解算法冲刺训练(备注【CSDN】否则不通过) 文章目录 相关推荐阅读性格测试形式性格测试题型性格测试原则性格测试一致性性格测试选项举例最合适的性格适中的性格不适合的性格答题方法分享特别注意华为OD算法/大厂…...

《生物学教学》
《生物学教学》杂志是由国家教育部主管、华东师范大学主办,向国内外正式发行的全国教育类核心期刊。主要栏目有:生物科学综述、课程标准与教材、当代教育论坛、国外教育动态、教师教育、教育教学研究、教学设计案例、信息技术、考试与评价、实验教学、探…...

C++ 标准库的典型内容
目录 C 标准库的典型内容1. std::declval定义使用方法常见用途注意事项 2. std::true_type 和 std::false_type定义使用方法常见用途注意事项 3. std::void_t定义使用方法常见用途注意事项 4. std::conditional定义使用方法常见用途注意事项 5. std::function定义使用方法常见用…...

【C++初阶】:C++入门,引用概念及其性质
文章目录 一、引用的概念二、引用的语法规则1、引用特性2、常引用 二、引用的使用场景1. 引用做参数2. 引用做返回值 三、引用和指针的区别 一、引用的概念 首先明确一下,引用不是定义一个新的变量,而是给已经存在的变量起一个别名,变量和他…...

Linux 中的 crontab 命令介绍以及使用
文章目录 Linux Crontab 完全指南什么是 Crontab?Crontab 文件的基本格式特殊符号解释: 如何使用 Crontab查看当前用户的 Crontab编辑 Crontab删除 Crontab Crontab 示例每天晚上 12 点备份数据库每个工作日的早上 9 点发送日报每隔 15 分钟清理临时文件…...

单片机组成原理
大纲 C语言指针如何与硬件对应 底层疑问的源头 我已造好轮子,等你来理解 外设电路大概是什么结构 解决底层开发中关于配置、寄存器) 外设电路的疑问 从此可以快速上手新的单片机、新的外设芯片 对外设芯片的内部结构有本质理解,看手册不再是问题 固件库…...