27.直方图反向投影(Back Projection)

1.主要内容

  • 反向投影
  • 相关步骤和相关API
  • 代码演示

2.什么叫反向投影(此处注意理解图像的数据特征)

  • 反向投影是反映直方图模型在目标图像中的分布情况
  • 简单的讲,就是用直方图模型去目标图像中寻找是否有相似的对象。通常用HSV色彩空间的HS两个通道直方图模型。

3.反向投影的举例以及步骤

(1)直方图模型建立

在这里插入图片描述

(2)待检测对象

在这里插入图片描述

(3)反向投影对象
在这里插入图片描述

反向投影步骤:
1.建立直方图模型
2.计算待测图像直方图并映射到模型中
3.从模型反向计算生成图像

4.实现步骤与相关API

  • 加载图片imread
  • 将图像从RGB色彩空间转换到HSV色彩空间cvtColor
  • 计算直方图和归一化calcHist与normalize(本代码中使用H通道)
  • Mat与MatND其中Mat表示二维数组,MatND表示三维或者多维数据,此处均可以用Mat表示。
  • 计算反向投影图像 - calcBackProject

而opencv里cvSplit使用的图像是32F则其取值是h为0-360、s取值为0-1、v取值为0-255。如果是8UC则取值范围是h为0-180、s取值为0-255、v取值是0-255. 其中h色调对图像的分辨是很准的。

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

mixChannels()函数

//1.函数功能:从输入图像中拷贝某通道到输出图像中特定的通道。
//2.函数原型及参数解释:
void mixChannels(
	const Mat*src,      //一系列输入图像的数组, 被拷贝的通道的来源一系列输入图像的数组, 被拷贝的通道的来源
	size_t nsrcs,       //输入图像的个数
	Mat* dst,           //一系列目的图像的数组, 储存拷贝的通道,所有的数组必须事先分配空间(如用create),大小和深度须与输入数组等同。
	size_t ndsts,       //目的数组中图像的数目
	const int* fromTo,  //通道索引对的数组,指示如何将输入图像的某一通道拷贝到目的图像的某一通道。偶数下标的用来标识输入矩阵,奇数下标的用来标识输出矩阵。如果偶数下标为负数,那么相应的输出矩阵为零矩阵。
	size_t npairs       //fromTo中的序号对数(两个算1对)。
);

5.演示代码

在这里插入图片描述

6.课外扩展

【opencv学习笔记】027之直方图反向投影 - calcBackProject函数详解
RGB颜色空间,HSV颜色空间以及颜色空间的转换

发布了66 篇原创文章 · 获赞 53 · 访问量 6826

猜你喜欢

转载自blog.csdn.net/qq_43367829/article/details/105424753
今日推荐