MeanShift算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
核函数也称“窗口函数”。
一维空间用到的核函数有高斯(Gaussian)、余弦弧(Cosinus arch)、双指数(Double Exponential)、均匀(Uniform)、三角(Trangle)、依潘涅契科夫(Epanechikov)、双依潘涅契科夫(DoubleEpanechnikov)、及双权(Biweight)函数。
图2.1给出了最常用的几个核函数
给定一组一维空间的n个数据点集合令该数据集合
的概率密度函数假设为f (x),核函数取值为,那么在数据点x处的密度估计可以按下式计算:
上式就是核密度估计的定义。
其中,x为核函数要处理的数据的中心点,即数据集合相对于点x几何图形对称。
核密度估计的含义可以理解为:核估计器在被估计点为中心的窗口内计算数据点加权的局部平均。
或者:将在每个采样点为中心的局部函数的平均效果作为该采样点概率密度函数的估计值。
MeanShift实现:
1.选择窗的大小和初始位置.
2.计算此时窗口内的Mass Center.
3.调整窗口的中心到Mass Center.
4.重复2和3,直到窗口中心"会聚",即每次窗口移动的距离小于一定的阈值,或者迭代次数达到设定值。
meanshift算法思想其实很简单:利用概率密度的梯度爬升来寻找局部最优。
它要做的就是输入一个在图像的范围,然后一直迭代(朝着重心迭代)直到满足你的要求为止。
但是他是怎么用于做图像跟踪的呢?这是我自从学习meanshift以来,一直的困惑。
而且网上也没有合理的解释。
经过这几天的思考,和对反向投影的理解使得我对它的原理有了大致的认识。
在opencv中,进行meanshift其实很简单,输入一张图像(imgProb),再输入一个开始迭代的方框(windowIn)和一个迭代条件(criteria),输出的是迭代完成的位置(comp )。
这是函数原型:
int cvMeanShift( const void* imgProb, CvRect windowIn,CvTermCriteria criteria, CvConnectedComp* comp )
但是当它用于跟踪时,这张输入的图像就必须是反向投影图了。
为什么必须是反向投影图呢?首先我们要理解什么是反向投影图。
简单理解它其实实际上是一张概率密度图。
经过反向投影时的输入是一个目标图像的直方图(也可以认为是目标图像),还一个输入是当前图像就是你要跟踪的全图,输出大小与全图一样大,它上像素点表征着一种概率,就是全图上这个点是目标图像一部分的概率。
如果这个点越亮,就说明这个点属于物体的概率越大。
现在我们明白了这原来是一张概率图了。
当用meanshift跟踪时,输入的原来是这样一幅图像,那也不难怪它可以进行跟踪了。
半自动跟踪思路:输入视频,用画笔圈出要跟踪的目标,然后对物体跟踪。
用过opencv的都知道,这其实是camshiftdemo的工作过程。
第一步:选中物体,记录你输入的方框和物体。
第二步:求出视频中有关物体的反向投影图。
第三步:根据反向投影图和输入的方框进行meanshift迭代,由于它是向重心移动,即向反向投影图中概率大的地方移动,所以始终会移动到目标上。
第四步:然后下一帧图像时用上一帧输出的方框来迭代即可。
全自动跟踪思路:输入视频,对运动物体进行跟踪。
第一步:运用运动检测算法将运动的物体与背景分割开来。
第二步:提取运动物体的轮廓,并从原图中获取运动图像的信息。
第三步:对这个信息进行反向投影,获取反向投影图。
第四步:根据反向投影图和物体的轮廓(也就是输入的方框)进行meanshift 迭代,由于它是向重心移动,即向反向投影图中概率大的地方移动,所以始终会移动到物体上。
第五步:然后下一帧图像时用上一帧输出的方框来迭代即可。
总结:用meanshift进行跟踪最重要的一点是输入图像的把握,也就是要让它的迭代能越来越迭代到目标上。
这种图像也不一定就是反向投影图,只要是一幅反映当前图像中每个像素点含有目标概率图就可以了,其实反向投影图就是这样的一幅图而已。
2. 1MeanShift算法
对于n维欧式空间X中的有限集合A,在x∈X处的MeanShift矢量定义为:ms =∑ak(a-x)w(a)a∑ak(a-x)w(a)-x,a∈A (1)
其中,k是核函数,w是权重函数。
在x处计算的Mean-Shift矢量指向卷积曲面:
J(x) =∑ag(a-x)w(a) (2)
的负梯度方向[3,4],其中g是k的影子核[4],g′(r) =-ck(r),r =‖a-x‖2,c >0。
MeanShift算法就是反复不断地把数据点朝向MeanShift矢量方向进行移动以致最终收敛,此时核中心的位置对应某个概率密度的极值,即模式位置。
设{xi*},i=1,…,n为目标所在区域归一化的n个像素点集,目标区域以0为中心。
一个各向同性、具有单调递减凸核轮廓的函数k(x)为各点加权,离中心越远,像素点的权值越小。
由于外层的像素值容易被遮挡或受背景影响,所以通过加权方法增强了密度估计的稳定性[5]。
特征值u=1,…,m在目标模型中出现的概率可以表示为:^qu= C∑
n
i=1
k(‖x*i‖2)δ[b(x*i)-u] (3)
其中,δ(x)是Delta函数,δ(b(xi*)-u)的作用是判断目标
区域中像素点xi*在特征空间量化的对应值b(xi*)是否
为u,若是则为1,否则为0。
C为标准化常量系数,使得
∑
m
u=1
^qu=1。
因此,C = [∑
n
i=1
k(‖x*i‖2)]-1。
运动目标在第二帧以及以后的每帧中可能包含目标的
区域称为候选目标,中心为y。
候选目标区域中像素点用{xi},i=1,…,nh表示,则特征值u=1,…,m在候选目标
模型中出现的概率可以表示为:
p^u(y) = Ch∑
nh
i=1
k(‖y-xih‖2)δ[b(xi)-u] (4)
其中,Ch为归一化因子,使得∑
m
u=1
p^u=1 ,则Ch=
[∑nhi=1k(‖y-xih‖2)]-1。
因此,物体跟踪可以简化为寻找最优的y,使得p^u(y)
与^qu最相似。
p^u(y)与^qu的相似性用Bhattacharrya系数^ρ(y)来度量分布,即:。