OpenCV直方图与匹配(二)——反向投影

目录

前言

反向投影概述

如果一幅图像的区域中显示的是一种结构纹理或者一个独特的物体,那么这个区域的直方图可以看做是一个概率函数,其表现形式是某个像素属于该纹理或物体的概率。而反向投影就是一种记录给定图像中的像素点如何适应直方图模型像素分布方式的一种方法。
简单的讲,所谓反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的该特征的方法。例如,有一个颜色直方图,可以利用反向投影在图像中找到该区域。

反向投影的作用

反向投影用于在输入图像(通常较大)中查找与特定图像(通常较小或者仅1个像素,称为模板图像)最匹配的点或者区域,也就是定位模板图像出现在输入图像的位置。

反向投影的工作过程

反向投影就是不断的在输入图像中切割跟模板图像大小一致的图像块,并且用直方图对比的方式与模板图像进行比较。
假设我们有一张100*100的输入图像,有一张10*10的模板图像,查找的过程是这样的:
1) 从输入图像的左上角(0,0)开始,切割一块(0,0)至(10,10)的临时图像;
2) 生成临时图像的直方图;
3) 用临时图像的直方图和模板图像的直方图对比,对比结果记为c;
4) 直方图对比结果c,就是结果图像(0, 0)处的像素值;
5) 切割输入图像从(0, 1)至(10, 11)的临时图像,对比直方图,并记录到结果图像;
6) 重复1)~5)步直到输入图像的右下角。

反向投影的结果

反向投影的结果包含了以每个输入图像像素点为起点的直方图对比结果。可以把它看成是一个二维的浮点型数组、二维矩阵,或者单通道的浮点型图像。我们可以利用基本的backProject方法来为一个特定像素是否可能是一个特定目标类型的成员建模。

特殊情况

如果输入图像和模板图像一样大,那么反向投影相当于直方图对比;如果输入图像比模板图像还小,直接罢工。

函数原型

  • OpenCV1.0
void cvCalcBackProject(
    IplImage* image,
    CvArr* back_project,
    const CvHistogram*hist
);

image:输入图像
back_project:反向投影图像
hist:直方图
函数cvCalcBackProject计算直方图的反向投影。对于所有输入的单通道图像,同一位置的像素数组,该函数根据相应的像素数组(RGB),放置其对应的直方块的值到输出图像中。用统计学术语,输出图像像素点的值是观测数组在某个分布(直方图)下的概率。例如,为了发现图像中的红色目标,可以这么做:
1. 对红色物体计算色调直方图,假设图像仅仅包含该物体。则直方图有可能有极值,对应着红颜色。
2. 对将要搜索目标的输入图像,使用直方图计算其色调平面的反向投影,然后对图像做阈值操作。
3. 在产生的图像中发现连通部分,然后使用某种附加准则选择正确的部分,比如最大连通部分。
这是Camshift彩色目标跟踪器中的一个逼近算法,除了第三步,Camshift算法使用了上一次目标位置定位反向投影中的目标

博主的理解:
步骤1:鼠标选定目标区域,计算目标区域的直方图;
步骤2:根据目标区域的直方图计算当前图像(大于或等于目标区域)的反向投影图。也就是对应的区域等同于目标区域的概率。
步骤3:可以根据得到的概率密度图,使用meanshift把窗口移动到概率密度最大的地方,也就是跟踪区域。

  • OpenCV2.0
void calcBackProject(
    const Mat* images,
    int nimages,
    const int* channels,
    InputArray hist,
    OutputArray backProject,
    const float** ranges,
    double scale=1,
    bool uniform=true
);
/*
参数1:const Mat*类型的images,输入的数组(或数组集),它们需为相同的深度(CV_8U或CV_32F)和相同的尺寸,而通道数可以任意。
参数2:int类型的nimages,输入数组的个数,也就是第一个参数中存放了多少张图像,有几个源数组
参数3:const int*类型的channels,需要统计的通道索引。第一个数组通道从0到image[0].channels-1,第二个数组通道从images[0].channes()计算到images[0].channels()+images[1].channels()-1
参数4:InputArray类型的hist,输入的直方图
参数5:OutputArray类型的backProject,目标反向投影阵列,其须为单通道,并且和image[0]有相同的大小和深度
参数6:const float**类型的ranges,表示每一个维度数组(第六个参数dims)的每一维边界阵列,可以理解为每一维数值的取值范围。
参数7:double scale,有默认值1,输出的方向投影可选的缩放因子,默认值为1
参数8:boo类型的uniform,指示直方图是否均匀的标识符,有默认值true
*/

检测步骤:
1. 对测试图像中的每个像素p(i, j),获取色调数据并找到该色调在直方图中的bin的位置。
2. 查询模型直方图中对应bin的数值
3. 将此数值存储在新的反射投影图像中。也可以先归一化直方图数值到0~255范围,这样可以直接显示反射投影图像。
4. 通过对测试图像中的每个像素采用以上步骤,可以得到最终的反射投影图像。
5. 使用统计学语言进行分析。反向投影中存储的数值代表了测试图像中该像素属于皮肤区域的概率。

总结

参考链接

Cv图像处理
直方图匹配-Opencv种cvCalcBackProject的理解

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值