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 …...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
