当前位置: 首页 > news >正文

直方图比较

目录

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.xdnf.cn/news/289063.html

相关文章:

  • SecureCRT 使用指南:安装、设置与高效操作
  • springboot+mysql+element-plus+vue完整实现汽车租赁系统
  • 文本三剑客试题
  • 【Elasticsearch入门到落地】12、索引库删除判断以及文档增删改查
  • 【Leetcode 每日一题 - 补卡】1128. 等价多米诺骨牌对的数量
  • 【Unity】AssetBundle热更新
  • Java中线程间数据共享:ThreadLocal与ScopedValue
  • 二、【LLaMA-Factory实战】数据工程全流程:从格式规范到高质量数据集构建
  • Qt 显示QRegExp 和 QtXml 不存在问题
  • 线程池配置不合理:系统性能的隐形杀手(深度解析版)
  • Python基本环境搭配
  • 代码随想录第32天:动态规划5(组合、排列、最小方法数)
  • 二、Python变量基础(2)
  • STM32 PulseSensor心跳传感器驱动代码
  • 常用非对称加密算法的Python实现及详解
  • simulink使能子系统的四种配置
  • uniapp开发06-视频组件video的使用注意事项
  • 大数据分析在视频监视方面的应用综述
  • ROS2 开发踩坑记录(持续更新...)
  • Serverless
  • 机器学习项目流程极简入门:从数据到部署的完整指南
  • 物联网mqtt和互联网http协议区别
  • 硬件工程师面试常见问题(14)
  • [学习] RTKlib详解:功能、工具与源码结构解析
  • 基于MATLAB的图像色彩识别项目,彩色图像矩阵识别
  • 大模型推理--从零搭建大模型推理服务器:硬件选购、Ubuntu双系统安装与环境配置
  • Python实战:基于控制台与MySQL的电影票预订系统开发指南
  • 学习路线(机器人系统)
  • 模糊控制理论(含仿真)
  • 7400MB/s5050TBW完美结合,全新希捷酷玩530R SSD体验评测