Meanshift

Meanshift聚类

Meanshift(均值漂移)首先是个聚类算法,然后才应用到目标跟踪领域。它是Keinosuke Fukunaga和Larry D. Hostetler于1975年发明的。

Keinosuke Fukunaga,日本裔美国科学家,普渡大学教授。著有《Introduction to Statistical Pattern Recognition》一书。

我们首先来定义一下Mean Shift向量。

对于给定的d维空间RdRdR^d中的n个样本点xi,i=1,⋯,nxi,i=1,⋯,nx_i, i=1,\cdots , n,则对于x点,其Mean Shift向量的基本形式为:

Mh(x)=1k∑xi∈Sh(xi−x)Mh(x)=1k∑xi∈Sh(xi−x)

M_h\left ( x \right )=\frac{1}{k}\sum_{x_i\in S_h}\left ( x_i-x \right )

其中,ShShS_h指的是一个半径为h的高维球区域,如上图中的蓝色的圆形区域。ShShS_h的定义为:

Sh(x)=(y∣(y−x)(y−x)T⩽h2)Sh(x)=(y∣(y−x)(y−x)T⩽h2)

S_h\left ( x \right )=\left ( y\mid \left ( y-x \right )\left ( y-x \right )^T\leqslant h^2 \right )

从物理的角度来看,由于1k∑xi∈Shxi1k∑xi∈Shxi\frac{1}{k}\sum_{x_i\in S_h}x_i实际上是ShShS_h的质量中心,因此Mh(x)Mh(x)M_h\left ( x \right )实际上就是从x指向质心的向量,也被叫做归一化的概率密度梯度。所以,Meanshift聚类实际上是一种密度聚类。

下面来看一下Meanshift算法的具体步骤。

首先,在空间中任选一点x(上图中蓝色的圈),以x为圆心,h为半径做一个高维球(上图中蓝色的圆)。计算得到质心(上图中黄色的圈)。移动x到质心,并重复之前的步骤。最终x会收敛到最密集区域的质心。

基本的Mean Shift形式存在一个问题:在ShShS_h的区域内,每一个点对x的贡献是一样的。而实际上,这种贡献与x到每一个点之间的距离是相关的。同时,对于每一个样本,其重要程度也是不一样的。

到了1995年,Yizong Cheng(现为University of Cincinnati副教授)对基本的Mean Shift算法在以下两个方面做了推广。

首先,定义了一族核函数,使得随着样本与被偏移点的距离不同,其偏移量对均值偏移向量的贡献也不同。

其次,还设定了一个权重系数,使得不同的样本点重要性不一样,这大大扩大了Mean Shift的适用范围。

基于以上的考虑,可对基本的Mean Shift向量形式中增加核函数和样本权重,得到如下的改进的Mean Shift向量形式:

Mh(x)=∑ni=1GH(xi−x)w(xi)(xi−x)∑ni=1GH(xi−x)w(xi)Mh(x)=∑i=1nGH(xi−x)w(xi)(xi−x)∑i=1nGH(xi−x)w(xi)

M_h\left ( x \right )=\frac{\sum_{i=1}^{n}G_H\left ( x_i-x \right )w\left ( x_i \right )\left ( x_i-x \right )}{\sum_{i=1}^{n}G_H\left ( x_i-x \right )w\left ( x_i \right )}

其中:

GH(xi−x)=|H|−12G(H−12(xi−x))GH(xi−x)=|H|−12G(H−12(xi−x))

G_H\left ( x_i-x \right )=\left | H \right |^{-\frac{1}{2}}G\left ( H^{-\frac{1}{2}}\left ( x_i-x \right ) \right )

G(x)是一个单位的核函数。H是一个正定的对称d×d矩阵,称为带宽矩阵,其是一个对角阵。w(xi)⩾0w(xi)⩾0w\left ( x_i \right )\geqslant 0是每一个样本的权重。对角阵H的形式为:

H=⎛⎝⎜⎜⎜⎜⎜h210⋮00h22⋮0⋯⋯⋯00⋮h2d⎞⎠⎟⎟⎟⎟⎟d×dH=(h120⋯00h22⋯0⋮⋮⋮00⋯hd2)d×d

H=\begin{pmatrix} h_1^2 & 0 & \cdots & 0\\ 0 & h_2^2 & \cdots & 0\\ \vdots & \vdots & & \vdots \\ 0 & 0 & \cdots & h_d^2 \end{pmatrix}_{d\times d}

因此,上述Mean Shift向量也可以改写成:

Mh(x)=∑ni=1G(xi−xhi)w(xi)(xi−x)∑ni=1G(xi−xhi)w(xi)Mh(x)=∑i=1nG(xi−xhi)w(xi)(xi−x)∑i=1nG(xi−xhi)w(xi)

M_h\left ( x \right )=\frac{\sum_{i=1}^{n}G\left ( \frac{x_i-x}{h_i} \right )w\left ( x_i \right )\left ( x_i-x \right )}{\sum_{i=1}^{n}G\left ( \frac{x_i-x}{h_i} \right )w\left ( x_i \right )}

这里的核函数可以是Uniform核,也可以是Gaussian核。

参考:

https://wenku.baidu.com/view/5862334827d3240c8447ef40.html

meanshift算法简介

http://www.cnblogs.com/liqizhou/archive/2012/05/12/2497220.html

Meanshift,聚类算法

https://wenku.baidu.com/view/0d9eb876a417866fb84a8eb2.html

mean-shift算法概述

http://www.cnblogs.com/cfantaisie/archive/2011/06/10/2077188.html

meanshift聚类

https://blog.csdn.net/google19890102/article/details/51030884

Mean Shift聚类算法

反向投影图

在继续介绍Meanshift之前,我们先引入反向投影图的概念。

首先,我们对图像的像素值按照某种特征进行直方图统计,得到一组bin值。

然后,计算位置x上的bin值,并用该bin值替换原来的像素值,就得到了反向投影图。

参考:

https://blog.csdn.net/poiiy333/article/details/9051409

反向投影图

Meanshift与目标跟踪

由于RGB对光照的变化比较敏感,而这种敏感对目标跟踪而言是不利的。因此,通常我们要将图像转换到HSV颜色空间。

首先,统计目标box区域内H(色调)分量的直方图,并对其进行归一化,使得该直方图成为概率直方图。这一步相当于统计目标的颜色特征。

然后,使用统计得到的概率直方图,将全图转换为反向投影图,并应用Meanshift算法。由于前后两帧中目标通常不会隔的太远,原目标中心可能仍在目标范围内。因此,目标中心会向反向投影图中概率大的地方移动,从而达到了目标跟踪的效果。

总结:用meanshift进行跟踪最重要的一点是输入图像的把握,也就是要让它的迭代能越来越迭代到目标上。这种图像也不一定就是反向投影图,只要是一幅反映当前图像中每个像素点含有目标概率的图就可以了。反向投影图恰好就是这样的一幅图而已。

优点:

(1)算法计算量不大,在目标区域已知的情况下完全可以做到实时跟踪;

(2)采用核函数直方图模型,对边缘遮挡、目标旋转、变形和背景运动不敏感。

缺点:

(1)缺乏必要的模板更新;

(2)跟踪过程中由于窗口宽度大小保持不变,当目标尺度有所变化时,跟踪就会失败;

(3)当目标速度较快时,跟踪效果不好;

(4)直方图特征在目标颜色特征描述方面略显匮乏,缺少空间信息;

参考:

https://blog.csdn.net/li_dongxuan/article/details/70667170

目标跟踪:Meanshift, Camshift

http://www.cnblogs.com/cfantaisie/archive/2011/06/10/2077190.html

meanshift目标跟踪算法总结

https://blog.csdn.net/jinshengtao/article/details/30258833

基于MeanShift的目标跟踪算法及实现

Meanshift与图像分割

除此之外,mean shift还可以用于图像分割。

如上图所示,算法过程可分三步走:模点搜索/图像平滑、模点聚类/合并相似区域、兼并小区域(可选)。

模点搜索是为了找到每个数据点的到类中心,以中心的颜色代替自己的颜色,从而平滑图像。

但模点搜索得到的模点太多,并且很多模点挨得很近,若果将每个模点都作为一类的话,类别太多,容易产生过分割,即分割太细,所以要合并掉一些模点,也就是合并相似区域。

模点聚类后所得到的分割区域中,有些区域所包含的像素点太少,这些小区域也不是我们想要的,需要再次合并。

参考:

https://blog.csdn.net/ttransposition/article/details/38514127

mean shift图像分割

Camshift

Camshift算法是Continuously Adaptive Mean Shift algorithm的简称。它是一个基于MeanSift的改进算法。它首次由Gary R.Bradski等人提出和应用在人脸的跟踪上,并取得了不错的效果。

由于Meanshift在跟踪中搜索框的大小一直不变,对目标的尺度变化不具有鲁棒性。Camshift针对此点设计了自适应算法用于调整窗口的大小。该方法共有两步:

扩大:在计算窗口大小前,在MeanShift算出的窗口的四个方向上增大了TOLERANCE,即高和宽都增大了2TOLERANCE(此值自己调整设置)。

缩小:在扩大的窗口内重新计算0阶矩,1阶矩和2阶矩,利用矩的值重新计算高和宽。

缺点:

(1)只利用颜色统计做的跟踪,在背景有相似颜色时,会出现跟踪错误的情况。

(2)不能做多目标跟踪。

(3)由于它只在初始位置(而不是从每个像素点)开始迭代,所以有可能在初始位置错了后,收敛的位置还是原位置(即跟丢了后,可能会找不回来)。

参考:

http://blog.sina.com.cn/s/blog_5d1476580101a57j.html

Camshift算法

http://blog.163.com/thomaskjh@126/blog/static/370829982010113133152722/

CAMSHIFT原理

https://wenku.baidu.com/view/59596ac42cc58bd63186bd37.html

Camshift算法原理

Optical flow

基本概念

从本质上说,光流就是你在这个运动着的世界里感觉到的明显的视觉运动。例如,当你坐在火车上,然后往窗外看。你可以看到树、地面、建筑等等,他们都在往后退。这个运动就是光流。

一些比较远的目标,例如云、山,它们移动很慢,感觉就像静止一样。但一些离得比较近的物体,例如建筑和树,就比较快的往后退,然后离我们的距离越近,它们往后退的速度越快。可以通过不同目标的光流运动速度判断它们与我们的距离。

光流除了提供远近外,还可以提供角度信息。与咱们的眼睛正对着的方向成90度方向运动的物体速度要比其他角度的快。

以上是光流的一个直观的定义和特性,下面谈一下它的严谨的研究性定义。

光流的概念是Gibson在1950年首先提出来的。它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。

当人的眼睛观察运动物体时,物体的景象在人眼的视网膜上形成一系列连续变化的图像,这一系列连续变化的信息不断“流过”视网膜(即图像平面),好像一种光的“流”,故称之为光流(optical flow)。光流表达了图像的变化,由于它包含了目标运动的信息,因此可被观察者用来确定目标的运动情况。

研究光流场的目的就是为了从图片序列中近似得到不能直接得到的运动场。运动场(motion field),其实就是物体在三维真实世界中的运动;光流场,是运动场在二维图像平面上(人的眼睛或者摄像头)的投影。

光流约束方程

1981年,Horn和Schunck创造性地将二维速度场与灰度相联系,引入光流约束方程,得到光流计算的基本算法。人们基于不同的理论基础提出各种光流计算方法,算法性能各有不同。Barron等人对多种光流计算技术进行了总结,按照理论基础与数学方法的区别把它们分成四种:基于梯度的方法、基于匹配的方法、基于能量的方法、基于相位的方法。近年来神经动力学方法也颇受学者重视。

图像处理理论(八)——Meanshift, Camshift, Optical flow相关推荐

  1. HALCON:Optical Flow(光流法)

    HALCON:Optical Flow(光流法) 光流法基本原理 光流概念由Gibson在1950年首先提出来,它是一种简单实用的图像运动表达方式,通常定义为一个图像序列中图像亮度模式的表观运动,即空 ...

  2. 光流法 Optical Flow

    最近调研目标跟踪,看到一个光流法,测试了一下它的效果,挺好玩的,这里对找到的资料简单整理总结一下. 对于光流法的介绍,可以参看如下博客http://blog.csdn.net/zouxy09/arti ...

  3. 图像处理理论(五)——SIFT

    SIFT 概述 SIFT算法是CV领域在DL进入之前的20年中,最重要的成果. 尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来 ...

  4. matlab opticalflowlk,Optical Flow介绍与代码实现

    Optical Flow介绍与代码实现 介绍 首先我们先来介绍一下Optical Flow是个什么东西, 在浏览器的搜索框框里面我们输入"Optical flow"可以看到维基百科 ...

  5. Python+OpenCV:Optical Flow(光流)

    Python+OpenCV:Optical Flow(光流) 理论 Optical flow is the pattern of apparent motion of image objects be ...

  6. 【光流评估】《Optical Flow Estimation using a Spatial Pyramid Network》2016 Tubingen, Germany

    摘要:我们通过结合深度学习和经典空间金字塔结构的方式来计算光流.通过使用每个金字塔级别的光流评估warp图像和更新光流,这种方法以一个粗到精的方式评估图像中的大运动.不同于在每个金字塔层级最小化对象函 ...

  7. 论文阅读:FlowNet 2.0: Evolution of Optical Flow Estimation with Deep Networks

    文章目录 1. 论文总述 2. 利用CNN预测光流的另一种思路 3. 通过堆叠网络来进行光流估计优化的idea来源 4. FlyingThings3D (Things3D) dataset 5. Th ...

  8. 【入门向】光流法(optical flow)基本原理+深度学习中的应用【FlowNet】【RAFT】

    目录 1. 理论背景 1.1 光流 1.2 光流场 2. 基本原理 2.1 假设条件 2.2 约束方程 3. 光流估计方法 3.1 思路概述 3.2 优缺点对比 4. 稠密光流和稀疏光流 4.1 稠密 ...

  9. 光流法(optical flow)简介

    转载自:https://blog.csdn.net/qq_41368247/article/details/82562165 光流法理论背景 1.什么是光流 光流(optical flow)是空间运动 ...

最新文章

  1. 孪生素数 java代码_科学网—孪生素数猜想——利用 Java + 正则表达式 输出孪生素数对 - 马廷灿的博文...
  2. Linux route命令详解和使用示例(查看和操作IP路由表)
  3. Day18 (二)反射
  4. 安装Ubuntu 出现 SQUASFS error / sd 8:0:0:0 :[sdb] assuming drive cache:write through
  5. android 9.x 实现应用内更新安装
  6. python与C、C++混编的四种方式
  7. 希望我不会“伤心至死”
  8. 语法分析器c语言 递归子程序,RecursiveSubroutine
  9. Python-OpenCV 处理图像(一):基本操作 cv2
  10. OutLook 2010 (Bata) 中的邮件导出功能
  11. [Swift]LeetCode1051.高度检查器 | Height Checker
  12. python3语法学习第四天--字符串
  13. 微信小程序踩坑(1):wx.showModal模态对话框中content换行
  14. 解决表格td宽度设置失效问题
  15. 3款简单实用的在线PCR引物设计软件
  16. [012计算机网络系列] | Cisco packet 怎样清空一台PC的ARP Table?
  17. EChart如何实现中国地图和省份下钻
  18. C#酒店客房管理系统设计与实现
  19. 读《因果的真相》第四章摘抄笔记
  20. 内网端口映射软件之80端口映射全端口映射

热门文章

  1. 最新web 2.0 配色 (一)
  2. 将截断字符串或二进制数据
  3. linux lighttpd php,Ubuntu下搭建Lighttpd+PHP+MySQL环境
  4. h5网页在移动端(安卓)head里的title为空,默认显示url地址。js代码将head的title设置为空
  5. Java更改中文_Java中文编程开发,让Java编写更改复杂
  6. JQuery选择器中的属性筛选
  7. js基本数据类型和复杂数据类型的区别
  8. linux定时备份mysql数据库文件脚本
  9. JAVA爬虫Jsoup,抓取房价
  10. idea中Java项目连接服务器进行debug查看