Opencv中的直方图(3)直方图比较函数compareHist()的使用

news2024/11/15 15:35:56
  • 操作系统: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;
}

运行结果

在这里插入图片描述

输出结果解释

  1. Correlation (相关性):

    • 含义:相关性比较方法衡量两个直方图之间的线性关系。值范围通常在 -1 到 1 之间。
    • 结果:result_correlation 表示两个直方图的相关性得分。
    • 解释:如果结果接近 1,则表示两个直方图高度相关;如果接近 0,则表示没有相关性;如果接近 -1,则表示负相关。
  2. Chi-Squared (卡方):

    • 含义:卡方比较方法衡量两个直方图之间的差异。值范围通常是非负数。
    • 结果:result_chisqr 表示两个直方图的卡方得分。
    • 解释:如果结果接近 0,则表示两个直方图非常相似;如果结果较大,则表示两个直方图差异较大。
  3. Intersection (交集):

    • 含义:交集比较方法衡量两个直方图的交集部分。值范围通常在 0 到 1 之间。
    • 结果:result_intersect 表示两个直方图的交集得分。
    • 解释:如果结果接近 1,则表示两个直方图高度重合;如果接近 0,则表示几乎没有重合。
  4. Bhattacharyya Distance (巴塔查里雅距离):

    • 含义:巴塔查里雅距离衡量两个概率分布之间的相似性。值范围通常是非负数。
    • 结果:result_bhattacharyya 表示两个直方图的巴塔查里雅距离。
    • 解释:如果结果接近 0,则表示两个直方图非常相似;如果结果较大,则表示两个直方图差异较大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2102512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚幻引擎VR游戏开发01 | VR设备和术语

四款Unreal Engine默认配套按键映射的VR设备 IMC按键映射 Oculus Touch (R) Grip Axis: 代表Oculus Rift或Quest设备的右手控制器的抓握轴输入。Valve Index (R) Grip Axis: 代表Valve Index设备的右手控制器的抓握轴输入。Vive (R) Grip: 代表HTC Vive设备的右手控制器的抓握…

[物理专题]经典浮力题目的Fh图像绘制

这段代码用于绘制物体在液体中受到的浮力变化的图像&#xff0c;它有多个好处&#xff1a; 直观展示数据&#xff1a;通过图形化展示&#xff0c;可以直观地看到物体在液体中浸入深度与受到的浮力之间的关系。 教育和学习工具&#xff1a;这种类型的图像常用于教育目的&#x…

不小心删除了 Android 手机上的短信?3 步流程恢复误删除的短信以及图片、视频、联系人

不小心删除了 Android 手机上的短信&#xff1f;别担心&#xff0c;Android 版奇客数据恢复工具可以帮助您通过简单的 3 步流程恢复已删除的短信以及图片、视频、联系人等。 如何在 Android 上恢复已删除的短信 不小心删除了 Android 手机上的短信&#xff1f;Android 版奇客数…

u盘格式化数据还能恢复吗?点击了解实用教程

U盘是电子数据存储设备&#xff0c;我们主要用它来转移数据、随身携带数据等。同时U盘在使用过程中常会遇到问题&#xff0c;比如U盘中毒&#xff0c;U盘中毒会导致里面保存的数据文件无法读取&#xff0c;我们需要进行U盘格式化。格式化之后的U盘才可以继续使用&#xff0c;那…

611.有效三角形的个数

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;双指针&#xff09; 如何构成一个三角形呢&#xff1f; 只需要两边之和大于第三边&#xff1b; 但是&#xff0c;如果已知三条边的大小关系&#xff0c;只需要两条较小边的和大于第三条边即可。 所以&#xff0c;我…

云计算实训41——部署project_exam_system项目(续)

# 创建脚本&#xff0c;可以在java环境中运行任何的jar包或者war包#!/bin/bash/usr/local/jdk/bin/java -jar /java/src/*.?ar一、思路分析 &#xff08;1&#xff09;nginx 1、下载镜像&#xff0c;将本地的dist项目的目录挂载在容器的/usr/share/nginx/html/ 2、启动容器 …

哈希:哈希函数 | 哈希概念 | 哈希冲突 | 闭散列 | 开散列

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

在线式环氧乙烷检测仪:现代工业生产中的环氧乙烷安全监测

在现代工业生产的广阔领域中&#xff0c;环氧乙烷&#xff08;C2H4O&#xff09;作为一种不可或缺的化工原料&#xff0c;其应用范围广泛且深远&#xff0c;涵盖了涂料、树脂、塑料、印染、纺织品等多个关键行业。然而&#xff0c;环氧乙烷的化学性质极为活泼&#xff0c;不仅易…

小阿轩yx-云原生存储Rook部署Ceph

小阿轩yx-云原生存储Rook部署Ceph 前言 Rook 一款云原生存储编排服务工具由云原生计算基金会&#xff08;CNCF&#xff09;孵化&#xff0c;且于2020年10月正式进入毕业阶段。并不直接提供数据存储方案&#xff0c;而是集成了各种存储解决方案&#xff0c;并通过一种自管理、…

SprinBoot+Vue图书馆预约与占座微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

“Flash闪存”介绍 及 “SD NAND Flash”产品的测试含例程

文章目录 前言一、“FLASH闪存”是什么&#xff1f;1. 简介2. 特点3. 未来发展 二、SD NAND Flash1. 概述2. 特点3. 引脚分配4. 数据传输模式5. SD NAND寄存器6. 通电图7. 参考设计 三、STM32测试例程1. 初始化2. 但数据块测试3. 多数据块测试4. 状态缓冲 前言 本篇除了对flas…

Java JVM 垃圾回收算法详解

Java 虚拟机&#xff08;JVM&#xff09;是运行 Java 应用程序的核心&#xff0c;它的垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制是 JVM 中非常重要的一个部分。垃圾回收的主要任务是自动管理内存&#xff0c;回收那些不再被使用的对象&#xff0c;从而释放内…

VOCs将纳入征税,LDAR系统的排放量计算准确度将要求更加规范,VOCs排放量计算准确度会更加重视,直接影响到税费

笔者见过很多不同公司的LDAR管理系统以及和很多检测公司技术人员沟通&#xff0c;部分技术人员在排放量计算方面尽然不知道中间点等关键要素&#xff0c;有的系统计算排放量不考虑中间点算法、有的计算一年四轮次检测 每轮都是独立计算和上轮检测数据没有任何关系&#xff08;这…

YOLOv8改进实战 | 引入多维协作注意模块MCA,实现暴力涨点

YOLOv8专栏导航&#xff1a;点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习&#xff0c;并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8是一种尖端的、最先进的 (SOTA)…

Windows安装anaconda注意事项及jupyter notebook更换目录

anaconda的介绍就不罗嗦了&#xff0c;既然准备安装了&#xff0c;说明你已经有所了解了。直入主题&#xff0c;Anaconda官网下载&#xff0c;实在太慢&#xff0c;可到https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/下载&#xff0c;注意&#xff0c;这是清华镜像站…

Mysql中的锁机制详解

一、概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中&#xff0c;除了传统的计算资源&#xff08;如CPU、RAM、I/O等&#xff09;的争用以外&#xff0c;数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决…

新电脑Win11系统想要降级为Win10怎么操作?

前言 现在的电脑大部分都是Windows 11系统&#xff0c;组装机还好一些&#xff0c;如果想要使用Windows 10&#xff0c;只需要在安装系统的时候选择Windows 10镜像即可。 但是对于新笔记本、厂商的成品机、一体机来说&#xff0c;只要是全新的电脑&#xff0c;基本上都是Wind…

黑马JavaWeb开发笔记14——Tomcat(介绍、安装与卸载、启动与关闭)、入门程序解析(起步依赖、SpringBoot父工程、内嵌Tomcat)

文章目录 前言一、Web服务器-Tomcat1. 简介1.1服务器概述1.2 Web服务器1.3 Tomcat 2. 基本使用2.1 下载2.2 安装与卸载2.3 启动与关闭2.4 常见问题 二、入门程序解析1. 起步依赖2. SpringBoot父工程3. 内嵌Tomcat 总结 前言 本篇文章是2023年最新黑马JavaWeb开发笔记14&#x…

[Java]SpringBoot登录认证流程详解

登录认证 登录接口 1.查看原型 2.查看接口 3.思路分析 登录核心就是根据用户名和密码查询用户信息,存在则登录成功, 不存在则登录失败 4.Controller Slf4j RestController public class LoginController {Autowiredprivate EmpService empService;/*** 登录的方法** param …

【Python】一文详细向您介绍 bisect_left 函数

【Python】一文详细向您介绍 bisect_left 函数 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&#x…