mean shift

合集下载

mean-shift图像分割

mean-shift图像分割

由式 (4) 获得 :
������ = . ������+1
∑������������=1 ������������������������������(||������������������ℎ−������������������������||2)������(||������������������ℎ−������������������������||2) ∑������������=1 ������������������(||������������������ℎ−������������������������||2)������(||������������������ℎ−������������������������||2)
图4 3. 图像分割的细节图片如图 5 所示:
图5
实验小结
根据 mean-shift 算法原理,通过对聚类中心的不断迭代,从而找到相近的类,达到分割 的目的。通过这次实验,进一步理解了图像分割的含义,也充分体现了 mean-shift 算法在图 像分割中的应用。
参考文献
【1】 【2】 【3】
Mean-shift 跟踪算法中核函数窗宽的自动选取——彭宁嵩 杨杰 刘志 张凤超——软 件学报——2005,16(9) Mean-shift 算法的收敛性分析——刘志强 蔡自兴——《《软件学报》》——2007,18 (2) 基于分级 mean-shift 的图像分割算法——汤杨 潘志庚 汤敏 王平安 夏德深
计算机视觉实验三
——利用 mean-shift 进行图像分割
算法简介
mean-shift 是一种非参数概率密度估计的方法。通过有限次的迭代过程,Parzen 窗定义 的概率密度函数能够快速找到数据分布的模式。由于具有原理简单、无需预处理、参数少等 诸多优点,mean-shift 方法在滤波、目标跟踪、图像分割等领域得到了广泛的应用。

MEAN SHIFT SEGMENTATION(meanshift分割算法)

MEAN SHIFT SEGMENTATION(meanshift分割算法)

Bucket data structure Mean shift vector reutilization (medium speed up) Local neighborhood inclusion (high speed up)

18
OPTIMIZATION TECHNIQUES - EVALUATION


Mean shift segmentation is an advanced and vertisale technique for clustering based segmentation
3
MEAN SHIFT ALGORITHM

Kernel density estimation
Kernel density estimation is a non parametric way to estimate the density function of a random variable. It is a popular method for estimating probability density. This is usually called as the Parzen window technique. K(x) : kernel, h: bandwidth parameter (radius), n data point xi , i=1..n in d-dimension space Rd Kernel density estimator for a given set of ddimensional points is
original
15
SAMPLES OF MEAN SHIFT SEGMENTATION

均值漂移MeanShift

均值漂移MeanShift

均值漂移Mean Shift均值漂移(Mean Shift)00均值漂移是一种有效的统计迭代算法。

均值漂移算法是一种基于密度梯度上升的非参数方法,通过迭代运算找到目标位置,实现目标跟踪。

它显著的优点是算法计算量小,简单易实现,很适合于实时跟踪场合;但是跟踪小目标和快速移动目标时常常失败,而且在全部遮挡情况下不能自我恢复跟踪。

通过实验提出应用核直方图来计算目标分布,证明了均值漂移算法具有很好的实时性特点。

Mean Shift 简介Mean Shift 这个概念最早是由Fukunaga等人[1]于1975年在一篇关于概率密度梯度函数的估计中提出来的,其最初含义正如其名,就是偏移的均值向量,在这里Mean Shift是一个名词,它指代的是一个向量,但随着Mean Shift理论的发展,Mean Shift的含义也发生了变化,如果我们说Mean Shift算法,一般是指一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其偏移均值,然后以此为新的起始点,继续移动,直到满足一定的条件结束.然而在以后的很长一段时间内Mean Shift并没有引起人们的注意,直到20年以后,也就是1995年,另外一篇关于Mean Shift的重要文献[2]才发表.在这篇重要的文献中,Yizong Cheng对基本的Mean Shift算法在以下两个方面做了推广,首先Yizong Cheng定义了一族核函数,使得随着样本与被偏移点的距离不同,其偏移量对均值偏移向量的贡献也不同,其次Yizong Cheng还设定了一个权重系数,使得不同的样本点重要性不一样,这大大扩大了Mean Shift的适用范围.另外Yizong Cheng指出了Mean Shift可能应用的领域,并给出了具体的例子.Comaniciu等人[3][4]把Mean Shift成功的运用的特征空间的分析,在图像平滑和图像分割中Mean Shift都得到了很好的应用. Comaniciu等在文章中证明了,Mean Shift算法在满足一定条件下,一定可以收敛到最近的一个概率密度函数的稳态点,因此Mean Shift算法可以用来检测概率密度函数中存在的模态.Comaniciu等人[5]还把非刚体的跟踪问题近似为一个Mean Shift最优化问题,使得跟踪可以实时的进行.在后面的几节,本文将详细的说明Mean Shift的基本思想及其扩展,其背后的物理含义,以及算法步骤,并给出理论证明.最后本文还将给出Mean Shift在聚类,图像平滑,图像分割,物体实时跟踪这几个方面的具体应用.Mean Shift 的基本思想及其扩展基本Mean Shift给定d维空间中的n个样本点,i=1,…,n,在点的Mean Shift向量的基本形式定义为:k表示在这n个样本点中,有k个点落入区域中.我们可以看到是样本点相对于点的偏移向量,(1)式定义的Mean Shift向量就是对落入区域中的k个样本点相对于点的偏移向量求和然后再平均.从直观上看,如果样本点从一个概率密度函数中采样得到,由于非零的概率密度梯度指向概率密度增加最大的方向,因此从平均上来说, 区域内的样本点更多的落在沿着概率密度梯度的方向.因此,对应的, Mean Shift向量应该指向概率密度梯度的方向如上图所示, 大圆圈所圈定的范围就是 ,小圆圈代表落入区域内的样本点,黑点就是Mean Shift的基准点 ,箭头表示样本点相对于基准点的偏移向量,很明显的,我们可以看出,平均的偏移向量会指向样本分布最多的区域,也就是概率密度函数的梯度方向从前面关于Mean Shift和概率密度梯度的关系的论述,我们可以清楚的看到,Mean Shift算法本质上是一个自适应的梯度上升搜索峰值的方法,如下图所示,如果数据集服从概率密度函数f(x),给定一个如图初始点,Mean Shift算法就会一步步的移动,最终收敛到第一个峰值点.从这张图上,我们可以看到Mean Shift至少有如下三方面的应用:(1)聚类,数据集中的每一点都可以作为初始点,分别执行Mean Shift算法,收敛到同一个点算作一类;(2)模态的检测,概率密度函数中的一个峰值就是一个模态,Mean Shift在峰值处收敛,自然可以找到该模态.(3)最优化,Mean Shift可以找到峰值,自然可以作为最优化的方法,Mean Shift算法进行最优化的关键是要把最优化的目标转化成Mean Shift 隐含估计的概率密度函数.[1]The Estimation of the Gradient of a Density Function, with Applications in Pattern Recognition (1975)[2]Mean shift, mode seeking, and clustering (1995)[3]Mean Shift: a robust approach toward feature space analysis (2002)[4]Real-time tracking of non-rigid objects using mean shift (2000)[5]Mean-shift Blob Tracking through Scale Space (2003)[6]An algorithm for data-driven bandwidth selection(2003) 从直观上看,如果样本点从一个概率密度函数中采样得到,由于非零的概率密度梯度指向概率密度增加最大的方向,因此从平均上来说, 区域内的样本点更多的落在沿着概率密度梯度的方向.因此,对应的, Mean Shift向量应该指向概率密度梯度的方向。

mean-shift算法公式

mean-shift算法公式

mean-shift算法公式Mean-shift算法是一种无参聚类算法,常用于图像分割、目标跟踪和模式识别等领域。

本文将详细介绍mean-shift算法的原理、公式和实际应用场景。

一、原理Mean-shift算法的核心思想是密度估计和质心漂移。

它基于高斯核函数,通过不断更新质心,最终将数据点分为不同的簇。

具体而言,我们要对每个数据点x_i进行密度估计,将其周围的点加权后求和得到密度估计值f(x_i)。

给定一个初始质心x_c,我们通过以下公式计算新质心x_c’:x_c' = \frac{\sum_{x_i \in B(x_c,r)} w(x_i) \times x_i}{\sum_{x_i \in B(x_c,r)} w(x_i)}B(x_c,r)表示以x_c为圆心,半径为r的区域,w(x_i)为高斯权重系数,可以写作w(x_i) = e ^ {-\frac{(x_i - x_c)^2}{2 \times \sigma^2}}\sigma是高斯核函数的标准差,控制窗口大小和权重降低的速度。

在计算新质心后,我们将其移动到新位置,即x_c = x_c’,然后重复以上步骤,直到质心不再改变或者达到预定的迭代次数为止。

最终,所有距离相近的数据点被归为同一簇。

算法的时间复杂度为O(nr^2),其中n为数据点数量,r为窗口半径。

可以通过调整r和\sigma来平衡速度和准确率。

二、公式1. 高斯核函数w(x_i) = e ^ {-\frac{(x_i - x_c)^2}{2 \times \sigma^2}}其中x_i和x_c是数据点和质心的位置向量,\sigma是高斯核函数的标准差。

该函数表示距离越大的数据点的权重越小,与质心距离越近的数据点的权重越大,因此可以有效估计密度。

2. 新质心计算公式x_c' = \frac{\sum_{x_i \in B(x_c,r)} w(x_i) \times x_i}{\sum_{x_i \in B(x_c,r)} w(x_i)}B(x_c,r)表示以x_c为圆心,半径为r的区域,w(x_i)为高斯权重系数。

机器学习之Mean Shift概述

机器学习之Mean Shift概述

机器学习之Mean Shift 概述一、 前言短短八周,机器学习课就已经离我们而去了。

八周的时间里,我们了解了许多,也收获了许多。

八周其实根本不足以涵盖这门课的知识,来不及领悟,来不及体会,甚至连一些皮毛都不够。

但是其知识背后隐含的奥秘却值得我们去探索。

而其中均值漂移,无疑是值得花时间琢磨的知识之一。

二、 Mean Shift 简介Mean Shift 这个概念最早是由Fukunaga 等人于1975年在一篇关于概率密度梯度函数的估计中提出来的,其最初含义正如其名,就是偏移的均值向量,在这里Mean Shift 是一个名词,它指代的是一个向量,但随着Mean Shift 理论的发展,Mean Shift 的含义也发生了变化,如果我们说Mean Shift 算法,一般是指一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其偏移均值,然后以此为新的起始点,继续移动,直到满足一定的条件结束。

然而在以后的很长一段时间内Mean Shift 并没有引起人们的注意,直到20年以后,也就是1995年,另外一篇关于Mean Shift 的重要文献才发表。

在这篇重要的文献中,Yizong Cheng 对基本的Mean Shift 算法在以下两个方面做了推广,首先Yizong Cheng 定义了一族核函数,使得随着样本与被偏移点的距离不同,其偏移量对均值偏移向量的贡献也不同,其次Yizong Cheng 还设定了一个权重系数,使得不同的样本点重要性不一样,这大大扩大了Mean Shift 的适用范围。

另外Yizong Cheng 指出了Mean Shift 可能应用的领域,并给出了具体的例子。

Comaniciu 等人把Mean Shift 成功的运用的特征空间的分析,在图像平滑和图像分割中Mean Shift 都得到了很好的应用。

Comaniciu 等在文章中证明了,Mean Shift 算法在满足一定条件下,一定可以收敛到最近的一个概率密度函数的稳态点,因此Mean Shift 算法可以用来检测概率密度函数中存在的模态。

经典Mean Shift算法介绍

经典Mean Shift算法介绍

经典Mean Shift算法介绍1无参数密度估计 (1)2核密度梯度估计过程 (3)3算法收敛性分析 (4)均值漂移(Mean Shift)是Fukunaga等提出的一种非参数概率密度梯度估计算法,在统计相似性计算与连续优化方法之间建立了一座桥梁,尽管它效率非常高,但最初并未得到人们的关注。

直到1995年,Cheng改进了Mean Shift算法中的核函数和权重函数,并将其应用于聚类和全局优化,才扩大了该算法的适用范围。

1997年到2003年,Comaniciu等将该方法应用到图像特征空间的分析,对图像进行平滑和分割处理,随后他又将非刚体的跟踪问题近似为一个Mean Shift最优化问题,使得跟踪可以实时进行。

由于Mean Shift算法完全依靠特征空间中的样本点进行分析,不需要任何先验知识,收敛速度快,近年来被广泛应用于模式分类、图像分割、以及目标跟踪等诸多计算机视觉研究领域。

均值漂移方法[4]是一种最优的寻找概率密度极大值的梯度上升法,提供了一种新的目标描述与定位的框架,其基本思想是:通过反复迭代搜索特征空间中样本点最密集的区域,搜索点沿着样本点密度增加的方向“漂移”到局部密度极大点。

基于Mean Shift方法的目标跟踪技术采用核概率密度来描述目标的特征,由于目标的直方图具有特征稳定、抗部分遮挡、计算方法简单和计算量小的特点,因此基于Mean Shift的跟踪一般采用直方图对目标进行建模;然后通过相似性度量,利用Mean Shift搜寻目标位置,最终实现目标的匹配和跟踪。

均值漂移方法将目标特征与空间信息有效地结合起来,避免了使用复杂模型描述目标的形状、外观及其运动,具有很高的稳定性,能够适应目标的形状、大小的连续变换,而且计算速度很快,抗干扰能力强,在解决计算机视觉底层任务过程中表现出了良好的鲁棒性和较高的实时处理能力。

1无参数密度估计目标检测与跟踪过程中,必须用到一定的手段对检测与跟踪的方法进行优化,将目标的表象信息映射到一个特征空间,其中的特征值就是特征空间的随机变量。

Mean Shift算法在彩色图像分割中的应用

Mean Shift算法在彩色图像分割中的应用

Mean Shift算法在彩色图像分割中的应用摘要:Mean Shift算法是目前广泛应用于图像分割和计算机视觉中的方法。

论述了该算法应用在彩色图像分割中的原理及过程,并给出实验过程和结果。

关键词:Mean Shift算法;彩色图像分割;数字图像处理0 引言图像分割是图像分析、识别和理解的基础,是从图像处理到图像分析的一个关键步骤。

由于彩色图像提供了比灰度图像更为丰富的信息,彩色图像的分割在近几年越来越引起人们的重视,成为图像技术研究的热点之一。

Mean shift(均值漂移,MS)算法是一种有效的统计迭代算法,最早由Fukunaga在1975年提出。

直到1995年,Cheng改进了MS算法中的核函数和权重函数,并将其应用于聚类和全局优化,扩大了该算法的适用范围。

从1997年到2003年,Comaniciu将该方法应用到图像特征空间的分析,对图像进行平滑和分割处理,并证明了MS算法在满足一定条件下,可收敛到最近的一个概率密度函数的稳态点,因此,MS算法可用来检测概率密度函数中存在的模态。

由于MS算法完全依靠特征空间中的样本点进行分析,不需要任何先验知识,并且收敛速度快,近年来被广泛应用于图像分割和跟踪等计算机视觉领域。

1 Mean Shift算法1.1 Mean Shift算法原理定义:X代表一个d维的欧氏空间,x是该空间中的一个点,用一列向量表示.x的模为‖x‖2=x Tx.R表示实数域.如果一个函数K:K →R存在一个轮廓函数k:[0,∞]→R,即K(x)=c kk(‖x‖2)(1)其中c k>0为标准化常数,且满足:①k是非负的;②k是非增的,即如果a<b那么k(a)≥k(b);③k是分段连续的,并且∫0k(r)dr<∞.则称函数K(x)为核函数。

对概率密度函数f(x),设在d维空间X中有n个采样点x i,i=1,2,…,n,用定义的核函数K(x)和d×d的正对称带宽矩阵H,得到核密度估计表达式为(x)=∑ni=1ω(x i)|H i|-12 K(H-12i(x-x i))=∑ni=1c kωi|H i|-12k(‖x-x i‖2Hi)(2)其中:w(x i)≥0赋给采样点x i的权重,满足∑ω(x i)=1,简记为ωi.‖x-x i‖2H i=(x-x i)TH-1 i(x-x i).核函数K(x)决定了采样点x i与核中心点x之间的相似性度量,带宽矩阵H i决定了核函数的影响范围。

meanshif算法简介PPT课件

meanshif算法简介PPT课件
Meanshift算法的概述及其应用
Meanshift的背景
Mean Shift 这个概念最早是由 Fukunaga等人于1975年在一篇关于概率密度梯度函 数的估计中提出来的,其最初含义正如其名,就是偏 移的均值向量。
直到20年以后,也就是1995年,,Yizong Cheng 发表了一篇对均值漂移算法里程碑意义的文章。对 基本的Mean Shift算法在以下两个方面做了改进, 首先Yizong Cheng定义了一族核函数,使得随着样 本与被偏移点的距离不同,其偏移量对均值偏移向 量的贡献也不同,其次Yizong Cheng还设定了一个 权重系数,使得不同的样本点重要性不一样,这大大 扩大了Mean Shift的适用范围.另外Yizong Cheng 指出了Mean Shift可能应用的领域,并给出了具体 的例子。
Mean shift向量的物理意义的什么呢?
为了更好地理解这个式子的物理意义,假设上式中g(x)=1 平均的偏移量会指向样本点最密的方向,也 就是概率密度函数梯度方向
下面我们看一下mean shift算法的步骤
mh x
给定一个初始点x,核函数G(x), 容许误差 ,Mean
Shift算法循环的执行下面三步,直至结束条件满足,

若再考虑到
这个表达式就是基于核函数
的概率密度函数的估计
怎样找到数据集合中数据最密集的地方呢?
数据最密集的地方,对应于概率密度最大的地方。我们可 以对概率密度求梯度,梯度的方向就是概率密度增加最大 的方向,从而也就是数据最密集的方向。
令 的梯度对所有 廓函数,核函数
,假设除了有限个点,轮廓函数
均存在 。将
Meanshift的应用
• Mean Shift可以应用在很多领域,比如聚类,图像平 滑,,图像分割。尤其是应用在目标跟踪领域,其跟踪

mean shift源码分享

mean shift源码分享

Meanshift源码分析一、概述1.分割过程:1.LoadImage 获取height, width, 数据指针pImg, 数据通道数(彩色为3,灰度为1)。

原系统仅支持PPM,PGM,PBM三种图像格式,我们可以很容易添加对DIB和JPG 等格式的支持。

wxFileDialog filedialog(this,"Choose an image file","","","Common image files|*.png;*.bmp;*.gif;*.tif;*.tiff;*.jpg;*.pnm;*.pgm;*.ppm|PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif|TIFF files (*.tif)|*.tif|JPEG files (*.jpg)|*.jpg|PNM files (*.pnm)|*.pnm|PGM/PPM files (*.pgm,*.ppm)|*.pgm;*.ppm",wxOPEN);2.指定meanshift参数:(1)spatial Bandwidth (float) 空间窗(2)range Bandwidth (float) 特征空间窗(3)min Region Area (int) 允许的最小区域int BgMdiSegmentChild::GetParameters(int &sigmaS, float &sigmaR, float &aij, float &epsilon, int &minRegion, int &kernelSize, int dataEntryCheck)3.流程:(1) 实例化类msImageProcessor (2) msIP::DefineImage(pImage, channel, height, width) 定义图像数据内部流程为a. MS::DefineLInput() 设置lattice格形数据 b. 若用户未定义核函数,定义核函数MS::DefineKernel()。

meanshift算法简介

meanshift算法简介
Mean shift向量
基于核函数G(x)的 概率密度估计

用核函数G在 x点计算得到的Mean Shift 向量 正比于归一化的用核函数K估计的概率 密度的函数 的梯度,归一化因子为用核函数 G估计的x点的概率密度.因此Mean Shift向量 总是指向概率密度增加最大的方向.
Mean shift向量的物理意义的什么呢?

2ck ,d
n
2

2ck ,d cg ,d 2 d h cg ,d nh
g i 1
n
n x xi 2 xi g 2 h x xi i 1 x n x x 2 h i g h i 1
为了更好地理解这个式子的物理意义,假设上式中g(x)=1
平均的偏移量会指向样本点最密的方向,也 就是概率密度函数梯度方向
下面我们看一下mean shift算法的步骤
mh x
给定一个初始点x,核函数G(x), 容许误差 ,Mean Shift算法 循环的执行下面三步,直至结束条件满足, •计算mh ( x) •把 mh ( x)赋给 x. •如果 mh ( x) x ,结束循环;若不然,继续执行(1)
0 =1,2…..m i=1,2…..m
(5)若
,则停止;否则y ←y1转步骤②。
0
限制条件:新目标中心需位于原目标中 心附近。
Meanshift跟踪结果
• 转word文档。
• Meanshift优缺点: 优点 ①算法复杂度小; ②是无参数算法,易于与其它算法集 成; ③采用加权直方图建模,对目标小角 度旋转、轻微变形和部分遮挡不敏感等。

MeanShift

MeanShift

§5-1Mean Shift 算法Mean Shift 算法是由Fukunaga 和Hosteler 于1975年提出的一种无监督聚类方法[109],Mean Shift 的含义是均值偏移向量,它使每一个点“漂移”到密度函数的局部极大值点。

但是再提出之初,Mean Shift 算法并没有得到广泛的重视,直到1995年,Cheng 等人对该算法进行了进一步的研究[110],提出了一般的表达形式并定义了一族核函数,从而扩展了该算法的应用领域,此后Mean Shift 算法逐步得到了人们的重视。

目前,Mean Shift 算法已广泛应用于目标跟踪[111~114]、图像分割与平滑[115~118]等领域,同时由于该算法具有简洁、能够处理目标变形等优点,也是目前目标跟踪领域的一个重要研究热点。

5-1-1 Mean Shift 算法原理Mean Shift 算法是一种基于密度梯度的无参数估计方法,从空间任意一点,沿核密度的梯度上升方向,以自适应的步长进行搜索,最终可以收敛于核密度估计函数的局部极大值处。

基本的Mean Shift 算法可以描述为:设{}()1,,i x i n = 为d 维空间R d 中含有n 个样本点的集合,在点x 处的均值偏移向量的基本形式可以由式(5.1)表示:1()()hh ix S M x xx k∈=-∑ (5.1)其中,S h 是R d 中满足式(5.2)的所有y 点集合,其形状为一个半径为h 的高维球区域。

k 为所有n 个样本点中属于高维球区域的点的数目。

(x i -x )为样本点相对于点x 的偏移向量。

根据式(5.1)的定义可知,点x 的均值偏移向量就是所有属于S h 区域中的样本点与点x 的偏移向量均值,而S h 区域中的样本点大多数是沿着概率密度梯度的方向,所以均值漂移向量的方向与概率密度梯度方向一致,图5.1为具体的示意图。

{}2():()()Th S x y y x y x h=--≤ (5.2)图5.1 Mean Shift 示意图 Fig.5.1 Mean Shift sketch map根据式(5.1)和图5.1可以看出,所有属于区域S h 中的样本点对于点x 的均值漂移向量贡献度相同,而与这些点与点x 间的距离无关。

edison_meanshift 结构

edison_meanshift 结构

转】 Mean Shift2010-10-11 17:34转载自 aspireal最终编辑 zzf378139208Edge Detection and Image SegmentatiON (EDISON) System一、概述MeanShift并不算一种很新的特征空间分析算法,但是它原理简单,计算速度较快,通常能在一次分割后形成大量小的模态区域。

这样便直接将问题分析层次从像素域提升到特征域,对后续处理有很大的好处。

CVPR07不少新颖的分析算法(比如多目标分割)都是以mean shift为基础的。

因此,它仍然有很大的研究价值。

Rutgers的RIUL实验室将mean shift和synergistic分割算法以C++实现,并将派生的边缘检测方法集成到EDISON分析平台中,以自由软件的形式发放。

本日志不讨论meanshift原理和性能,而是分析EDISON控制台程序中mean shift 分割算法的实现过程和技巧。

EDISON控制台程序模块:1. 脚本解释器(parser.h/parser.cpp/globalfnc.cpp)由于程序参数是以脚本文件提供的,所以需要进行词法、语法分析。

这不是算法的重点,这里不讨论其实现方法。

调用函数为CheckSyntax() 脚本文件语法分析,查找是否有错误语法Run() 脚本执行2. 算法控制平台(edison.h/edison.cpp)控制输入输出、所有参数设置及算法执行,一般由globalfnc.cpp中EXECUTE()函数调用3. mean shift算法(ms.h/ms.cpp/msImageProcessor.cpp)算法核心,ms.h/ms.cpp定义了MeanShift基类,使用lattice迭代计算实现。

msImageProcessor派生至MeanShift,实现了区域合并、剔除、边界查找等应用。

分割过程:1.LoadImage 获取height, width, 数据指针pImg, 数据通道数(彩色为3,灰度为1)。

Mean Shift算法的收敛性分析

Mean Shift算法的收敛性分析

Convergence Analysis of Mean Shift Algorithm
WEN Zhi-Qiang1,2+,
1 2
CAI Zi-Xing1
(School of Information Science and Engineering, Central South University, Changsha 410083, China) (Department of Computer Science and Technology, Hu’nan University of Technology, Zhuzhou 412008, China)
and Li Xiang-ru have respectively provided the proof for the convergence of Mean Shift but they both made a mistake in their proofs. In this paper, the imprecise proofs existing in some literatures are firstly pointed out. Then, the local convergence is proved in a new way and the condition of convergence to the local maximum point is offered. Finally, the geometrical counterexamples are provided for explanation about convergence of Mean Shift and the conclusion is further discussed. The results of this paper contribute to further theoretical study and extensive application for Mean Shift algorithm. Key words: 摘 要: Mean Shift algorithm; convergence; kernel function; kernel density estimation; gradient ascent method

mean shift算法讲解

mean shift算法讲解

mean shift算法讲解Mean shift算法是一种无监督的聚类算法,它的主要思想是通过不断迭代寻找数据点的概率分布密度的众数,从而实现数据的聚类。

本文将详细介绍Mean shift算法的具体步骤和实现流程,并深入解析其原理和应用场景。

一、算法背景和基本原理Mean shift算法最初由Comaniciu和Meer于1992年提出,它是一种基于密度估计的聚类方法。

其核心思想是通过计算每个数据点周围的概率密度分布,不断调整数据点的位置直到达到局部极大值点(众数),从而实现数据点的聚集。

Mean shift算法的基本原理如下:1.初始化:选择一个合适的核函数和带宽,然后从数据集中选择一个数据点作为初始中心点。

2.密度估计:计算每个数据点周围的概率密度分布,以核函数和带宽作为参数。

3.均值偏移:根据密度估计结果,通过计算梯度的方向,将当前中心点移动到密度分布的局部极大值点。

4.收敛判断:判断当前中心点和移动后的中心点之间的距离,如果小于某个阈值,则认为算法收敛,结束迭代。

否则,将移动后的中心点作为新的中心点,重复步骤2-4直到收敛。

二、算法步骤详解下面将详细解释Mean shift算法的每一步骤。

1.初始化为了实现Mean shift算法,我们首先需要选择一个适当的核函数和带宽。

核函数可以是高斯核函数或者其他类型的核函数。

带宽决定了数据点的搜索半径,即计算密度估计的范围。

一个较小的带宽会导致聚类过于散乱,而一个较大的带宽会导致聚类过于集中。

因此,合适的带宽选择是非常重要的。

2.密度估计在第二步中,我们需要计算每个数据点周围的概率密度分布。

这可以通过核函数和带宽来实现。

对于给定的数据点xi,其密度估计可以表示为:f(xi)=1/N*ΣK(xi-xj)/h其中,N是数据点的总数,K是核函数,h是带宽。

该公式意味着每个数据点的密度估计值是通过计算该数据点和所有其他数据点之间的核函数和的平均值得到的。

3.均值偏移在第三步中,我们通过计算梯度的方向来将当前中心点移动到密度分布的局部极大值点。

meanshift算法详解 PPT

meanshift算法详解 PPT

Region of interest
Center of mass
Objective : Find the densest region Distribution of identical billiard balls
What is Mean Shift ?
A tool for: Finding modes in a set of data samples, manifesting an underlying probability density function (PDF) in RN
K(x - xi )
A function of some finite number of data points x1…xn
In practice one uses the forms:
Data
d
K (x) c k(xi ) or K(x) ck x i 1
Same function on each dimension
Non-parametric Density GRADIENT Estimation
(Mean Shift)
PDF Analysis
ቤተ መጻሕፍቲ ባይዱ
Non-Parametric Density Estimation
Assumption : The data points are sampled from an underlying PDF
Data point density implies PDF value !
Assumed Underlying PDF
Real Data Samples
Non-Parametric Density Estimation

【计算机应用】_mean shift_期刊发文热词逐年推荐_20140726

【计算机应用】_mean shift_期刊发文热词逐年推荐_20140726

推荐指数 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2010年 序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
科研热词 均值漂移 目标跟踪 视觉目标跟踪 粒子滤波 相关性 目标遮挡 目标中心 特征选取 模板匹配 梯度方向直方图 彩色图像分割 带宽 均值偏移算法 均值偏移 图像分割 卡尔曼滤波器 区域合并 nmi特征 k均值聚类 bhattacharyya系数
科研热词 均值漂移 图像分割 目标跟踪 均值偏移 预测视差矢量 迭代路径 运动跟踪 运动矢量 载波间干扰 视差匹配 视差估计 聚பைடு நூலகம்分析 空间属性 流形正则化 正交频分复用 模糊c均值聚类 时间密度曲线 感兴趣区域 快时变信道 循环置信传播 形态学 局部背景 尺度空间 尺度不变特征变换算法 多特征融合 多普勒频移 多准则 基于图 图像分类 半监督 信道估计 mean shift kalman滤波 ct肝脏灌注
推荐指数 4 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2013年 序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
推荐指数 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2009年 序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
科研热词 均值漂移 mean shift算法 颜色量化 运动目标跟踪 视频检索 背景优化 聚类 种子区域生长 目标跟踪 目标表示 改造高斯核 彩色图像分割 子图 多辅助信息 多特征 多人脸跟踪 图像区域分割 图像分割 卡尔曼滤波器 区域合并 关键帧 二维直方图 不变矩 shift算法 meanshift mean shift mean k均值算法 harris角点检测

(数据科学学习手札14)Mean-Shift聚类法简单介绍及Python实现

(数据科学学习手札14)Mean-Shift聚类法简单介绍及Python实现

(数据科学学习⼿札14)Mean-Shift聚类法简单介绍及Python实现不管之前介绍的K-means还是K-medoids聚类,都得事先确定聚类簇的个数,⽽且肘部法则也并不是万能的,总会遇到难以抉择的情况,⽽本篇将要介绍的Mean-Shift聚类法就可以⾃动确定k的个数,下⾯简要介绍⼀下其算法流程: 1.随机确定样本空间内⼀个半径确定的⾼维球及其球⼼; 2.求该⾼维球内质⼼,并将⾼维球的球⼼移动⾄该质⼼处; 3.重复2,直到⾼维球内的密度随着继续的球⼼滑动变化低于设定的阈值,算法结束具体的原理可以参考下⾯的地址,笔者读完觉得说的⽐较明了易懂:/google19890102/article/details/51030884⽽在Python中,机器学习包sklearn中封装有该算法,下⾯⽤⼀个简单的⽰例来演⽰如何在Python中使⽤Mean-Shift聚类:⼀、低维from sklearn.cluster import MeanShiftimport matplotlib.pyplot as pltfrom sklearn.manifold import TSNEfrom matplotlib.pyplot import styleimport numpy as np'''设置绘图风格'''e('ggplot')'''⽣成演⽰⽤样本数据'''data1 = np.random.normal(0,0.3,(1000,2))data2 = np.random.normal(1,0.2,(1000,2))data3 = np.random.normal(2,0.3,(1000,2))data = np.concatenate((data1,data2,data3))# data_tsne = TSNE(learning_rate=100).fit_transform(data)'''搭建Mean-Shift聚类器'''clf=MeanShift()'''对样本数据进⾏聚类'''predicted=clf.fit_predict(data)colors = [['red','green','blue','grey'][i] for i in predicted]'''绘制聚类图'''plt.scatter(data[:,0],data[:,1],c=colors,s=10)plt.title('Mean Shift')⼆、⾼维from sklearn.cluster import MeanShiftimport matplotlib.pyplot as pltfrom sklearn.manifold import TSNEfrom matplotlib.pyplot import styleimport numpy as np'''设置绘图风格'''e('ggplot')'''⽣成演⽰⽤样本数据'''data1 = np.random.normal(0,0.3,(1000,6))data2 = np.random.normal(1,0.2,(1000,6))data3 = np.random.normal(2,0.3,(1000,6))data = np.concatenate((data1,data2,data3))data_tsne = TSNE(learning_rate=100).fit_transform(data) '''搭建Mean-Shift聚类器'''clf=MeanShift()'''对样本数据进⾏聚类'''predicted=clf.fit_predict(data)colors = [['red','green','blue','grey'][i] for i in predicted]'''绘制聚类图'''plt.scatter(data_tsne[:,0],data_tsne[:,1],c=colors,s=10)plt.title('Mean Shift')三、实际⽣活中的复杂数据我们以之前⼀篇关于K-means聚类的实战中使⽤到的重庆美团商户数据为例,进⾏Mean-Shift聚类:import matplotlib.pyplot as pltfrom sklearn.cluster import MeanShiftfrom sklearn.manifold import TSNEimport pandas as pdimport numpy as npfrom matplotlib.pyplot import stylee('ggplot')data = pd.read_excel(r'C:\Users\windows\Desktop\重庆美团商家信息.xlsx')input = pd.DataFrame({'score':data['商家评分'][data['数据所属期'] == data.iloc[0,0]],'comment':data['商家评论数'][data['数据所属期'] == data.iloc[0,0]],'sales':data['本⽉销售额'][data['数据所属期'] == data.iloc[0,0]]})'''去缺省值'''input = input.dropna()input_tsne = TSNE(learning_rate=100).fit_transform(input)'''创造⾊彩列表'''with open(r'C:\Users\windows\Desktop\colors.txt','r') as cc:col = cc.readlines()col = [col[i][:7] for i in range(len(col)) if col[i][0] == '#']'''进⾏Mean-Shift聚类'''clf = MeanShift()cl = clf.fit_predict(input)'''绘制聚类结果'''np.random.shuffle(col)plt.scatter(input_tsne[:,0],input_tsne[:,1],c=[col[i] for i in cl],s=8)plt.title('Mean-Shift Cluster of {}'.format(str(len(set(cl)))))可见在实际⼯作中的复杂数据⽤Mean-Shift来聚类因为⽆法控制k个值,可能会产⽣过多的类⽽导致聚类失去意义,但Mean-Shift在图像分割上⽤处很⼤。

高斯核函数mean-shift matlab

高斯核函数mean-shift matlab

高斯核函数mean-shift matlab高斯核函数是一种常用的核函数,它广泛应用于图像处理、模式识别、机器学习等领域。

平均漂移(mean-shift)算法是一种基于高斯核函数的非参数密度估计方法,具有较强的适应性和鲁棒性。

平均漂移算法基于传统的核密度估计方法,但它不需要指定数据的概率分布函数。

相反,它使用核函数来估计密度函数。

核函数通常采用高斯核函数,如下所示:$$K(x) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{x^2}{2\sigma^2}}$$$x$表示一个样本点,$\sigma$表示高斯分布的标准差。

平均漂移算法通过迭代来寻找样本点的密度中心,即最高密度的点。

为了找到密度中心,要先选择一个起始点,并使用核函数来计算该点周围所有点的权值。

然后,根据所有点的权值计算权重平均值,以此平移当前点的位置。

不断迭代此过程,直到找到密度中心为止。

1. 选择一个起始点$x_0$。

2. 计算权重$w_i = K(||x_i-x_0||)$,其中$||\cdot||$表示欧几里得距离。

3. 计算权重平均值:$m(x_0) =\frac{\sum_{i=1}^n w_ix_i}{\sum_{i=1}^n w_i}$。

4. 将$x_0$平移到$m(x_0)$,即$x_0 = m(x_0)$。

5. 重复2~4步,直到$m(x_0)$与$x_0$之间的距离小于某个阈值或达到预定的最大迭代次数。

```matlabfunction [center, idx] = mean_shift(data, bandwidth, eps)[n, d] = size(data); % 数据维度center = zeros(n, d); % 每个数据点的密度中心converged = false(n, 1); % 每个数据点是否已经收敛idx = zeros(n, 1); % 数据点所属簇的标签for i = 1:nx = data(i, :); % 取出一个数据点cnt = 0;while ~converged(i) && cnt < 100 % 最多迭代100次cnt = cnt + 1;w = exp(-sum((data-repmat(x, n, 1)).^2, 2)/(2*bandwidth^2)); % 计算所有点的权重x_new = sum(repmat(w, 1, d).*data, 1) / sum(w); % 根据权重计算新的位置if norm(x_new - x) < eps % 如果位置变化很小,认为已经收敛center(i, :) = x_new;idx(i) = find(abs(w-max(w))<eps, 1); % 选择权重最大的簇作为标签converged(i) = true;elsex = x_new;endendend````data`表示数据样本,`bandwidth`表示高斯核函数的标准差,`eps`表示收敛判定的阈值。

Mean Shift 概述

Mean Shift 概述

Mean Shift 概述Mean Shift 简介Mean Shift 这个概念最早是由Fukunaga 等人[1]于1975年在一篇关于概率密度梯度函数的估计中提出来的,其最初含义正如其名,就是偏移的均值向量,在这里Mean Shift 是一个名词,它指代的是一个向量,但随着Mean Shift 理论的发展,Mean Shift 的含义也发生了变化,如果我们说Mean Shift 算法,一般是指一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其偏移均值,然后以此为新的起始点,继续移动,直到满足一定的条件结束.然而在以后的很长一段时间内Mean Shift 并没有引起人们的注意,直到20年以后,也就是1995年,另外一篇关于Mean Shift 的重要文献[2]才发表.在这篇重要的文献中,Yizong Cheng 对基本的Mean Shift 算法在以下两个方面做了推广,首先Yizong Cheng 定义了一族核函数,使得随着样本与被偏移点的距离不同,其偏移量对均值偏移向量的贡献也不同,其次Yizong Cheng 还设定了一个权重系数,使得不同的样本点重要性不一样,这大大扩大了Mean Shift 的适用范围.另外Yizong Cheng 指出了Mean Shift 可能应用的领域,并给出了具体的例子.Comaniciu 等人[3][4]把Mean Shift 成功的运用的特征空间的分析,在图像平滑和图像分割中Mean Shift 都得到了很好的应用. Comaniciu 等在文章中证明了,Mean Shift 算法在满足一定条件下,一定可以收敛到最近的一个概率密度函数的稳态点,因此Mean Shift 算法可以用来检测概率密度函数中存在的模态.Comaniciu 等人[5]还把非刚体的跟踪问题近似为一个Mean Shift 最优化问题,使得跟踪可以实时的进行.在后面的几节,本文将详细的说明Mean Shift 的基本思想及其扩展,其背后的物理含义,以及算法步骤,并给出理论证明.最后本文还将给出Mean Shift 在聚类,图像平滑,图像分割,物体实时跟踪这几个方面的具体应用.Mean Shift 的基本思想及其扩展基本Mean Shift给定d 维空间dR 中的n 个样本点i x ,i=1,…,n,在x 点的Mean Shift 向量的基本形式定义为:()()1i hh i x S M x x x k ∈≡-∑ (1)其中,h S 是一个半径为h 的高维球区域,满足以下关系的y 点的集合,()()(){}2:Th S x y y x y x h ≡--≤ (2)k 表示在这n 个样本点i x 中,有k 个点落入h S 区域中.陈姝注:11111111()()kii k k k h i i i i i i x x k M x x x x x x kx x x k k k =====⎛⎫⎛⎫=-=-=-=- ⎪ ⎪⎝⎭⎝⎭∑∑∑∑我们可以看到()i x x -是样本点i x 相对于点x 的偏移向量,(1)式定义的Mean Shift 向量()h M x 就是对落入区域h S 中的k 个样本点相对于点x 的偏移向量求和然后再平均.从直观上看,如果样本点i x 从一个概率密度函数()f x 中采样得到,由于非零的概率密度梯度指向概率密度增加最大的方向,因此从平均上来说, h S 区域内的样本点更多的落在沿着概率密度梯度的方向.因此,对应的, Mean Shift 向量()h M x 应该指向概率密度梯度的方向.图1,Mean Shift 示意图如上图所示, 大圆圈所圈定的范围就是h S ,小圆圈代表落入h S 区域内的样本点i h x S ∈,黑点就是Mean Shift 的基准点x ,箭头表示样本点相对于基准点x 的偏移向量,很明显的,我们可以看出,平均的偏移向量()h M x 会指向样本分布最多的区域,也就是概率密度函数的梯度方向.扩展的Mean Shift核函数首先我们引进核函数的概念.定义:X 代表一个d 维的欧氏空间,x 是该空间中的一个点,用一列向量表示. x 的模2T x x x =.R 表示实数域.如果一个函数:K X R →存在一个剖面函数[]:0,k R ∞→,即()2()K x k x=(3)并且满足:(1) k 是非负的.(2) k 是非增的,即如果a b <那么()()k a k b ≥. (3) k 是分段连续的,并且0()k r dr ∞<∞⎰那么,函数()K x 就被称为核函数.举例:在Mean Shift 中,有两类核函数经常用到,他们分别是, 单位均匀核函数:1 if 1()0 if 1x F x x ⎧<⎪=⎨≥⎪⎩ (4)单位高斯核函数:2()xN x e-= (5)这两类核函数如下图所示.图2, (a) 单位均匀核函数 (b) 单位高斯核函数一个核函数可以与一个均匀核函数相乘而截尾,如一个截尾的高斯核函数为,()2if ()0 ifx e x N F x x ββλλλ-⎧<⎪=⎨≥⎪⎩ (6)图 3 显示了不同的,βλ值所对应的截尾高斯核函数的示意图.图3 截尾高斯核函数 (a) 11N F (b) 0.11N FMean Shift 扩展形式从(1)式我们可以看出,只要是落入h S 的采样点,无论其离x 远近,对最终的()h M x 计算的贡献是一样的,然而我们知道,一般的说来,离x 越近的采样点对估计x 周围的统计特性越有效,因此我们引进核函数的概念,在计算()h M x 时可以考虑距离的影响;同时我们也可以认为在这所有的样本点i x 中,重要性并不一样,因此我们对每个样本都引入一个权重系数. 陈姝注:考虑下particle filtering 中的重要函数,蒙特卡罗采样。

mean_shift算法的原理与实现详解

mean_shift算法的原理与实现详解
( x-μi )2 2 i 2
PDF(x) =
c e
i i

Estimate
Assumed Underlying PDF
Real Data Samples
Kernel Density Estimation
Parzen Windows - Function Forms
1 n P ( x) K ( x - x i ) n i 1
Mean Shift vector
Objective : Find the densest region Distribution of identical billiard balls
Intuitive Description
Region of interest Center of mass
Mean Shift vector
• Applications • Clustering • Discontinuity Preserving Smoothing • Object Contour Detection • Segmentation • Object Tracking
Mean Shift Theory
Intuitive Description
Mean Shift
Theory and Applications
Yaron Ukrainitz & Bernard Sarel
Agenda
• Mean Shift Theory • What is Mean Shift ? • Density Estimation Methods • Deriving the Mean Shift • Mean shift properties
Mean Shift Properties
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Mean Shift,我们翻译为“均值飘移”。

其在聚类,图像平滑。

图像分割和跟踪方面得到了比较广泛的应用。

由于本人目前研究跟踪方面的东西,故此主要介绍利用Mean Shift方法进行目标跟踪,从而对MeanShift有一个比较全面的介绍。

(以下某些部分转载常峰学长的“Mean Shift概述”)Mean Shift 这个概念最早是由Fukunaga等人于1975年在一篇关于概率密度梯度函数的估计(The Estimation of the Gradient of a Density Function, with Applications in Pattern Recognition )中提出来的,其最初含义正如其名,就是偏移的均值向量,在这里Mean Shift是一个名词,它指代的是一个向量,但随着Mean Shift理论的发展,Mean Shift的含义也发生了变化,如果我们说Mean Shift算法,一般是指一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其偏移均值,然后以此为新的起始点,继续移动,直到满足一定的条件结束.然而在以后的很长一段时间内Mean Shift并没有引起人们的注意,直到20年以后,也就是1995年,另外一篇关于Mean Shift的重要文献(Mean shift, mode seeking, and clustering )才发表.在这篇重要的文献中,Yizong Cheng对基本的Mean Shift算法在以下两个方面做了推广,首先Yizong Cheng定义了一族核函数,使得随着样本与被偏移点的距离不同,其偏移量对均值偏移向量的贡献也不同,其次Yizong Cheng还设定了一个权重系数,使得不同的样本点重要性不一样,这大大扩大了Mean Shift的适用范围.另外Yizong Cheng指出了Mean Shift可能应用的领域,并给出了具体的例子。

Comaniciu等人在还(Mean-shift Blob Tracking through Scale Space)中把非刚体的跟踪问题近似为一个Mean Shift最优化问题,使得跟踪可以实时的进行。

目前,利用Mean Shift进行跟踪已经相当成熟。

目标跟踪不是一个新的问题,目前在计算机视觉领域内有不少人在研究。

所谓跟踪,就是通过已知的图像帧中的目标位置找到目标在下一帧中的位置。

下面主要以代码形式展现Mean Shift在跟踪中的应用。

void CObjectTracker::ObjeckTrackerHandlerByUser(IplImage *frame)//跟踪函数{m_cActiveObject = 0;if (m_sTrackingObjectTable[m_cActiveObject].Status){if (!m_sTrackingObjectTable[m_cActiveObject].assignedAnObject){FindHistogram(frame,m_sTrackingObjectTable[m_cActiveObject].initHistogram);m_sTrackingObjectTable[m_cActiveObject].assignedAnObject = true;}else{FindNextLocation(frame);//利用mean shift 迭代找出目标下一个位置点DrawObjectBox(frame);}}}void CObjectTracker::FindNextLocation(IplImage *frame){int i, j, opti, optj;SINT16 scale[3]={-3, 3, 0};FLOAT32 dist, optdist;SINT16 h, w, optX, optY;//try no-scalingFindNextFixScale(frame);//找出目标的下一个大致范围optdist=LastDist;optX=m_sTrackingObjectTable[m_cActiveObject].X;optY=m_sTrackingObjectTable[m_cActiveObject].Y;//try one of the 9 possible scalingi=rand()*2/RAND_MAX;j=rand()*2/RAND_MAX;h=m_sTrackingObjectTable[m_cActiveObject].H;w=m_sTrackingObjectTable[m_cActiveObject].W;if(h+scale[i]>10 && w+scale[j]>10 && h+scale[i]<m_nImageHeight/2 && w+scale[j]<m_nImageWidth/2){m_sTrackingObjectTable[m_cActiveObject].H=h+scale[i];m_sTrackingObjectTable[m_cActiveObject].W=w+scale[j];FindNextFixScale(frame);if( (dist=LastDist) < optdist ) //scaling is better{optdist=dist;// printf("Next%f->\n", dist);}else //no scaling is better{m_sTrackingObjectTable[m_cActiveObject].X=optX;m_sTrackingObjectTable[m_cActiveObject].Y=optY;m_sTrackingObjectTable[m_cActiveObject].H=h;m_sTrackingObjectTable[m_cActiveObject].W=w;}};TotalDist+=optdist; //the latest distance// printf("\n");}这里仍然在跟踪的基础上讲解mean shift。

首先还是把mean shift的原理用数学公式说一下吧。

1、目标模型,算法采用的是特征值的加权概率分布来描述目标模型。

这应该是模式识别中主要描述目标的模型,不同于自动控制理论中采用的状态方程。

目标模型共m个特征值(可以理解为像素灰度值)其中X0是窗口中心点向量值(可能为RBG 向量或者灰度值),Xi 是窗口内第i 点向量值。

C 为归一化常数,保障q1+q2+q3+……qm=1,H 为核函数的带宽向量。

M 为特征值的个数,对应于图像处理可以理解为灰度等级划分的个数,从而特征值u 为对应的灰度等级。

d 函数为脉冲函数,保证只有具有u 特征值的像素才对概率分布作出贡献。

从而k函数可以理解为u 灰度值的一个加权频数。

2、匹配对象,也采用特征值加权概率分布其中,Y 为匹配对象的中心,Xi 是匹配窗口内第i 点向量值,Hh 为匹配窗口的核函数带宽向量。

Ch 为匹配窗口特征向量的归一化常数。

3、匹配对象与目标模型的相似程度,相似函数可采用Bhattacharyya 函数4、匹配过程就是寻找相似函数最大值的寻优过程,Mean-Shift 采用的是梯度下降法。

首先将(Y) 在(Y0)附近进行泰勒级数展开,取前两项。

即:要使得(Y) 向最大值迭代,只要Y 的搜索方向与梯度方向一致即可,通过求导可得到Y0的梯度方向为:为权值。

因此如果如下确定Y1,那么Y1-Y0将与梯度方向一致。

以上为mean shift的数学原理。

有关文字的叙述已经在上一篇中提到了。

用mean shift来跟踪属于确定性算法,粒子滤波器属于统计学方法。

meanshift跟踪算法相对于粒子滤波器来说可能实时性更好一些,但是跟踪的准确性在理论上还是略逊于粒子滤波器的。

mean shift 跟踪的的实质就是通过对应的模板来确定目标的下一个位置。

通过迭代找到新的中心点(即是目标的新的位置点)。

有关跟踪的code如下所示:/**********************************************************************Bilkent University:Mean-shift Tracker based Moving Object Tracker in VideoVersion: 1.0Compiler: Microsoft Visual C++ 6.0 (tested in both debug and releasemode)Modified by Mr Zhou**********************************************************************/#include "ObjectTracker.h"#include "utils.h"#include <math.h>#include <stdio.h>#include <stdlib.h>/*#define GetRValue(rgb) ((UBYTE8) (rgb))#define GetGValue(rgb) ((UBYTE8) (((ULONG_32) (rgb)) >> 8))#define GetBValue(rgb) ((UBYTE8) ((rgb) >> 16))*///#define RGB(r, g ,b) ((ULONG_32) (((UBYTE8) (r) | ((UBYTE8) (g) << 8)) | (((ULONG_32) (UBYTE8) (b)) << 16)))#define min(a, b) (((a) < (b)) ? (a) : (b))#define max(a, b) (((a) > (b)) ? (a) : (b))#define MEANSHIFT_ITARA TION_NO 5#define DISTANCE_ITARA TION_NO 1#define ALPHA 1#define EDGE_DETECT_TRESHOLD 32///////////////////////////////////////////////////*1 给定目标的初始位置和尺寸, 计算目标在图像中的直方图;2 输入新图像, 迭代直到收敛:计算图像上对应区域的新直方图;新直方图与目标直方图比较,计算权重;根据权重,计算图像上对应区域的形心/质心;根据形心,修正目标位置;直方图分为两部分, 每部分大小4096,RGB的256*256*256种组合, 缩减为16*16*16=4096种组合.如果目标区域的点是边缘点, 则计入直方图的后一部分,否则计入直方图的前一部分.*///////////////////////////////////////////////////CObjectTracker::CObjectTracker(INT32 imW,INT32 imH,IMAGE_TYPE eImageType) {m_nImageWidth = imW;m_nImageHeight = imH;m_eIMAGE_TYPE = eImageType;m_cSkipValue = 0;for (UBYTE8 i=0;i<MAX_OBJECT_TRACK_NUMBER;i++)//初始化各个目标{m_sTrackingObjectTable[i].Status = false;for(SINT16 j=0;j<HISTOGRAM_LENGTH;j++)m_sTrackingObjectTable[i].initHistogram[j] = 0;}m_nFrameCtr = 0;m_uTotalTime = 0;m_nMaxEstimationTime = 0;m_cActiveObject = 0;TotalDist=0.0;LastDist=0.0;switch (eImageType){case MD_RGBA:m_cSkipValue = 4 ;break ;case MD_RGB:m_cSkipValue = 3 ;break ;};};CObjectTracker::~CObjectTracker(){}//returns pixel values in format |0|B|G|R| wrt to (x.y)/*ULONG_32 CObjectTracker::GetPixelValues(UBYTE8 *frame,SINT16 x,SINT16 y){ULONG_32 pixelValues = 0;pixelValues = *(frame+(y*m_nImageWidth+x)*m_cSkipValue+2)|//0BGR*(frame+(y*m_nImageWidth+x)*m_cSkipValue+1) << 8|*(frame+(y*m_nImageWidth+x)*m_cSkipValue) << 16;return(pixelValues);}*///set RGB components wrt to (x.y)void CObjectTracker::SetPixelValues(IplImage *r,IplImage *g,IplImage *b,ULONG_32 pixelValues,SINT16 x,SINT16 y){// *(frame+(y*m_nImageWidth+x)*m_cSkipValue+2) = UBYTE8(pixelValues & 0xFF);// *(frame+(y*m_nImageWidth+x)*m_cSkipValue+1) = UBYTE8((pixelValues >> 8) & 0xFF); // *(frame+(y*m_nImageWidth+x)*m_cSkipValue) = UBYTE8((pixelValues >> 16) & 0xFF);//setpix32fsetpix8c(r, y, x, UBYTE8(pixelValues & 0xFF));setpix8c(g, y, x, UBYTE8((pixelValues >> 8) & 0xFF));setpix8c(b, y, x, UBYTE8((pixelValues >> 16) & 0xFF));}// returns box colorULONG_32 CObjectTracker::GetBoxColor() {ULONG_32 pixelValues = 0;switch(m_cActiveObject){case 0:pixelValues = RGB(255,0,0);break;case 1:pixelValues = RGB(0,255,0);break;case 2:pixelValues = RGB(0,0,255);break;case 3:pixelValues = RGB(255,255,0);break;case 4:pixelValues = RGB(255,0,255);break;case 5:pixelValues = RGB(0,255,255);break;case 6:pixelValues = RGB(255,255,255);break;case 7:pixelValues = RGB(128,0,128);break;case 8:pixelValues = RGB(128,128,0);break;case 9:pixelValues = RGB(128,128,128);break;case 10:pixelValues = RGB(255,128,0);break;case 11:pixelValues = RGB(0,128,128);break;case 12:pixelValues = RGB(123,50,10);break;case 13:pixelValues = RGB(10,240,126);break;case 14:pixelValues = RGB(0,128,255);break;case 15:pixelValues = RGB(128,200,20);break;default:break;}return(pixelValues);}//初始化一个目标的参数void CObjectTracker::ObjectTrackerInitObjectParameters(SINT16 x,SINT16 y,SINT16 Width,SINT16 Height){m_cActiveObject = 0;m_sTrackingObjectTable[m_cActiveObject].X = x;m_sTrackingObjectTable[m_cActiveObject].Y = y;m_sTrackingObjectTable[m_cActiveObject].W = Width;m_sTrackingObjectTable[m_cActiveObject].H = Height;m_sTrackingObjectTable[m_cActiveObject].vectorX = 0;m_sTrackingObjectTable[m_cActiveObject].vectorY = 0;m_sTrackingObjectTable[m_cActiveObject].Status = true;m_sTrackingObjectTable[m_cActiveObject].assignedAnObject = false;}//进行一次跟踪void CObjectTracker::ObjeckTrackerHandlerByUser(IplImage *frame){m_cActiveObject = 0;if (m_sTrackingObjectTable[m_cActiveObject].Status){if (!m_sTrackingObjectTable[m_cActiveObject].assignedAnObject){//计算目标的初始直方图FindHistogram(frame,m_sTrackingObjectTable[m_cActiveObject].initHistogram);m_sTrackingObjectTable[m_cActiveObject].assignedAnObject = true;}else{//在图像上搜索目标FindNextLocation(frame);DrawObjectBox(frame);}}}//Extracts the histogram of box//frame: 图像//histogram: 直方图//在图像frame中计算当前目标的直方图histogram//直方图分为两部分,每部分大小4096,//RGB的256*256*256种组合,缩减为16*16*16=4096种组合//如果目标区域的点是边缘点,则计入直方图的后一部分,//否则计入直方图的前一部分void CObjectTracker::FindHistogram(IplImage *frame, FLOAT32 (*histogram)){SINT16 i = 0;SINT16 x = 0;SINT16 y = 0;UBYTE8 E = 0;UBYTE8 qR = 0,qG = 0,qB = 0;// ULONG_32 pixelValues = 0;UINT32 numberOfPixel = 0;IplImage* r, * g, * b;r = cvCreateImage( cvGetSize(frame), frame->depth, 1 );g = cvCreateImage( cvGetSize(frame), frame->depth, 1 );b = cvCreateImage( cvGetSize(frame), frame->depth, 1 );cvCvtPixToPlane( frame, b, g, r, NULL ); //divide color image into separate planes r, g, b. The exact sequence doesn't matter.for (i=0;i<HISTOGRAM_LENGTH;i++) //reset all histogramhistogram[i] = 0.0;//for all the pixels in the regionfor(y=max(m_sTrackingObjectTable[m_cActiveObject].Y-m_sTrackingObjectTable[m_cActiveObje ct].H/2,0);y<=min(m_sTrackingObjectTable[m_cActiveObject].Y+m_sTrackingObjectTable[m_c ActiveObject].H/2,m_nImageHeight-1);y++)for(x=max(m_sTrackingObjectTable[m_cActiveObject].X-m_sTrackingObjectTable[m_cActiveObje ct].W/2,0);x<=min(m_sTrackingObjectTable[m_cActiveObject].X+m_sTrackingObjectTable[m_c ActiveObject].W/2,m_nImageWidth-1);x++){//边缘信息: 当前点与上下左右4点灰度差异是否超过阈值E = CheckEdgeExistance(r, g, b,x,y);qR = (UBYTE8)pixval8c( r, y, x )/16;//quantize R componentqG = (UBYTE8)pixval8c( g, y, x )/16;//quantize G componentqB = (UBYTE8)pixval8c( b, y, x )/16;//quantize B componenthistogram[4096*E+256*qR+16*qG+qB] += 1; //根据边缘信息, 累计直方图//HISTOGRAM_LENGTH=8192numberOfPixel++;}for (i=0;i<HISTOGRAM_LENGTH;i++) //normalizehistogram[i] = histogram[i]/numberOfPixel;//for (i=0;i<HISTOGRAM_LENGTH;i++)// printf("histogram[%d]=%d\n",i,histogram[i]);// printf("numberOfPixel=%d\n",numberOfPixel);cvReleaseImage(&r);cvReleaseImage(&g);cvReleaseImage(&b);}//Draw box around objectvoid CObjectTracker::DrawObjectBox(IplImage *frame){SINT16 x_diff = 0;SINT16 x_sum = 0;SINT16 y_diff = 0;SINT16 y_sum = 0;SINT16 x = 0;SINT16 y = 0;ULONG_32 pixelValues = 0;IplImage* r, * g, * b;r = cvCreateImage( cvGetSize(frame), frame->depth, 1 );g = cvCreateImage( cvGetSize(frame), frame->depth, 1 );b = cvCreateImage( cvGetSize(frame), frame->depth, 1 );cvCvtPixToPlane( frame, b, g, r, NULL );pixelValues = GetBoxColor();//the x left and right boundsx_sum = min(m_sTrackingObjectTable[m_cActiveObject].X+m_sTrackingObjectTable[m_cActiveObject]. W/2+1,m_nImageWidth-1);//右边界x_diff = max(m_sTrackingObjectTable[m_cActiveObject].X-m_sTrackingObjectTable[m_cActiveObject]. W/2,0);//左边界//the y upper and lower boundsy_sum = min(m_sTrackingObjectTable[m_cActiveObject].Y+m_sTrackingObjectTable[m_cActiveObject]. H/2+1,m_nImageHeight-1);//下边界y_diff = max(m_sTrackingObjectTable[m_cActiveObject].Y-m_sTrackingObjectTable[m_cActiveObject]. H/2,0);//上边界for (y=y_diff;y<=y_sum;y++){SetPixelValues(r, g, b,pixelValues,x_diff,y);SetPixelValues(r, g, b,pixelValues,x_diff+1,y);SetPixelValues(r, g, b,pixelValues,x_sum-1,y);SetPixelValues(r, g, b,pixelValues,x_sum,y);}for (x=x_diff;x<=x_sum;x++){SetPixelValues(r, g, b,pixelValues,x,y_diff);SetPixelValues(r, g, b,pixelValues,x,y_diff+1);SetPixelValues(r, g, b,pixelValues,x,y_sum-1);SetPixelValues(r, g, b,pixelValues,x,y_sum);}cvCvtPlaneToPix(b, g, r, NULL, frame);cvReleaseImage(&r);cvReleaseImage(&g);cvReleaseImage(&b);}// Computes weights and drives the new location of object in the next frame//frame: 图像//histogram: 直方图//计算权重, 更新目标的坐标void CObjectTracker::FindWightsAndCOM(IplImage *frame, FLOAT32 (*histogram)){SINT16 i = 0;SINT16 x = 0;SINT16 y = 0;UBYTE8 E = 0;FLOAT32 sumOfWeights = 0;SINT16 ptr = 0;UBYTE8 qR = 0,qG = 0,qB = 0;FLOAT32 newX = 0.0;FLOAT32 newY = 0.0;// ULONG_32 pixelValues = 0;IplImage* r, * g, * b;FLOAT32 *weights = new FLOAT32[HISTOGRAM_LENGTH];for (i=0;i<HISTOGRAM_LENGTH;i++){if (histogram[i] >0.0 )weights[i] = m_sTrackingObjectTable[m_cActiveObject].initHistogram[i]/histogram[i]; //qu/pu(y0)elseweights[i] = 0.0;}r = cvCreateImage( cvGetSize(frame), frame->depth, 1 );g = cvCreateImage( cvGetSize(frame), frame->depth, 1 );b = cvCreateImage( cvGetSize(frame), frame->depth, 1 );cvCvtPixToPlane( frame, b, g, r, NULL ); //divide color image into separate planes r, g, b. The exact sequence doesn't matter.for(y=max(m_sTrackingObjectTable[m_cActiveObject].Y-m_sTrackingObjectTable[m_cActiveObject].H/2,0);y<=min(m_sTrackingObjectTable[m_cActiveObject].Y+m_sTrackingObjectTable[m_c ActiveObject].H/2,m_nImageHeight-1);y++)for(x=max(m_sTrackingObjectTable[m_cActiveObject].X-m_sTrackingObjectTable[m_cActiveObje ct].W/2,0);x<=min(m_sTrackingObjectTable[m_cActiveObject].X+m_sTrackingObjectTable[m_c ActiveObject].W/2,m_nImageWidth-1);x++){E = CheckEdgeExistance(r, g, b,x,y);qR = (UBYTE8)pixval8c( r, y, x )/16;qG = (UBYTE8)pixval8c( g, y, x )/16;qB = (UBYTE8)pixval8c( b, y, x )/16;ptr = 4096*E+256*qR+16*qG+qB; //some recalculation here. The bin number of (x, y) can be stroed somewhere in fact.newX += (weights[ptr]*x);newY += (weights[ptr]*y);sumOfWeights += weights[ptr];}if (sumOfWeights>0){m_sTrackingObjectTable[m_cActiveObject].X = SINT16((newX/sumOfWeights) + 0.5); //update locationm_sTrackingObjectTable[m_cActiveObject].Y = SINT16((newY/sumOfWeights) + 0.5);}cvReleaseImage(&r);cvReleaseImage(&g);cvReleaseImage(&b);delete[] weights, weights = 0;}// Returns the distance between two histograms.FLOAT32 CObjectTracker::FindDistance(FLOAT32 (*histogram)){SINT16 i = 0;FLOAT32 distance = 0;for(i=0;i<HISTOGRAM_LENGTH;i++)distance += FLOAT32(sqrt(DOUBLE64(m_sTrackingObjectTable[m_cActiveObject].initHistogram[i]*histogram[i])));return(sqrt(1-distance));}//An alternative distance measurementFLOAT32 CObjectTracker::CompareHistogram(UBYTE8 (*histogram)){SINT16 i = 0;FLOAT32 distance = 0.0;FLOAT32 difference = 0.0;for (i=0;i<HISTOGRAM_LENGTH;i++){difference = FLOAT32(m_sTrackingObjectTable[m_cActiveObject].initHistogram[i]-histogram[i]);if (difference>0)distance += difference;elsedistance -= difference;}return(distance);}// Returns the edge insformation of a pixel at (x,y), assume a large jump of value around edge pixelsUBYTE8 CObjectTracker::CheckEdgeExistance(IplImage *r, IplImage *g, IplImage *b, SINT16 _x,SINT16 _y){UBYTE8 E = 0;SINT16 GrayCenter = 0;SINT16 GrayLeft = 0;SINT16 GrayRight = 0;SINT16 GrayUp = 0;SINT16 GrayDown = 0;// ULONG_32 pixelValues = 0;// pixelValues = GetPixelValues(frame,_x,_y);GrayCenter = SINT16(3*pixval8c( r, _y, _x )+6*pixval8c( g, _y, _x )+pixval8c( b, _y, _x ));if (_x>0){// pixelValues = GetPixelValues(frame,_x-1,_y);GrayLeft = SINT16(3*pixval8c( r, _y, _x-1 )+6*pixval8c( g, _y, _x-1 )+pixval8c( b, _y, _x-1 ));}if (_x < (m_nImageWidth-1)){// pixelValues = GetPixelValues(frame,_x+1,_y);GrayRight = SINT16(3*pixval8c( r, _y, _x+1 )+6*pixval8c( g, _y, _x+1 )+pixval8c( b, _y, _x+1 ));}if (_y>0){// pixelValues = GetPixelValues(frame,_x,_y-1);GrayUp = SINT16(3*pixval8c( r, _y-1, _x )+6*pixval8c( g, _y-1, _x )+pixval8c( b, _y-1, _x ));}if (_y<(m_nImageHeight-1)){// pixelValues = GetPixelValues(frame,_x,_y+1);GrayDown = SINT16(3*pixval8c( r, _y+1, _x )+6*pixval8c( g, _y+1, _x )+pixval8c( b, _y+1, _x ));}if (abs((GrayCenter-GrayLeft)/10)>EDGE_DETECT_TRESHOLD)E = 1;if (abs((GrayCenter-GrayRight)/10)>EDGE_DETECT_TRESHOLD)E = 1;if (abs((GrayCenter-GrayUp)/10)>EDGE_DETECT_TRESHOLD)E = 1;if (abs((GrayCenter-GrayDown)/10)>EDGE_DETECT_TRESHOLD)E = 1;return(E);}// Alpha blending: used to update initial histogram by the current histogramvoid CObjectTracker::UpdateInitialHistogram(UBYTE8 (*histogram)){SINT16 i = 0;for (i=0; i<HISTOGRAM_LENGTH; i++)m_sTrackingObjectTable[m_cActiveObject].initHistogram[i] = ALPHA*m_sTrackingObjectTable[m_cActiveObject].initHistogram[i]+(1-ALPHA)*histogram[i];}// Mean-shift iteration//frame: 图像//MeanShift迭代找出中心点void CObjectTracker::FindNextLocation(IplImage *frame){int i, j, opti, optj;SINT16 scale[3]={-3, 3, 0};FLOAT32 dist, optdist;SINT16 h, w, optX, optY;//try no-scalingFindNextFixScale(frame);optdist=LastDist;optX=m_sTrackingObjectTable[m_cActiveObject].X;optY=m_sTrackingObjectTable[m_cActiveObject].Y;//try one of the 9 possible scalingi=rand()*2/RAND_MAX;j=rand()*2/RAND_MAX;h=m_sTrackingObjectTable[m_cActiveObject].H;w=m_sTrackingObjectTable[m_cActiveObject].W;if(h+scale[i]>10 && w+scale[j]>10 && h+scale[i]<m_nImageHeight/2 && w+scale[j]<m_nImageWidth/2){m_sTrackingObjectTable[m_cActiveObject].H=h+2*scale[i];m_sTrackingObjectTable[m_cActiveObject].W=w+2*scale[j];FindNextFixScale(frame);if( (dist=LastDist) < optdist ) //scaling is better{optdist=dist;// printf("Next%f->\n", dist);}else //no scaling is better{m_sTrackingObjectTable[m_cActiveObject].X=optX;m_sTrackingObjectTable[m_cActiveObject].Y=optY;m_sTrackingObjectTable[m_cActiveObject].H=h;m_sTrackingObjectTable[m_cActiveObject].W=w;}};TotalDist+=optdist; //the latest distance// printf("\n");}void CObjectTracker::FindNextFixScale(IplImage *frame){UBYTE8 iteration = 0;SINT16 optX, optY;FLOAT32 *currentHistogram = new FLOAT32[HISTOGRAM_LENGTH];FLOAT32 dist, optdist=1.0;for (iteration=0; iteration<MEANSHIFT_ITARATION_NO; iteration++){FindHistogram(frame,currentHistogram); //current frame histogram, use the last frame location as starting pointFindWightsAndCOM(frame,currentHistogram);//derive weights and new location//FindHistogram(frame,currentHistogram); //uptade histogram//UpdateInitialHistogram(currentHistogram);//uptade initial histogramif( ((dist=FindDistance(currentHistogram)) < optdist) || iteration==0 ){optdist=dist;optX=m_sTrackingObjectTable[m_cActiveObject].X;optY=m_sTrackingObjectTable[m_cActiveObject].Y;// printf("%f->", dist);}else //bad iteration, then find a better start point for next iteration{m_sTrackingObjectTable[m_cActiveObject].X=(m_sTrackingObjectTable[m_cActiveObject].X+ optX)/2;m_sTrackingObjectTable[m_cActiveObject].Y=(m_sTrackingObjectTable[m_cActiveObject].Y+ optY)/2;}}//end form_sTrackingObjectTable[m_cActiveObject].X=optX; m_sTrackingObjectTable[m_cActiveObject].Y=optY; LastDist=optdist; //the latest distance// printf("\n");delete[] currentHistogram, currentHistogram = 0;}float CObjectTracker::GetTotalDist(void){return(TotalDist);}。

相关文档
最新文档