《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 函数计算了反向投影图像,并显示了原始图像和反向投影图像。

在这里插入图片描述

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

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

相关文章

APP自动化测试工具大全

一、UI自动化测试工具 1. uiautomator2 openatx开源的ui自动化工具&#xff0c;支持Android和iOS。主要面向的编程语言是Python&#xff0c;API设计简洁易用&#xff0c;在开源社区也是很受欢迎。 安装&#xff1a; pip install --upgrade --pre uiautomator2# Or you can …

关于代码质量度量和分析的一些总结

最近团队做CMMI3认证&#xff0c;这期间涉及到了代码质量度量。花了点时间做了总结&#xff0c;分享给大家。 先看一张整体的图&#xff0c;然后逐个指标展开说明。 一、单元测试覆盖率 单元测试覆盖率&#xff08;Coverage&#xff09;是一个度量单元测试覆盖了多少代码的指标…

npm install 时,卡在sill idealTree buildDeps没有反应

这个的主要原因是默认的镜像源在国外&#xff0c;国内无法访问或者访问极慢导致的&#xff0c;可以先切换到国内的淘宝镜像源&#xff0c;然后再执行npm install <包名称> 命令就可以了。 具体如下&#xff1a; 1、设置镜像源为国内淘宝的镜像源&#xff1a; npm confi…

ES6之Symbol

ES6中为我们新增了一个原始数据类型Symbol&#xff0c;让我为大家介绍一下吧&#xff01; Symbol它表示是独一无二的值 Symbol要如何创建 第一种创建方式&#xff1a; let sy Symbol()第二种创建方式&#xff1a; let sy Symbol.for()具体独一无二在哪呢&#xff1f;它们的地…

2023年【T电梯修理】复审考试及T电梯修理模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年T电梯修理复审考试为正在备考T电梯修理操作证的学员准备的理论考试专题&#xff0c;每个月更新的T电梯修理模拟考试题祝您顺利通过T电梯修理考试。 1、【多选题】《特种设备安全法》规定&#xff1a;特种设备安…

大一作业习题

第一题&#xff1a;答案&#xff1a; #include <stdio.h> void sort(int a[], int m) //将数组a的前m个元素(从小到大)排序 {int i 0;for (i 0; i < m - 1; i){int j 0;int flag 1;for (j 0; j < m - 1 - i; j){if (a[j] > a[j 1]){int t 0;t a[j];…

供配电运维智能监控系统

供配电运维智能监控系统是一种针对供配电系统的智能监控设备&#xff0c;依托电易云-智慧电力物联网&#xff0c;旨在实现对供配电系统的实时监控、数据记录和分析&#xff0c;以及异常预警和故障检测等功能&#xff0c;以提高供配电系统的可靠性和稳定性。 该系统通常由以下部…

Linux下C++静态链接库的生成以及使用

目录 一.前言二.生成静态链接库三.使用静态链接库 一.前言 这篇文章简单讨论一下Linux下如何使用gcc/g生成和使用C静态链接库&#xff08;.a文件&#xff09;。 二.生成静态链接库 先看下目录结构 然后看下代码 //demo.h#ifndef DEMO_H #define DEMO_H#include<string&g…

24款CBR600RR复活,CBR1000R电控下放,有望引进?

最近本田在欧洲市场亮相了停产已经6年的24款本田CBR600RR&#xff0c;传说中的F5复活了&#xff01;24款CBR采用了全新的外观设计&#xff0c;可以看到前面也加上了流行的定风翼&#xff0c;不过设计是娇小一点的&#xff0c;另外本田的CBR600RR也是唯一在售的采用尾排设计的仿…

2017下半年软工(桥接模式)

题目——桥接模式&#xff08;抽象调用实现部分&#xff09; package org.example.桥接模式;/*** 桥接模式的核心思想是将抽象部分与它的实现部分分离&#xff0c;使它们可以独立变化&#xff0c;就是说你在实现部分&#xff1a;WinImp、LinuxImp基础上还能加上RedHatImp&#…

zabbix6入门到精通(3) 预处理

zabbix6入门到精通&#xff08;3&#xff09; 预处理 配置 — 主机 文件系统主项目 vfs.fs.get 测试一下 添加预处理 $[?(.fsname ‘/’)] $[0].inodes.pfree JSONPath参照&#xff1a; https://www.zabbix.com/documentation/6.0/zh/manual/config/items/preprocessi…

基于Git的代码工程管理——学习记录一

一、Git简概[1] Git是一个分布式版本控制系统&#xff0c;它跟踪任何一组计算机文件的更改&#xff0c;通常用于在软件开发过程中协调协作开发源代码的程序员之间的工作。其为实现快速、数据完整性以及分布式非线性工作流程&#xff08;在不同计算机上运行数千个并行分支&#…

C# Convert.ToBoolean()字符串转布尔类型问题

文章目录 C# Convert.ToBoolean()字符串转布尔类型问题错误写法&#xff1a;Convert.ToBoolean("0") or Convert.ToBoolean("1")正确写法Convert.ToBoolean("true") or Convert.ToBoolean("false") C# Convert.ToBoolean()字符串转布尔…

Bat批处理知识点总结

批处理注释 rem 注释内容&#xff08;不能出现重定向符号和管道符号&#xff09;> nul echo 注释显示内容&#xff0c;类似于print&#xff08;不能出现重定向符号和管道符号&#xff09;> nul纯批处理延迟毫秒 rem 开始延迟1秒 call :delay 1000 rem 延迟结束::-------…

2、Redis变慢原因排查(下)

感觉Redis变慢了&#xff0c;这些可能的原因你查了没 &#xff1f;(下) Redis变慢排查的上一篇【感觉Redis变慢了&#xff0c;这些可能的原因你查了没 &#xff1f;(上)】&#xff0c;我们是基于Redis命令为入口&#xff0c;比如命令使用不得当&#xff0c;bigkey问题&#xf…

【Hive】——CLI客户端(bin/beeline,bin/hive)

1 HiveServer、HiveServer2 2 bin/hive 、bin/beeline 区别 3 bin/hive 客户端 hive-site.xml 配置远程 MateStore 地址 XML <?xml version"1.0" encoding"UTF-8" standalone"no"?> <?xml-stylesheet type"text/xsl" hre…

Ajax跨域请求

最近使用js构造请求时发生了CORS跨域问题&#xff0c;mark一下 ajax跨域&#xff0c;这应该是最全的解决方案了 | Dailc的个人主页Everything about dailchttps://dailc.github.io/2017/03/22/ajaxCrossDomainSolution.htmlAJAX - 廖雪峰的官方网站研究互联网产品和技术&#…

Java - JVM内存模型及GC(垃圾回收)机制

JVM内存模型 JVM堆内存划分&#xff08;JDK1.8以前&#xff09; JVM堆内存划分&#xff08;JDK1.8之后&#xff09; 主要变化在于&#xff1a; java8没有了永久代&#xff08;虚拟内存&#xff09;&#xff0c;替换为了元空间&#xff08;本地内存&#xff09;。常量池&#…

.NET Core 依赖注入 Microsoft.Extensions.DependencyInjection

文章目录 前言什么是依赖注入C# 使用依赖注入框架介绍 Microsoft.Extensions.DependencyInjectionNuget安装简单单例使用打印结果 自动装配举例自动装配测试用例打印结果自动装配执行顺序测试用例有歧义构造函数渐进式构造函数循环依赖 自动装配结论 手动装配手动注入别名注入 …

【AIGC】大语言模型的采样策略--temperature、top-k、top-p等

总结如下&#xff1a; 图片链接 参考 LLM解码-采样策略串讲 LLM大模型解码生成方式总结 LLM探索&#xff1a;GPT类模型的几个常用参数 Top-k, Top-p, Temperature