《opencv实用探索·十七》calcBackProject直方图反向投影

本文主要是介绍《opencv实用探索·十七》calcBackProject直方图反向投影,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在了解反向投影前需要先了解下直方图的概念,可以看我上一章内容:opencv直方图计算calcHist函数解析

直方图反向投影是一种图像处理技术,通常用于目标检测和跟踪。通过计算反向投影,可以将图像中与给定模式(目标对象)具有相似颜色分布的区域显著地突出显示。

反向投影原理:
首先有一张4x4原图像,像素值大小如下
在这里插入图片描述
像素值范围是0-15,在直方图中如果把bin(像素值范围)划分为4份,那第一份到第四份对应的像素值范围为[0, 3],[4, 7],[8, 11],[12, 15]。
这四份对应的像素数量分别为: Histogram = 4,4,6,2

反向投影图就是图像对应像素区间的数量统计,也可以看做是密度统计。 反向投影图在某一位置(点)的值是原图对应位置(点)的像素值所在原图区间(bins)的总数目,那么可以得到反向投影图如下:
在这里插入图片描述
一个区间点越多,在反向投影矩阵中就越亮。

反向投影中的“反向”指的是从直方图值到反向投影矩阵映射的过程。通过反向投影,原始的图像被简化了,而这个简化的过程实际上就是提取出图像的某个特征。所以我们就可以用这个特征来对比两幅图,如果两幅图的反向投影矩阵相似或相同,那么我们就可以判定这两幅图这个特征是相同的。

反向投影使用的基本流程:
(1)首先对图像选择一个感兴趣区域,也是我们需要追踪的目标对象
(2)计算目标对象的直方图,直方图表示了目标对象在不同像素值上的分布情况
(3)比较输入图像的直方图和目标对象的直方图,生成一个反向投影图像。这个反向投影图像的每个像素值表示输入图像该位置的像素值与目标对象直方图的相似程度。
(4)反向投影图像可以通过阈值或其他技术进行进一步处理,以便强调与目标对象具有相似统计特征的区域。这有助于定位目标对象在输入图像中的位置。

opencv接口:

void cv::calcBackProject(   
const Mat* images		// 输入图像,图像深度必须位CV_8U,CV_16U或CV_32F中的一种,尺寸相同,每一幅图像都可以有任意的通道数 
int nimages				// 输入图像的数量 
const int* channels 	// 用于计算反向投影的通道列表,通道数必须与直方图维度相匹配,第一个数组的通道是从0到image[0].channels()-1, 
InputArray hist 		// 输入的直方图,直方图的bin可以是密集(dense)或稀疏(sparse) 
OutputArray backProject	// 目标反向投影输出图像,是一个单通道图像,与原图像有相同的尺寸和深度 
const float ranges**	// 直方图中每个维度bin的取值范围 
double scale=1:			// 可选输出反向投影的比例因子 
bool uniform=true:		// 直方图是否均匀分布(uniform)的标识符,有默认值true
)

接口调用示例:

#include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR);// 定义直方图参数int histSize = 256; // 直方图的大小float range[] = {0, 256}; // 像素值范围const float* histRange = {range};int channels[] = {0}; // 使用的通道// 计算直方图cv::Mat hist;cv::calcHist(&image, 1, channels, cv::Mat(), hist, 1, &histSize, &histRange);// 归一化直方图cv::normalize(hist, hist, 0, 255, cv::NORM_MINMAX);// 计算反向投影cv::Mat backProject;cv::calcBackProject(&image, 1, channels, hist, backProject, &histRange, 1, true);// 显示结果cv::imshow("Original Image", image);cv::imshow("Back Project", backProject);cv::waitKey(0);return 0;
}

这个例子中,首先计算了输入图像的直方图,然后归一化直方图。最后,使用 calcBackProject 函数计算了反向投影图像,并显示了原始图像和反向投影图像。

在这里插入图片描述

这篇关于《opencv实用探索·十七》calcBackProject直方图反向投影的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/497031

相关文章

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.