meanshift和cameshift

来源:互联网 发布:金数据app官网免费下载 编辑:程序博客网 时间:2024/05/21 11:56
原理:
meanshift, 均值漂移,好多人把它当做一种聚类算法,我觉得稍有不妥。它就是一个算法,而聚类只不过是一个算法的应用罢了。
假设我们有一堆同类的数据,而我们的目标是去寻找一个数据密度最大的部分。简单的来看,meanshift就是提供了一个方法来求解上面的问题。
meanshift的解决方法如下:
1. 初始化随机选择一个数据点,以它为中心,并且设置一个半径r,这个作为每一次选择的数据区域。
2. 以中心为圆心,做一个半径为r的高维球(二维上它应该是一个圆,到了高维就是说不清道不明的东西了)。这样我们可以确定落在球中的所有点
3. 以圆心为起点,以每一个球内的点为终点,生成一个向量,将所有向量进行矢量相加,就可以得到一个和向量(这个和向量的方向其实是向着数据密度大的部分的)
4. 以和向量的终点为圆心,以r为半径重复上面的操作,meanshift可以收敛到密度最大的部分
二维空间中大体过程如下图所示:
上文已经说明,meanshift实质上是一个密度梯度上升算法,这就是涉及到了密度估计的东西。在统计学中,kernel density estimate(KDE,核密度估计)是一种估计概率密度函数的非参数方法。
KDE原理:
假设一组数据x1,x2,...xn,他们独立的采样与同一个分布,这个分布的概率密度函数未知,假设为f。那么KDE就是要用采样点估计出f.即
f(x)=1/nni=1Kh(xxi)=1/nhni=1K((xxi)/h)
现在我们估计出函数f,然后我们要去求密度最大的地方,最简单的想法就是对函数求导,最后令导数等于0,我们即可求出下一个密度较大区域的圆心,截图如下:
OpenCV中的Camshfit是先计算目标的hue通道的颜色直方图,以此求出颜色概率分布,然后根据这个分布,将目标图像的hue通道进行反向投影,即根据一个颜色的概率,来替代该颜色的值。至于后面的meanshift,可以理解为,根据反向投影,求二阶矩,得到目标的重心和尺度。

原创粉丝点击