mean shift 图像分割(三)

article/2025/8/22 21:25:11

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源码注解)


5 非参数密度估计

    这一部分说明为什么处的密度估计

    其实,我觉得看bishop的那本书[2]就可以了,行云流水,精彩绝伦,其实,这本书的大部分内容都是如此精彩。我是按自己的理解写的,有些地方有改动,也会有错误,望各位看官指正。

    如果产生数据的分布形式已知,参数也已知,那么概率密度函数PDF已知,可以直接计算每一点的概率密度,比如高斯分布。如果参数不知道,那么也可以用数据估计参数,比如最小二乘估计,最大似然估计,贝叶斯参数估计等,如果连产生数据的分布形式都不知道,怎么办求概率密度呢?这就是一个非参数问题了,方法:让数据说话。

    5.1 猜一下

    对于上图中2维的情况,要估计蓝色圆域的概率密度,我相信大多数人都能凭直觉想到一种方法,那就用蓝色圈圈内的数据点个数,除以总的数据点个数,即。如果圆圈足够小,那么蓝色圈圈内部的概率密度就可以看成近似相等,那么蓝色点的概率密度应该是,是蓝色圈圈的面积。当然,也可以推广到维空间。这种算法,虽然直观,但缺乏理论支撑,下面证明,大伙的确猜对了。

    5.2理论推导

    首先说下,为什么可以用估计。

    是一个维的数据,密度函数为,则空间中的一个区域的概率密度,即数据点落在区域的概率:

    现在假设,依据某种未知概率分布得到了N个数据点(非参数并不是无法参数化,理论上任何分布都可以参数化,毕达哥拉斯说"万物皆数",只是参数无限维,只能当做非参数处理),则落在中的点的个数可能是,是否落在区域中就是一个二项分布:

    二项分布的期望:

    

    二项分布的方差:

    

    时,,从参数估计角度说,前者说明的无偏估计,后者说明的一致估计。总之,说明,是一个很好的估计量。

    因此,

    进一步假设,比较小,那么内的可近似相等,于是:

    的体积

    

    注意:是有偏估计,下面再说。

    由此推出,估计,有两种方法,第一种是固定的数目,这就是kernel估计的本质(个人认为,直方图估计,Parzen windows 也是)。另外一种方法是固定看包含个数据点所需要的体积,这就是K最近邻估计。

    5.3直方图密度估计

    将数据范围划分为若干个宽度为的小栅格(bin)(也可以不等长哦),然后统计落在每个区间内的数据点个数,那么,每个区间的密度,为整个数据范围内的数据点个数。

    这个方法有很多缺陷:

    (1)第一个bin起始位置的选择会影响到结果(与bin的个数无关)

    (2)估计出来的概率密度有好多毛刺,不是连续光滑的曲线。

    (3)适合一两维的情况。维是需要的bin个数为(假设每一维都需要划分成个bin),而且大多数bin的值为0,造成维度灾难(Curse of dimensionality)

    此外,对的大小特别敏感,小了,过拟合,不光滑,大了,太光滑,不过这是参数估计的普遍现象,前面提到的也是如此。

    5.4 K近邻密度估计(K-nearest neighboursKNN

    上面已经提过,,固定,看需要多大的

    这里我们用KNN密度估计+贝叶斯 推导下KNN分类器的原理。至于怎么分类的,很简单,如果不知道的话,哈哈,看我以前写的KNN (Related部分)。

    样本属于哪一类就看它属于哪一类的可能性最大,即:

    很简单,基本的先验概率转后验概率:

    利用上面的结论,则

    

    所以,比较属于哪一类时,很公正,先在训练集中找K个最近的数据点,哪一类人多势众,测试样本就属于哪一类。

3类的情况

    5.5 核密度估计(kernel density estimation, KDE

    5.5.1 Parzen windows

    点处的密度估计值,为落在以为中心的超球体的数据点个数。这与我们最开始猜测时的思想一致,只不过将超球体,换成超立方体。下面用数学符号形式化表示一下:

    好了,我们用核函数的形式表示了,这里为总的样本数。这种方法本质上和直方图方法没有太大的区别,Parzen windows方法是以数据点为中心,而直方图是我们自己固定好的点为中心。因此,它也会有直方图的一些缺点。比如估计的概率密度不是连续,维度灾难。

    5.5.2 Kernel smoothing

    很自然的,如果利用的数据量越大,估计出来的值就会越好,因为,我们综合的信息越多,于是我们使用所有数据点估计。采用所有样本估计的话,自然得要用加权的方法,越靠近估计点的数据点权重越大,反之,越是远离数据点,权重越小。

    前面已经介绍过具有这样属性的两种核函数。Epanechnikov Kernel和 Normal Kernel。我们可以直接替换掉,则:

    由于这两个核函数都是径向对称(radially symmetric),所以稍作了变化。

一开始,我并不理解为什么可以这么做,因为这样就已经不是窗口内的数据点个数,而是所有数据点都参合进来了,意义已经不一样了。后面我们可以通过求它的期望来进一步说明。

此外,bishop说,这个式子既可以看成,只有一个以为中心的窗口,也可以看成个以为中心的窗口,后一种介绍,我一直理解不了,但是,原文都是而不是,所以应该是第二种解释,才会这样写,我觉得第一种解释挺好,所以我都换过来了。

比如,我们使用高斯核,就有:

    注意:在靠近左边/右边的估计值有很大偏差,这是因为数据不对称,所以主要以右边/左边的数据为主,如果是回归就不会参数这种现象了。

    下面啰嗦一下上式中的

    ,所以。至于为什么要保证,下面就会知道了。

现在看看估计值的期望

    我们先做一次变量替换,

    假设足够光滑,各阶导数都存在,我们在对泰勒展开一下:

    这里只推导1维的情况,维太复杂了……

    注意:无穷小项直接被我忽略了。

    第一项当然希望等于,于是我们就希望,得到第一个条件。不过,对于模式搜索来说,都可以,只要不影响到我们比较大小就好。

    第二项,等于0最好,所以我们希望

    第三项,不能发散,所以还得满足第三个条件:,原文还提到一个条件:,这个条件怎么来的,还没想清楚,很多论文也不提这个条件。

    显然这是一个有偏估计,偏差为

    方差:

    因此,要使得期望很小,则要很小,要使方差很小则要很大。

    书上的多维推导过程,复杂,矩阵知识严重不够用。

    其中:,为了简便,我上面都是(图像分割中,一般也是如此),用来控制核函数的形状和方向,比如我们可以将高斯核改成椭圆形状。

    这里岔开一下,扯一扯目标检测。比如我们要检测图像中的椭圆形物体,用两高斯核作差,得到一个DoG(类似于墨西哥草帽),让它和图像卷积。控制它的形状和方向就能使得特定形状和方向的目标的响应值最大(和卷积核越像的区域其滤波响应值越大),从而能得到一张该目标在任何一点出现的概率图。接下来用mean shift 作模点搜索,这应该就是mean shift用于目标检测的基本原理吧,待验证。

    记录几个公式:

    ,是方阵

    ,是缩写……

    

    5.5.3直方图估计的kernel 平滑版

    参见:《Density Estimation》 Simon J. Sheather, Statistical Science 2004

    木有仔细看……

    如果假设数据服从正态分布,那么就有最优带宽,还有好多种……

    normal reference bandwidth:

    oversmoothed bandwidth

    数据的标准差,

    :数据的个数,但是我以前看《Fast Object Detection with Entropy-Driven Evaluation》源码,用的是, 它的并不是指实际的数据,它是去掉重复后的数据,但是它论文上还是说就是样本的数目,为什么呢?

    这个用得比较多,我截取了这篇论文的部分代码,做了个小实验,……


matlab代码

       close allri=round (randn(500,1)*100+50);nb_UniQueD=numel(unique(ri));minScore = min(ri(:))-1;maxScore = max(ri(:))+1;scoreStd = std(ri);sigma = 1.44 * scoreStd * nb_UniQueD^(-1/5); % not the number of sample
%         sigma = 1.06 * scoreStd * numel(ri)^(-1/5); % not the number of samplenumBins  = min(256,10*nb_UniQueD/2);Sp = linspace(minScore, maxScore, numBins+1);% need to add oneH  = histc(ri, Sp);% normalize by number of samplesHraw = H / sum(H);figure, subplot(211);bar(Hraw);title('histogram estimation')% discretization factordiscrFactor = (maxScore - minScore) / numBins;kerSize = round(5 * sigma / discrFactor);if kerSize(1) < 3kerSize(1) = 3.0;endkerSize = double(kerSize);% apply parzen window, kernel size such that it gets to 2 sigmaK = fspecial('gaussian', [kerSize 1], double(sigma/discrFactor) );H = conv( Hraw, K, 'same' );H = H + 1e-10;H = H ./sum(H);subplot(212),bar(H);title('after smooth')




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

相关文章

mean shift 图像分割(一、二、三)

MeanShift图像分割算法&#xff1a;大概是将复杂的背景&#xff0c;通过粗化提取整体信息&#xff0c;进而将图像分割。 接下来我想&#xff0c;将会抽出一部分时间&#xff0c;研究一下这个算法&#xff0c;以最终实现手势形状提取。 《Mean Shift: A Robust Approach Towar…

OpenCV在图像上画正弦曲线(c++)

写在前面&#xff1a;欢迎来到「湫歌」的博客。我是秋秋&#xff0c;一名普通的在校大学生。在学习之余&#xff0c;用博客来记录我学习过程中的点点滴滴&#xff0c;也希望我的博客能够更给同样热爱学习热爱技术的你们带来收获&#xff01;希望大家多多关照&#xff0c;我们一…

基于mean shift的图像分割

1 mean shift算法 Mean Shift 这个概念最早是由Fukunaga 等人[1]于1975 年在一篇关于概率密度梯度函数的估计中提出来的,其最初含义正如其名,就是偏移的均值向量,在这里Mean Shift 是一个名词,它指代的是一个向量,但随着Mean Shift 理论的发展,Mean Shift 的含义也发生了变化,如…

OpenCV对图像进行切边

1、概述 案例&#xff1a;使用OpenCV对旋转图片及正常图片进行切边。 A&#xff1a;对正常图片切边的步骤 1.加载图像 2.对图像进行灰度化 3.边缘检测 4.轮廓发现 5.找出符合目标的最大外接矩形&#xff0c;并使用矩形的四个坐标点绘制线 6.根据找到Rect在原图上切除ROI区域 7.…

双曲正割matlab求解

&#xff0c;取N305&#xff0c;且x在区间内按照5等分取值。 matlab中对于双曲正割函数可以直接用sech求解&#xff0c;自己编代码的过程永远无法逃避&#xff0c;&#xff0c;因为这个有现成的&#xff0c;那个可能没有&#xff0c;遇到棘手复杂的任务&#xff0c;全靠现成调包…

MATLAB:图像裁切(imcrop函数)

对图像进行裁切可用imcrop函数&#xff0c;实现过程如下&#xff1a; close all; %关闭当前所有图形窗口&#xff0c;清空工作空间变量&#xff0c;清除工作空间所有变量 clear all; clc; [A,map]imread(peppers.png); %读入图像 rect[75 68 130 112]; …

matlab关于图像切割的一些总结:imcrop,getrect,ndgrid,函数

之前查看这么多人写的博客&#xff0c;乱七八糟的&#xff0c;说法不一还有些有错误&#xff0c;误导人。现在记下来&#xff0c;希望给后来人一点指引。 1.imcrop函数 这个函数是 imcrop的第一二元素代表左上角的横纵坐标&#xff0c;第三四元素代表矩行框的宽高 pic imre…

代码实现数学图形之常用函数,幂,对数,指数,正弦,余弦,正切,余切,反正弦,反余弦,反正切,反余切,双曲正弦,双曲余弦,双曲正切,双曲余切,正割函数,余割函数,双曲正割,双曲正割.

(1)幂函数 X的N次幂. 按 CtrlC 复制代码 按 CtrlC 复制代码 脚本代码中X,N都为变量,两个变量会生成一个二维数据,得到一个平面图形.pow_sign是一个保留正负号的pow函数,其C实现为: static float yf_pow_sign(float a, float b) {float s yf_sign(a);a ::fabsf(a);if (…

几何画板如何绘制动态正切函数图像

几何学中必学内容包括三角函数&#xff0c;而三角函数又包括正弦函数、余弦函数、正切函数和余切函数。在黑板上很难准确画出这些三角函数&#xff0c;现在有了几何画板&#xff0c;可以快速而准备的构造出三角函数&#xff0c;下面就给大家介绍在几何画板中动态绘制正切函数图…

mean shift 图像分割(二)

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

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

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

mean shift 图像分割 (一)

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

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

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

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

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

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

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

Graph Cut(图割算法)

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

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

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

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

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

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

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

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

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