Sklearn聚类算法之meanshift

以二维来说明可能更容易理解,下图中的很多的红点就是我们的样本特征点,meanshift就是在这些点中的任意一个点为圆心,然后以半径R画一个圆(在opencv中是一个矩形),然后落在这个圆中的所有点和圆心都会对应的一个向量,把所有这些向量相加(注意是向量相加),最终我们只得到一个向量,就是下图中用黄色箭头表示的向量,这个向量就是meanshift向量。

然后再以这个meanshift向量的终点为圆心,继续上述过程,又可以得到一个meanshift向量,如下图:

然后不断地继续这样的过程,我们可以得到很多连续的meanshift向量,这些向量首尾相连,最终得到会在一个地方停下来(即我们说的meanshift算法会收敛),最后的那个meanshift向量的终点就是最终得到的结果(一个点),如下图:

 

       从上述的过程我们可以看出,meanshift算法的过程最终的效果就是:从起点开始,最终会一步一步到达样本特征点最密集的点那里(当然在哪个点就是终点这个要取决于我们设定的阈值)。

         注:如果还是不明白为什么会向密集的地方走去,可以利用向量的加法规则自己画个简单的图去理解一下。

         到这里可能只知道meanshift算法的作用是向数据密集的地方走的一个效果,但是还是不明白它是怎么在运动跟踪中发挥作用的,尤其是不理解它这个样本特征点(就是上图中的红点点)到底和我们图像中的什么对应的。

       对于上面这个问题,我们需要先了解一下运动跟踪算法是一个什么样的过程,知道了这个过程之后就可以知道meanshift算法在这个过程中发挥什么角色了。运动跟踪说到底就是在一开始告诉程序一个跟踪目标,即我想跟踪什么,然后程序就在接下来的视频帧中去寻找这个目标了。给定跟踪目标很简单,直接在图像中给一个ROI给程序就可以了,那么程序接下来要做的就是在下一帧图像中去找这个ROI,但这个ROI是移动了的,已经不在之前的那个位置了,那么这个时候程序要怎么来找到这个ROI呢?那么在计算机视觉中我们是这么来解决的:首先对跟踪目标进行描述,这个描述是将跟踪目标区域转换为颜色HSV空间,然后得到H的这个通道的分布直方图,有了这个描述之后,我们就是要在下一个视频帧中找到和这个描述的一样的区域,但是我们知道要找到完全一样的区域很难,所以我们就用了一个相似函数来衡量我们找到的区域和我们的目标区域的相似度,通过这个相似函数,相似函数值越大说明我们找打的区域和目标区域越相似,所以我们的目标就是要找这个对应最大相似值的区域,那么怎么来找呢?这个时候meanshift就排上用场了,它可以通过不断地迭代得到有最大相似值的区域(具体里面的是怎么算的,可以参考博文地底下的参考博客),meanshift的作用可以让我们的搜索窗口不断向两个模型相比颜色变化最大的方向不断移动,直到最后两次移动距离小于阈值,即找到当前帧的位置,并以此作为下一帧的起始搜索窗口中心,如此重复,这个过程每两帧之间都会产生一个meanshift向量,整个过程的meanshift向量连起来就是目标的运动路径。所以讲到这里了,我们已经知道了meanshift算法在整个运动跟踪过程中扮演什么角色了。

         整个运动跟踪过程就是如下图所示:

 

你可能感兴趣的:(Sklearn)