mean shift 图像分割(二)

article/2025/8/22 23:12:09

Reference:

[1] Mean shift: A robust approach toward feature space analysis, PAMI, 2002

[2] mean shift,非常好的ppt 百度文库链接

[3] Pattern Recognition and Machine Learning, Bishop, 2006,Sec 2.5

[4] Computer Vision Algorithms and Applications, Richard Szeliski, 2010, Sec 5.3

[5] Kernel smoothing,MP Wand, MC Jones ,1994, Chapter 4


mean shift 图像分割 (一)1 总体思想,2 算法步骤

mean shift 图像分割 (二): 3 算法原理,4 延伸

mean shift 图像分割 (三): 5 非参数密度估计

图像分割—mean shift(OpenCV源码注解)



3 算法原理

3.1 密度估计

    关于密度估计,这里直接使用结论,具体原理,参见第5部分:非参数密度估计。

某一点的密度估计值:

    为核函数,一般我们会使用径向对称(radially symmetric)核函数。即:

    其中为标准化常数,使得

    称为的profile,原文介绍了两种,对应两种核,这里再补充一种。

    (1)Epanechnikov Kernel

    它的profile如下:

可视化效果

    (2)Normal Kernel

    它的profile如下:

可视化效果

    (3)Uniform Kernel

    它的profile如下:

可视化效果

    3.2密度梯度估计

    3.2.1 梯度方向

    处的密度估计:

    则密度梯度估计:

    ,即这一部分又可以看成是一个核密度估计。

    物理意义梯度方向是各个数据点的方向向量的加权求平均,即上式可以看成

蓝色圈圈—>到黄色圈圈

    例如,我们使用的是Normal Kernel,则

    想象一下几十匹马同时拉一辆车的恢宏场面,每匹马都往自己的方向拉,不过,距离越近的马,其力量越大,初中物理告诉我们,结果是合力的方向,如上图的黄色箭头。

    注意:Epanechnikov Kernel求导后实质上就是Uniform Kernel。

    3.2.2 漫漫爬坡路

    虽然,往哪个方向移动知道了,但是移动的步长并不好确定,下面转化一下形式,可以得到自适应步长:

    看起来有点复杂,实际上只是简单的替换。其中类比类比

    中间项的物理意义处的核的密度估计,求导所得,如果用Normal Kernel,则的形式和相同。

    中间项只是一个数,而最后一项就是所谓的mean shift向量,是一个方向向量,对应的就是我们的梯度方向。

    对于某一点往梯度方向移动到,则新坐标:

    物理意义:很直观,以为权值计算重心。

    时,我们就到达了模点,由于,所以只能是。不过想要一步登天,很难,除非你出生很好,就落在模点,大多数数据点,还是得老老实实,一步一个脚印爬上去。还是设爬过的脚印依次,则脚印公式:

    

    3.3.3 自适应步长

    可以看出步长成反比,还是以Normal Kernel为例,越靠近模点,步长越小,反之越大。

    原文证明了,只要是凸函数,单调递减(可以不是哦),那么就能保证它总能收敛到模点,并且是单调递增的(我没看……)。只要步履不停,我们总会遇见,多么美好的世界啊,求遇见。

    3.3 图像分割领域的具体化

    本质上,mean shift解决任何问题,都是转化成密度估计问题。但具体问题还得具体分析。对于图像它有两种信息,坐标和颜色,前者为spatial 空间后者为range空间,对于单通道图片即灰度值,对于彩色图片即或者效果更好的等。二者是截然不同的属性,决定了不能等同视之。因此,我们使用多元核密度估计(multivariate kernel)。设spatial有2维,range空间,设为维。

    一元核:

    

    图像分割中使用的多元核:

 

滤波的结果

    物理意义分别为坐标空间核和颜色空间核的带宽(bandwidth)/尺度,我说不清,看结果吧。

    3.4回首OpenCV实现

    第二步,重心计算公式

    我们是对以为中心为边长的区域求重心,其实本应该是:

    用的是Uniform Kernel,也就是说用的是Epanechnikov Kernel

    此时,距离筛选是由核函数实现的,因此我们是对图像中所有的数据点计算重心,而不是落在为中心,为边长的区域内的点求重心。

    OpenCV的实现中, 并不是圆形的,为了循环时程序实现的方便,就用方形近似,但是严格的球体。

    不过方形的也可以写成核函数形式:

    此外,Normal Kernel 的平滑效果固然好,但是计算量大,所以主要还是用Uniform Kernel。原文说大部分场合,Uniform Kernel和Normal Kernel就能取得很好的效果。

    4延伸

    不写了,已经写得太多了……这次就只挖个坑,日后再跳

    Camshift

能够自动调整窗口的大小,能适应目标尺度变化的情况,比如人脸跟踪时,人与摄像头的距离动态变化的情况。

    带宽选择

    图像分割的带宽一般是自己调整看效果,最优带宽也能也求出来?不过,我倒想看看自适应带宽。最优带宽值看原文吧。

    Mode prune

    对于鞍点等会产生一些虚假的模点,如上图,红色线上的点可能就跑到鞍点去了,去除办法:将模点的坐标稍作移动,再从移动后的位置继续爬,如果还能爬到原来模点的位置,那就保留,否则踢掉。恩,是你的跑不了,不是你的撒手就跑。

    与双边滤波的关联

    可以看做死板的mean shift 参见[4]的5.2.1

    与分水岭分割

    逆过程,从山峰开始找山谷,参见[4]的Sec5.2.1

    补充阅读

    图像分割加速:原文提到了一种加速方法,先随机选取一部分点作为先头部队,让它们去找模点,找的过程中就会开辟出很多到模点的道路,然后呢,让其余的点插到离它最近的路走过去就好了。此外,还有层级分割的方法,OpenCV的实现应该就是其中一种实现。

    A topological approach to hierarchical segmentation using mean shift. CVPR 2007

    目标跟踪:Kernel-Based Object Tracking, PAMI 03


http://chatgpt.dhexx.cn/article/HqD1S6a7.shtml

相关文章

GrabCut in One Cut(基于图割算法grabcut的一次快速图像分割的OpenCV实现)----目前效果最好的图割

 One cut in grabcut(grabcut算法的非迭代实现?) 本文针对交互式图像分割中的图割算法,主要想翻译一篇英文文献。不足之处请大家指正。 这是博主近期看到的效果最好,实现最简单,运…

mean shift 图像分割 (一)

mean shift 图像分割 Reference: [1] Mean shift: A robust approach toward feature space analysis, PAMI, 2002 [2] mean shift,非常好的ppt ,百度文库链接 [3] Pattern Recognition and Machine Learning, Bishop, 2006,Sec 2.5 [4] Computer Vision…

【图像处理】图像分割之(一~四)GraphCut,GrabCut函数使用和源码解读(OpenCV)

图像分割之(一)概述 http://blog.csdn.net/zouxy09 所谓图像分割指的是根据灰度、颜色、纹理和形状等特征把图像划分成若干互不交迭的区域,并使这些特征在同一区域内呈现出相似性,而在不同区域间呈现出明显的差异性。我们先对目前…

Mac 安装使用 OpenCV 图像处理神器

大家好,我是青空。 最近在折腾图像处理相关的事情,今天就给大家分享一下,Mac 上如何安装和使用 OpenCV。 安装 方法一 使用homebrew安装 其实 Mac 上安装 OpenCV 很简单,一个命令行就能搞定。 brew install opencv等待完成即…

sec和asec--正割和反正割函数

【功能简介】求变量的正割和反正割。 【语法格式】 1.Ysec (X) 计算X的正割,sec(x)1/cos(x)。X可以为向量、矩阵或多维数组,X中的元素可以为复数,所有表示角度的变量都采用弧度来表示。 2.Yasec (X) 计算X的反正割。对…

Graph Cut(图割算法)

转载自:http://blog.csdn.net/zouxy09/article/details/8532111 Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背景分割(Image segmentation)、立体视觉(stereo vision)、抠…

sech和asech--双曲正割和反双曲正割函数

【功能简介】求变量的双曲正割和反双曲正割。 【语法格式】 1.Ysech(X) 计算X的双曲正割,sech(x)1/cosh(x)。X可以为向量、矩阵或多维数组,X中的元素可以为复数,所有表示角度的变量都采用弧度来表示。 2.Yasech (X) 计…

三角函数中的正弦、余弦、正切、余切、正割、余割函数性质及常用公式

三角函数 三角函数包括正弦、余弦、正切、余切、正割、余割函数 0 基础知识 正弦(Sine):sin A CB/CA 余弦(Cosine) :cos A AB/CA 正切(Tangent):tan A CB/BA 余切&a…

数学 三角函数 sin 正弦、cos 余弦、tan 正切、cot 余切、sec 正割、csc 余割 简介

目录 图解定义 文字定义 三角函数诱导公式 1.三角函数诱导公式记忆方法 2.三角函数诱导公式 诱导公式一:终边相同的角的同一三角函数的值相等 诱导公式二:πα的三角函数值与α的三角函数值之间的关系 诱导公式三:任意角α与-α的三角…

sinx、cscx、cosx、secx以及tanx、cotx图像详解

今天在复习三角函数一章中对正切正割等图像感觉比较有意思,仔细梳理了以下内容: sin:sine cos:cosine sec:secant csc:cosecant 首先明确定义:让我们解释一下sec(x)和cos(x)之间的关系。sec(x)是…

正割函数(sec)

1. 定义 正割与余弦互为倒数,余割与正弦互为倒数。即: ⎧⎩⎨⎪⎪⎪⎪secθ1cosθcscθ1sinθ \left\{ \begin{split}\secθ=\frac1{\cosθ} \\\cscθ=\frac1{\sinθ} \end{split} \right.也即在几何上,设 △ABC ,∠C90&#xff…

printf 输出格式、域宽

printf: 函数原型:int printf("格式控制串",输出表); 返回值:成功则返回输出的字节数(按终端统计) 格式控制符: %d ---- 有符号的十进制整型数 %u ---- 无符号的十进制整型数 %hd --- short …

C语言之printf输出各种格式

基础的东西总是很容易忘,要经常回顾: printf函数调用的一般形式为: printf(“格式控制字符串”, 输出表列) 其中格式控制字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串&#xf…

C语言scanf怎么输入字母,C语言scanf输入格式printf输出格式

1. 转化说明符 %a(%A)浮点数,十六进制数字和p-(P-)表示法(C99)%c个字符 %d个有符号十进制整数 %f浮点数(包括浮点数和doulbe)%e(%E)浮点指数输出[e-(E-)表示法]%g(%G)浮点数不显示无意义的零“ 0”“ %i有符号十进制整数(与%d相同)%u无符号十进制整数 %o八进制整…

matlab printf格式化输出,如何使用 printf 来格式化输出

当我开始学习 Unix 时,我很早就接触到了 echo 命令。同样,我最初的 Python 课程也涉及到了 print 函数。再想起学习 C++ 和 Java 时学到 cout 和 systemout。似乎每种语言都骄傲地宣称拥有一种方便的单行输出方法,并生怕这种方式要过时一样宣传它。 但是当我翻开中级教程的第…

printf输出格式

1.printf()简介 printf()是C语言标准库函数,用于将格式化后的字符串输出到标准输出。标准输出,即标准输出文件,对应终端的屏幕。printf()申明于头文件stdio.h。 函数原型: int printf ( const char * format, ... );1 返回值&…

【Python笔记】SciPy的统计模块:scipy.stats

【Python笔记】NumPy数组 【DA】数据可视化matplotlib 【Python笔记】pandas常用函数图码总结 SciPy的统计模块是scipy.stats,其中有一个类是连续分布的实现,一个类是离散分布的实现。此外,该模块中还有很多用于统计检验的函数。 # 导入包 f…

使用scipy.signal函数进行信号滤波

目录 1、scipy.signal.filtfilt()函数介绍2、滤波器构造函数(巴特沃斯滤波器)3、如何进行高通、低通、带通、带阻滤波 1、scipy.signal.filtfilt()函数介绍 在信号的滤波过程中,因为scipy.signal.filtfilt()函数可以方便快捷得实现常见的多种滤波功能,所…

SciPy简单应用

SciPy简单应用 SciPy是在NumPy的基础上增加了大量用于数学计算,科学计算以及工程计算的模块,包括线性代数,常微分方程求解,信号处理,图像处理于稀疏矩阵等。参考文档 目录 SciPy简单应用文件输入/输出:scip…

使用scipy来进行曲线拟合

导读 曲线拟合的应用在生活中随处可见,不知道大家是否还记得物理实验中的自由落体运动中下降高度与时间关系之间的探究,在初速度为0的情况下,我们想要探究下降高度与时间的关系。 我们当时采用的方法是通过设置不同的下降时间来记录下降的高…