直方图比较

目录

1、直方图比较的概念

2、直方图比较的主要原因

3、典型应用场景

4、基础直方图比较

5、多通道直方图比较

6、实时直方图检测

1、直方图比较的概念

       直方图比较是通过数学方法计算两个直方图之间的相似度或差异度的技术。在计算机视觉中,直方图是对图像特征(如颜色、梯度方向等)的统计分布表示,比较两个直方图的相似性可以反映图像内容的相似程度。

2、直方图比较的主要原因

1. 图像相似性判断 通过比较颜色/纹理直方图,可以快速判断两张图片的内容相似性,常用于:
   图像检索
   重复图片检测
   视频关键帧提取
2. 目标识别与匹配 当物体的颜色分布具有特征性时(如红色消防车),直方图比较能辅助识别。
3. 变化检测 监控场景中比较前后帧直方图差异。
4. 颜色校正验证 在图像处理流水线中,通过比较输入输出图像的直方图差异来验证处理效果。


3、典型应用场景

医学影像 :比较病灶区域与正常组织的灰度分布
工业检测 :检测产品颜色是否符合标准(如油漆颜色一致性)
自动驾驶 :通过路标颜色直方图识别交通标志
直方图比较的优势在于计算高效(不受旋转/轻微形变影响),但需注意它缺乏空间信息,常与其他特征结合使用。

4、基础直方图比较

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main() {// 读取两张对比图像Mat img1 = imread("image1.jpg");Mat img2 = imread("image2.jpg");if(img1.empty() || img2.empty()) return -1;// 转换为HSV色彩空间(比较颜色直方图更有效)Mat hsv1, hsv2;cvtColor(img1, hsv1, COLOR_BGR2HSV);cvtColor(img2, hsv2, COLOR_BGR2HSV);// 设置直方图参数int h_bins = 50, s_bins = 60;int histSize[] = {h_bins, s_bins};float h_range[] = {0, 180};float s_range[] = {0, 256};const float* ranges[] = {h_range, s_range};int channels[] = {0, 1}; // 使用H和S通道// 计算直方图Mat hist1, hist2;calcHist(&hsv1, 1, channels, Mat(), hist1, 2, histSize, ranges, true, false);calcHist(&hsv2, 1, channels, Mat(), hist2, 2, histSize, ranges, true, false);// 归一化直方图normalize(hist1, hist1, 0, 1, NORM_MINMAX, -1, Mat());normalize(hist2, hist2, 0, 1, NORM_MINMAX, -1, Mat());// 比较直方图(四种方法)double compare_methods[4];compare_methods[0] = compareHist(hist1, hist2, HISTCMP_CORREL);compare_methods[1] = compareHist(hist1, hist2, HISTCMP_CHISQR);compare_methods[2] = compareHist(hist1, hist2, HISTCMP_INTERSECT);compare_methods[3] = compareHist(hist1, hist2, HISTCMP_BHATTACHARYYA);// 输出比较结果cout << "相关性比较 [越接近1越相似]: " << compare_methods[0] << endl;cout << "卡方比较 [越接近0越相似]: " << compare_methods[1] << endl;cout << "直方图交集 [越大越相似]: " << compare_methods[2] << endl;cout << "巴氏距离 [越接近0越相似]: " << compare_methods[3] << endl;return 0;
}

比较算法说明

OpenCV提供四种直方图比较方法:

相关性比较

HISTCMP_CORREL

值范围[-1,1],1表示完全匹配

卡方检验

HISTCMP_CHISQR

值范围[0,∞),0表示完全匹配

直方图相交

HISTCMP_INTERSECT

值越大相似度越高

巴氏距离

HISTCMP_BHATTACHARYYA

值范围[0,1],0表示完全匹配

5、多通道直方图比较

// ... 图像读取和转换代码同上 ...// 扩展为3通道直方图(H,S,V)
int channels[] = {0, 1, 2};
int histSize[] = {30, 32, 32}; // HS通道精度更高
float h_range[] = {0, 180};
float s_range[] = {0, 256};
float v_range[] = {0, 256};
const float* ranges[] = {h_range, s_range, v_range};// 计算直方图
calcHist(&hsv1, 1, channels, Mat(), hist1, 3, histSize, ranges, true, false);
calcHist(&hsv2, 1, channels, Mat(), hist2, 3, histSize, ranges, true, false);// 添加EMD(Earth Mover's Distance)比较
Mat sig1, sig2;
// 将直方图转换为特征向量格式
// ... (需要实现直方图到特征向量的转换) ...double emd = EMD(sig1, sig2, DIST_L2);
cout << "推土机距离: " << emd << endl;

6、实时直方图检测

VideoCapture cap(0);
Mat frame, last_frame;
bool first_frame = true;while(true) {cap >> frame;if(frame.empty()) break;Mat hsv;cvtColor(frame, hsv, COLOR_BGR2HSV);// 计算当前帧直方图Mat current_hist;calcHist(&hsv, 1, channels, Mat(), current_hist, 2, histSize, ranges);normalize(current_hist, current_hist, 0, 1, NORM_MINMAX);if(!first_frame) {double similarity = compareHist(last_hist, current_hist, HISTCMP_CORREL);putText(frame, format("相似度: %.2f", similarity), Point(20,50), FONT_HERSHEY_SIMPLEX, 1, Scalar(0,255,0), 2);}first_frame = false;current_hist.copyTo(last_hist);imshow("Live", frame);if(waitKey(30) >= 0) break;
}

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

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

相关文章

Windows11 VS code 安装 Cline 调用 Github MCP 配置过程坑点汇总

背景 为了调研 MCP 在 windows 上如何使用本地的命令执行一些操作而实现自动化的过程&#xff0c;在 B 站视频的指导下&#xff0c;进行相应填坑过程&#xff0c;最终运行起来&#xff0c;并实现 github 自动化编程并提交代码的过程。 B 站 Cline 视频演示 Cline Cline 是一…

kdump详解

kdump 是 Linux 系统中的一种内核崩溃转储机制&#xff0c;用于在系统崩溃时将内存中的数据保存到磁盘上&#xff0c;以便后续分析系统崩溃的原因。以下是对 kdump 的详细介绍&#xff1a; 1、工作原理 kdump 利用了 Linux 系统中的双启动机制。当系统启动时&#xff0c;它会…

RGB三原色

本文来源 &#xff1a; 腾讯元宝 ​​RGB三原色&#xff08;红绿蓝&#xff09;详解​​ RGB&#xff08;Red, Green, Blue&#xff09;是光学的三原色&#xff0c;通过不同比例的混合可以产生人眼可见的绝大多数颜色。它是现代显示技术&#xff08;如屏幕、投影仪&#xff09…

CSS兼容性:挑战与策略

CSS兼容性&#xff1a;挑战与策略 引言 在前端开发的广阔领域中&#xff0c;跨浏览器兼容性无疑是最棘手且难以预测的挑战之一。当我们精心设计的网页在Chrome中完美呈现&#xff0c;却在Safari中布局崩溃&#xff0c;或在Firefox中交互失效时&#xff0c;这种挫折感是每位前…

[ 设计模式 ] | 单例模式

单例模式是什么&#xff1f;哪两种模式&#xff1f; 单例模式就是一个类型的对象&#xff0c;只有一个&#xff0c;比如说搜索引擎中的索引部分&#xff0c;360安全卫士的桌面悬浮球。 饿汉模式和懒汉模式&#xff1a;饿汉模式是线程安全的&#xff0c;懒汉模式不是线程安全的…

Notebook.ai 开源程序是一套工具,供作家、游戏设计师和角色扮演者创建宏伟的宇宙 - 以及其中的一切

​一、软件介绍 文末提供程序和源码下载 Notebook.ai 开源程序是一套工具&#xff0c;供作家、游戏设计师和角色扮演者创建宏伟的宇宙 - 以及其中的一切。 二、软件特点 Notebook 是作家的规划工具&#xff0c;用于创建从宇宙到角色、情节到单个项目的任何内容。通过浏览器、…

centos7.0无法安装php8.2/8.3

在centos安装php8.2报错 configure: error: *** A compiler with support for C17 language features is required. 配置过程检测到你的系统编译器不支持 C17 语言特性&#xff0c;而 PHP 8.2 的编译需要编译器支持 C17 sudo yum update -y sudo yum install centos-releas…

Three.js + React 实战系列 - 客户评价区细解教程 Clients 组件✨(回答式评价 + 评分星级)

对个人主页设计和实现感兴趣的朋友可以订阅我的专栏哦&#xff01;&#xff01;谢谢大家&#xff01;&#xff01;&#xff01; 在这篇博客中&#xff0c;我们将实现一个简洁的 Hear from My Clients 客户评价区域。这个区块在个人主页中可以突显用户体验和专业度&#xff0c;帮…

Vim 命令从头学习记录

学习链接&#xff1a;eleon-vim基础教程 Vim - 基础翻屏操作 光标移动&#xff1a;hjkl 20j 向下移动20行&#xff0c;w 向后移动一个字符&#xff0c;b 向前移动一个字符。 Ctrl u 向上翻半页 UP Ctrl d 向下翻半页 Down Ctrl f 向下翻整页 Forward Ctrl b 向上翻整页 …

Linux系统编程--基础指令(!!详细讲解+知识拓展)

第一讲 基础指令 ​ 我们现如今自己使用的电脑大部分是用的都是windows或者macOS&#xff0c;并配合上由微软和苹果开发的图形化界面&#xff0c;所以使用鼠标再屏幕上进行点击即可完成许多任务。但是作为操作系统的学习者&#xff0c;在linux的基础上不再使用图形化界进行操作…

ADK 第四篇 Runner 执行器

智能体执行器 Runner&#xff0c;负责完成一次用户需求的响应&#xff0c;是ADK中真正让Agent运行起来的引擎&#xff0c;其核心功能和Agents SDK中的Runner类似&#xff0c;具体作用如下&#xff1a; 会话管理&#xff1a;自动读取/写入 SessionService&#xff0c;维护历史信…

【Tauri2】37——后端处理invoke

目录 前言 正文 随便看看 看看get 看看parse_invoke_request 看看message_handler 看看handle_ipc_message 看看webview的on_message方法 第一种情况的处理 第二种情况的处理 运行通信函数 返回的处理 整个流程 前言 【Tauri2】033 __TAURI_INTERNALS__和invoke-C…

kotlin 05flow -从 LiveData 迁移到 Kotlin Flow 完整教程

一 从 LiveData 迁移到 Kotlin Flow 完整教程 LiveData 长期以来是 Android 架构组件中状态管理的核心&#xff0c;但随着 Kotlin Flow 的成熟&#xff0c;Google 官方推荐将现有 LiveData 迁移到 Flow。本教程基于官方文章并扩展实践细节&#xff0c;完成平滑迁移。 一、为什…

C++负载均衡远程调用学习之获取主机信息功能

目录 01Lars-lbAgentV0.2-赋值均衡数据结构关系分析 02 Lars-lbAgent0.2-host_info-load_balance-route_lb数据结构的定义 03Lars-lbAgentV0.2-proto协议的定义 04 Lars-lbAgentV0.2-route_lb与UDP server的关联 05 -Lars-lbAgentV0.2-route_lb与UDP server的关联 06Lars…

2025系统架构师---论软件的设计模式论文

2023 年,我所在的公司承担了某部网络靶场的研发任务。我作为公司的技 术总监,希望能打造基于网络靶场的系列产品,参与到项目的设计中,以期开发 扩展性和可维护性良好的网络靶场,为以后的产品开发打下基础。网络靶场是网 络安全技术研究的基础支撑平台,它利用虚拟的和实物…

Kubernetes排错(七)-节点排错

1、节点 Crash 与 Vmcore 分析 kdump 介绍​ 目前大多 Linux 发新版都会默认开启 kdump 服务&#xff0c;以方便在内核崩溃的时候, 可以通过 kdump 服务提供的 kexec 机制快速的启用保留在内存中的第二个内核来收集并转储内核崩溃的日志信息(vmcore 等文件), 这种机制需要服务…

【QT】QT中的软键盘设计

QT的软键盘设计 1.软键盘制作步骤2.介绍有关函数的使用3.出现的编译错误及解决办法示例代码1&#xff1a;按键事件实现软键盘现象&#xff1a;示例代码2&#xff1a;按键事件实现软键盘&#xff08;加特殊按键&#xff09;现象&#xff1a; 软键盘移植到新的工程的步骤&#xf…

【LaTeX+VSCode本地Win11编译教程】

LaTeXVSCode本地编译教程参考视频&#xff1a; LaTeXVSCode本地编译教程 下面提供一种Win11的Latex环境配置和设置方案&#xff0c;首先vscode安装参考博客&#xff1a;【VscodeGit教程】&#xff0c;然后准备安装Latex相关组件 在 https://miktex.org/download 下载 miktex 并…

2025五一杯数学建模ABC题赛题已出

2025五一杯数学建模ABC题赛题已出 A: B: C:

Springclound常用五大组件及其使用原理

注册中心Eureka Eureka-Server&#xff1a;就是服务注册中心&#xff08;可以是一个集群&#xff09;&#xff0c;对外暴露自己的地址。 提供者&#xff1a;启动后向Eureka注册自己信息&#xff08;地址&#xff0c;服务名称等&#xff09;&#xff0c;并且定期进行服务续约 …