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

直方图反向投影

目录

一、概念

二、OpenCV C++实现

2.1 基础实现代码

 2.2 优化实现(带遮罩)

 三、应用场景

3.1 目标跟踪

3.2 图像分割

3.3 工业检测

四、性能优化技巧

一、概念

        直方图反向投影(Histogram Back Projection)是一种基于概率的图像处理技术,它通过将目标特征的直方图反向映射到输入图像上,生成一个概率分布图,用于定位目标在图像中的位置。

核心特点:
1. 反向映射 :将直方图统计结果反向投影到原图像空间
2. 概率表示 :生成图像中每个像素值表示该位置符合目标直方图的概率
3. 非参数估计 :不需要假设数据服从特定分布


二、OpenCV C++实现

2.1 基础实现代码
#include <opencv2/opencv.hpp>
using namespace cv;void histogramBackProjection(Mat& src, Mat& target, Mat& result) {// 1. 转换到HSV色彩空间Mat hsv_src, hsv_target;cvtColor(src, hsv_src, COLOR_BGR2HSV);cvtColor(target, hsv_target, COLOR_BGR2HSV);// 2. 计算目标直方图int histSize[] = { 30, 32 };float h_range[] = { 0, 180 };float s_range[] = { 0, 256 };const float* ranges[] = { h_range, s_range };int channels[] = { 0, 1 };Mat hist;calcHist(&hsv_target, 1, channels, Mat(), hist, 2, histSize, ranges, true, false);normalize(hist, hist, 0, 255, NORM_MINMAX);// 3. 执行反向投影Mat backproj;calcBackProject(&hsv_src, 1, channels, hist, backproj, ranges, 1, true);// 4. 二值化处理threshold(backproj, result, 50, 255, THRESH_BINARY);
}
 2.2 优化实现(带遮罩)
// ... 包含头文件等代码 ...Mat advancedBackProjection(Mat& src, Mat& target, Mat& mask) {Mat hsv_src, hsv_target;cvtColor(src, hsv_src, COLOR_BGR2HSV);cvtColor(target, hsv_target, COLOR_BGR2HSV);// 使用遮罩计算直方图Mat hist;int channels[] = { 0, 1 };int histSize[] = { 180, 256 };float h_range[] = { 0, 180 };float s_range[] = { 0, 256 };const float* ranges[] = { h_range, s_range };calcHist(&hsv_target, 1, channels, mask, hist, 2, histSize, ranges);normalize(hist, hist, 0, 255, NORM_MINMAX);// 反向投影Mat result;calcBackProject(&hsv_src, 1, channels, hist, result, ranges, 1, true);// 形态学处理Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(5,5));morphologyEx(result, result, MORPH_OPEN, kernel);return result;
}

 三、应用场景

3.1 目标跟踪
// 初始化目标直方图
Mat target_hist = calculateTargetHistogram(initial_frame, roi);// 视频处理循环
while(capture.read(frame)) {Mat prob_map;calcBackProject(frame, target_hist, prob_map);// 使用MeanShift/CamShift跟踪RotatedRect track_box = CamShift(prob_map, track_window);rectangle(frame, track_box, Scalar(0,255,0), 2);
}
3.2 图像分割
// 基于颜色特征分割
Mat backproj = histogramBackProjection(src, target_color_sample);
Mat segmented;
src.copyTo(segmented, backproj); // 通过掩码提取目标区域
3.3 工业检测
// 检测特定颜色的缺陷
Mat defect_map = backProjection(inspection_image, defect_sample);
int defect_count = countNonZero(defect_map > threshold);
if(defect_count > 0) {cout << "发现缺陷" << endl;
}


四、性能优化技巧

1. ROI限制 :只在感兴趣区域计算
2. 降采样 :对大图像先缩小尺寸处理
3. 并行计算 :使用 cv::parallel_for_
4. 积分直方图 :对视频流应用积分图加速


直方图反向投影在OpenCV中的典型应用是与MeanShift/CamShift算法结合实现目标跟踪,其优势在于对目标形变和部分遮挡具有鲁棒性。

http://www.xdnf.cn/news/285859.html

相关文章:

  • Three.js + React 实战系列 - 项目展示区开发详解 Projects 组件(3D 模型 + 动效 + 状态切换)✨
  • android-ndk开发(2): macOS 安装 ndk
  • PyTorch_自动微分模块
  • 时间同步服务核心知识笔记:原理、配置与故障排除
  • 因为gromacs必须安装cuda(系统自带的NVIDIA驱动不行),这里介绍下如何安装cuda
  • 学习路线(机器人软件架构)
  • Java常用注解大全(基于JDK17+SpringBoot3)
  • 对ubuntu的简单介绍
  • Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
  • 题目 3321: 蓝桥杯2025年第十六届省赛真题-画展布置
  • SpringMVC 框架核心知识点详解与实战
  • 精益数据分析(41/126):深入解读移动应用商业模式的关键指标与策略
  • linux 高并发 文件句柄数 fs 及 tcp端口数调优
  • 泉州2025年首次网签备案登记的商品住宅并在本年度进行装修、改造及家装物品和材料购置的,在上述补贴额度的基础上上浮2万元,单个产权人补贴最高不超过5万元。
  • VScode中关于Copilot的骚操作
  • ByteArrayOutputStream 类详解
  • 基于yolov11的打电话玩手机检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
  • 一文说清-什么是强化学习
  • zst-2001 历年真题 程序设计语言
  • 代码随想录算法训练营 Day37 动态规划Ⅴ 完全背包 零钱兑换
  • 【Java ee初阶】多线程(7)
  • C++负载均衡远程调用学习之获取主机信息功能
  • Redis 中简单动态字符串(SDS)的深入解析
  • Vue项目安全实践指南:从输入验证到状态管理的全方位防护
  • 利用WPS创建的Templates目录,快捷生成md文件
  • 【信息系统项目管理师-论文真题】2007下半年论文详解(包括解题思路和写作要点)
  • E-R图作业
  • lambda表达式和方法引用
  • 【Linux】网络基础
  • Python内置函数