1、meanshift的基本思想

meanshift 背后的直觉很简单。考虑你有一组点。(它可以是像直方图反投影这样的像素分布)。您有一个小窗口(可能是一个圆圈),您必须将该窗口移动到最大像素密度(或最大点数)的区域。如下图所示:

2、meanshift的原理简述

均值偏移和模式发现技术,例如k-means 和高斯混合,将与每个像素相关联的特征向量(例如颜色和位置)建模为来自未知概率密度函数的样本,然后尝试在其中找到聚类(模式)分配。

例如下图a所示的彩色图像。您将如何仅根据颜色来分割此图像? 下图b显示了 L*u*v* 空间中的像素分布,这相当于忽略空间位置的视觉算法所看到的。为了使可视化更简单,我们只考虑 L*u* 坐标,如下图c 所示。你看到了多少明显(拉长的)簇? 您将如何寻找这些集群?

Mean-shift 图像分割 (a) 输入彩色图像; (b) 在 L*u*v* 空间中绘制的像素; (c) L*u* 空间分布; (d) 159 次均值偏移程序后的聚类结果; (e) 对应的轨迹,峰值标记为红点。

k-means和混合高斯技术使用密度函数的参数模型来回答这个问题,即他们假设密度是少量更简单分布(例如,高斯分布)的叠加,其位置 ( 中心)和形状(协方差)可以被估计。 另一方面,均值偏移平滑分布并找到其峰值以及对应于每个峰值的特征空间区域。 由于正在对完整密度进行建模,因此这种方法称为非参数方法。

均值偏移的关键是一种无需显式计算完整函数即可在高维数据分布中有效找到峰值的技术。 再次考虑上图c 中所示的数据点,可以认为它是从某个概率密度函数中提取的。 如果我们可以计算这个密度函数,如上图e 所示,我们可以找到它的主要峰值(模式),并将爬到同一峰值的输入空间区域识别为同一区域的一部分。这是分水岭算法的逆算法,它爬下山来寻找吸引盆地。

那么,第一个问题是如何在给定稀疏样本集的情况下估计密度函数。 最简单的方法之一是对数据进行平滑处理,例如,通过将其与宽度为 h 的固定内核进行卷积,这是密度估计的 Parzen 窗口方法。一旦我们计算了 f(x),如上图e 所示,我们可以使用梯度上升或其他一些优化技术找到它的局部最大值。

这种“蛮力”方法的问题在于,对于更高的维度,在整个搜索空间上评估 f(x) 变得难以计算。 相反,meanshift 使用了优化文献中称为多重重启梯度下降的变体。从对局部最大值 的一些猜测开始,它可以是一个随机输入数据点 ,均值偏移计算 处的密度估计 f(x) 的梯度,并在该方向上采取上坡步骤。

上图中显示的基于颜色的分割在确定最佳聚类时只考虑像素颜色。因此,它可能将碰巧具有相同颜色的小的孤立像素聚集在一起,这可能不对应于图像的语义上有意义的分割。通常可以通过在颜色和位置的联合域中进行聚类来获得更好的结果。在这种方法中,将图像的空间坐标 称为空间域,与颜色值 连接起来,称为距离域,并在该五维空间中应用均值偏移聚类空间 xj 。由于位置和颜色可能有不同的尺度,内核是单独调整的,就像双边滤波器内核一样。然而,meanshift和双边滤波的区别在于,在mean shift中,每个像素的空间坐标随着它的颜色值一起调整,这样像素就可以更快地向其他颜色相似的像素迁移,因此可以在以后用于聚类和细分。

3、meanshift的应用

均值偏移已应用于计算机视觉中的许多不同问题,包括人脸跟踪、2D 形状提取和纹理分割(Comaniciu 和 Meer2002)、立体匹配(Wei 和 Quan 2004)、非真实感渲染(第 10.5.2 节) (DeCarlo 和 Santella 2002)和视频编辑(第 10.4.5 节)(Wang, Bhat et al. 2005)。Paris 和 Durand (2007) 对此类应用以及更有效地解决均值问题的技术进行了很好的回顾。 移动方程和产生层次分割。

4、meanshift的opencv示例

参考代码

Mat srcImg1 = Cv2.ImRead(@"C://Users//Desktop//1.png");
Mat srcImg2 = Cv2.ImRead(@"C://Users//Desktop//2.png");Mat srcHSV1 = new Mat(), srcHSV2 = new Mat();
Cv2.CvtColor(srcImg1, srcHSV1, ColorConversionCodes.BGR2HSV);
Cv2.CvtColor(srcImg2, srcHSV2, ColorConversionCodes.BGR2HSV);Rect rect = new Rect(130, 120, 55, 55);
Mat imgROI = new Mat(srcHSV1, rect);
Cv2.Rectangle(srcImg1, rect, new Scalar(0, 0, 255));
Cv2.Rectangle(srcImg2, rect, new Scalar(0, 0, 255));Cv2.ImShow("srcImg1", srcImg1);
Cv2.ImWrite(@"C://Users//Desktop//srcImg1.png", srcImg1);int[] histSize = new int[1]{ 256 };
//float[] hranges = new float[1] { 0, 255 };
//float[] ranges = new float [1]{ hranges };
Rangef[] range = new Rangef[1];
range[0].Start = 0.0F;
range[0].End = 255.0F;
int[] channels = new int[1]{ 0 };Mat dstHist = new Mat();
Cv2.CalcHist(new Mat[1] { imgROI }, channels, new Mat(), dstHist, 1, histSize, range);
Cv2.Normalize(dstHist, dstHist, 0.0, 1.0, NormTypes.MinMax);Mat backprojection = new Mat();
Cv2.CalcBackProject(new Mat[1] { srcHSV2 }, channels, dstHist, backprojection, range);
Cv2.ImShow("backprojection", backprojection);
//Cv2.ImWrite("backproj.png", backprojection);
Cv2.ImWrite(@"C://Users//Desktop//backprojection.png", backprojection);TermCriteria criteria = new TermCriteria( CriteriaType.MaxIter & CriteriaType.Eps, 10, 0.01);
Cv2.MeanShift(backprojection, ref rect, criteria);//Meanshift会自动更新这个rect
Cv2.Rectangle(srcImg2, rect, new Scalar(0, 255, 0));
Cv2.ImShow("srcImg2", srcImg2);
Cv2.ImWrite(@"C://Users//Desktop//srcImg2.png", srcImg2);
//Cv2.ImWrite("srcImg2.png", srcImg2);

好的效果图如下:

不太好的效果图如下:

5、其它参考

基于MeanShift的目标跟踪算法、实现_马卫飞的博客-CSDN博客_meanshift目标跟踪算法

OpenCV2应用Meanshift查找相似物体_林多的博客-CSDN博客

OpenCV每日函数 对象追踪模块 Meanshift算法相关推荐

  1. OpenCV每日函数 计算摄影模块(1) 图像修复算法 inpaint函数

    一.概述 该算法使用区域邻域恢复图像中的选定区域.该功能可用于去除扫描照片上的灰尘和划痕,或去除静止图像或视频中不需要的物体. 二.inpaint函数 1.函数原型 void cv::inpaint ...

  2. OpenCV每日函数 计算摄影模块(5) 无缝克隆算法

    一.概述 借助无缝克隆算法,您可以从一张图像中复制一个对象,然后将其粘贴到另一张图像中,从而形成一个看起来无缝且自然的构图. 二.函数原型 给定一个原始彩色图像,可以无缝混合该图像的两个不同颜色版本. ...

  3. OpenCV每日函数 图像过滤模块 (8) GaussianBlur高斯模糊函数

    一.概述 使用高斯滤镜模糊图像.该函数将源图像与指定的高斯核进行卷积. 在图像处理中,高斯模糊(也称为高斯平滑)是通过高斯函数(以数学家和科学家卡尔弗里德里希高斯命名)对图像进行模糊处理的结果. 它是 ...

  4. OpenCV每日函数 几何图像变换模块 (8) remap函数

    一.概述 对图像应用通用几何变换.函数 remap 使用指定的映射转换源图像: 其中具有非整数坐标的像素值是使用一种可用的插值方法计算的. mapx 和 mapy 可以分别编码为 map1 和 map ...

  5. OpenCV每日函数 图像过滤模块 (6) erode腐蚀函数

    一.概述 使用特定的结构元素腐蚀图像.该函数使用指定的结构元素腐蚀源图像,该结构元素确定取最小值的像素邻域的形状: 侵蚀可以应用数次(迭代). 在多通道图像的情况下,每个通道都是独立处理的. 膨胀: ...

  6. OpenCV每日函数 几何图像变换模块 (7) linearPolar函数/logPolar函数/warpPolar函数

    一.概述 linearPolar函数将图像重新映射到极坐标空间,不过此函数已经废弃(实际在源码中也是调用了warpPolar函数),可以使用warpPolar函数替代. logPolar函数将图像重新 ...

  7. OpenCV每日函数 几何图像变换模块 (9) resize函数

    一.概述 调整图像大小.函数 resize 将图像 src 的大小缩小到或最大到指定的大小. 请注意,不考虑初始 dst 类型或大小. 相反,大小和类型是从 src.dsize.fx 和 fy 派生的 ...

  8. OpenCV每日函数 图像过滤模块 (5) dilate膨胀函数

    一.概述 通过使用特定的结构元素来扩大图像.该函数使用指定的结构元素扩展源图像,该结构元素确定取最大值的像素邻域的形状: 膨胀可以应用数次(迭代). 在多通道图像的情况下,每个通道都是独立处理的. 膨 ...

  9. OpenCV每日函数 几何图像变换模块 (1) convertMaps函数

    一.概述 将图像转换映射从一种表示转换为另一种表示.该函数将一对用于重映射的映射从一种表示转换为另一种表示. 支持以下选项( (map1.type(), map2.type()) → (dstmap1 ...

  10. OpenCV每日函数 图像过滤模块 (1) bilateralFilter函数(双边滤波)

    一.概述 过滤可能是图像处理和计算机视觉中最基本的操作.在术语"过滤"的最广义上,过滤图像在给定位置的值是输入图像在同一位置的小邻域中的值的函数. 例如,高斯低通滤波计算邻域中像素 ...

最新文章

  1. React 事件 4
  2. python学习之路二
  3. 智能车竞赛技术报告 | 智能车视觉 - 中原工学院 - 逐鹿 - 分母队
  4. Chrome浏览器Json查看插件JsonHandle下载以及无法安装插件的解决方法
  5. aelf帮助C#工程师10分钟零门槛搭建DAPP私有链开发环境
  6. MySql的用户权限
  7. $(function() {});和$(document).ready(function() {});区别
  8. FlasCC例子研究之bitmapdata
  9. 定时锁定计算机怎么设置方法,电脑定时锁屏怎么设置
  10. RTX(2009)整合注意点
  11. Python 之如何暴力破解加密文件
  12. 09-线程池与进程池
  13. css 超链接的颜色,css超链接字体颜色
  14. 人脸识别——基于CNN的模型实现
  15. 简体中文与繁体中文互转
  16. Jekyll基本用法
  17. excel 制作好看的图表
  18. 服务器正文15:Assert的使用技巧
  19. 金沙滩(kingst)单片机开发板左右流水灯作业
  20. 为什么TCP服务端需要调用bind函数而客户端通常不需要呢

热门文章

  1. 2008年上半年程序员考试上午真题自我汇总
  2. iOS 性能优化那些繁杂琐碎的事儿
  3. mysql双机热备份_MySQL双机热备份试验
  4. 线性表的链式存储结构及操作的实现
  5. Linux Command diff 文件比较
  6. window双网卡上网
  7. 从零开始实现Unity光照模型_02_为Shader添加简单的多光源支持_技术美术基础学习记录
  8. php php拼接字符串函数_PHP_PHP开发中常用的字符串操作函数,1,拼接字符串 拼接字符串是最 - phpStudy...
  9. wav怎么转换成mp3?
  10. DongTai--被动型IAST工具部署体验