精华内容
下载资源
问答
  • 常用数字图像分割方法

    千次阅读 2018-11-05 06:52:50
    图像分割是一种重要的图像处理技术。 人们在对图像的认知,理解和应用中,往往仅对其中的某些特定部分感兴趣,这些部分通常被称为目标或前景,它们一般对应图像中特定的,具有独特性质的区域。 这里所说的特定部分...

    图像分割是一种重要的图像处理技术。

    人们在对图像的认知,理解和应用中,往往仅对其中的某些特定部分感兴趣,这些部分通常被称为目标或前景,它们一般对应图像中特定的,具有独特性质的区域。

    这里所说的特定部分的独特性质可以是灰度值,目标的轮廓,图形的纹理,颜色等。

    在图像处理中有时候会需要对图像中的特定目标进行分析处理,这时候就需要首先将它们从图像中提取出来,在此基础上才能进一步对特定目标进行分析。

    图像分割是根据图像的应用需求或组成结构将图像划分成若干个互不相交的子区域的过程。

    这些子区域指的是某种意义下具有共同属性的像素的连通集合。

    例如图像中特定形状目标所占的连通区域、图像背景所占的连通区域等。

    在图像处理中,连通指的是集合中任意两点之间都存在完全属于该集合的连通路径。

    连通包含4连通和8连通两种情况,如下图所示。

    4连通是指从该区域内任一点出发,在不超过该区域的前提下,可以通过上、下、左、右4个方向移动的组合,从而到达该区域内的任意像素点;同理8连通是从区域内任意一点出发,在不超过该区域的前提下,通过8个方向,即上、下、左、右、左上、左下、右上、右下移动的组合,从而到达该区域内的任意像素点。

    四连通和八连通示意图

    根据上述连通基本概念,可以给出图像分割的一般定义,即图像分割是指将一幅离散数字图像信号f(m,n)进行分割,将f分割为若干连通的、非空的子区域f1,f2,…fn,并且要满足以下均一性准则。

    1) f1∪f2∪…∪fn =f .

    2) "i ,当i=1,2…n时,fi是连通的。

    3) "fi均一性准则都是满足的。

    4) 对于任意两个相连的fifj ,E(fifj)=f.

    上述条件(1)说明了分割得到的所有子区域的并集应该包含图像中所有像素,即图像分割不能漏掉任何像素;条件(2)说明了分割得到的子区域的连通性;条件(3)说明分割得到的子区域都有其本身的特性,即在各个子区域内像素性质是相似均一的;条件(4)指出任何两个子区域都不重叠,即同一个像素不会被分在两个不同的子区域中。

    根据以上图像分割的定义,人们已经研究出了上千种不同的图像分割方法,典型而传统的方法可以分为基于阈值的方法、基于边缘的方法和基于区域的分割方法等。

    灰度阈值法分割

    常用的阈值化分割方法是将图像的灰度分成不同的级别,然后设置灰度门限值,再基于这个门限值将图像分割为不同的区域。

    阈值化分割由于其直观性和易操作性成为最常见的图像分割方法之一。

    图像分割阈值化处理的公式如下:

    上式所反应的阈值化处理是一种阶梯函数,其变换曲线如下图所示。

    可以看见,它的功能是以一定方式指定一个门限值,如果图像中某个灰度值大于该门限值,则将其置为一,否则,置为零。

    由于基于灰度阈值的分割方法是一种“一刀切”的分割方式。

    阈值的合理选取就对图像处理的结果有相当大的影响,若阈值选取过大,则会出现提取了图像的多余部分的情况;若阈值过小,则又会出现丢失感兴趣部分的情况。

    对于合理的选取分割阈值目前已经有很多成熟的方法可以借鉴,如最小误差阈值法,最大方差阈值法,最佳阈值法,差别分析法等。

    边缘检测法分割

    物体的边缘是图像局部亮度变化最显著的部分。

    利用边缘检测来分割图像,其基本思想是先检测边缘点,再按照一定方法将边缘点连接成边缘线,从而分割图像区域。

    边缘检测技术是数字图像处理中的一项非常重要的技术。

    由于图像上边缘线邻域是图像中一个灰度级变化比较剧烈的地带,衡量这种变化最有效的两个特征就是变化率和变化方向。

    从数学上来讲就是梯度向量的幅值和方向。

    因此对于一幅图像f(x,y)来讲,求其梯度的局部最大值和方向即为边缘检测。

    已知f(x,y)q方向沿r的梯度定义如下:

    达到最大值的条件是,即

    得到,或者

    梯度最大值,一般称其为梯度模。

    梯度模算子具有各向同性和位移不变性,适用于边缘检测,而灰度变化的方向,

    即边界的方向则可由计算得到。

    在实际应用中,一般以微分算子的形式表示,以卷积函数来实现,常用的算子有Roberts 算子、Prewitt算子、 Sobel算子等。

    其外,还有利用拐点位置处的二阶导数为0来检测边缘线的方法,如Laplacian算子就是最为常用的二阶导数算子。

    Laplacian算子对灰度突变比一般的一阶导数算子更加敏感,它虽然可以检测出绝大部分的边缘,但也存在一些缺点,如边缘不够连续、容易丢失一些边缘、不能获得边缘方向信息、对噪声敏感等。

    在使用Laplacian算子之前需要对图像做平滑处理。

    还有一个重要的边缘检测算子Canny算子,从一定意义上讲,它对受白噪声影响的阶跃型边缘检测是最优的。

    Canny边缘检测的基本思想是:首先使用Gauss滤波器对图像进行平滑滤波,再求取一阶偏导,最后对求导后的图像进行非极大值抑制,得到最后的边缘图像。

    它是具有图像平滑功能的边缘检测算子。

    区域分割

    区域分割法利用同区域内像素灰度值的相似性,将相似的区域合并,不相似的区域分割开。

    该方法认为分割出来的同一区域的像素有着相同或相似的性质,最为常见的区域分割方法有区域生长法和分裂合并法。

    区域生长法的基本思想是将具有相似性质的像素集合起来生长成为特定区域。

    其具体步骤是:首先在每个需要分割的区域内找到一个像素点作为该区域的种子点;然后按照一定的连通规则将种子点周围与其有相似性质的像素,按照一定准则合并到种子点的区域中;最后将这些新像素当作新的种子点继续以上步骤。

    区域生长法要首先解决的三个问题是:

    1)选择一组正确代表所需区域数目的种子点;

    2)确定生长准则;

    3)确定生长过程停止的条件。

    根据所需邻域和生长准则的不同,区域生长法可分为简单生长法、质心生长法、混合生长法等。

    分裂合并法是在事先完全不了解区域形状和区域数目时可采用的方法。

    这种方法先将图像分解成互不重叠、任意大小的区域,再按相似准则进行合并。

    这种分裂合并方法有一个方便的表示方法—四叉树,即将整个图像表示成一棵树,树中的每个节点都有四个后代,树可以一层一层被细分开来。

    如下图所示,设R0代表整个图像区域,从最高层开始,按照一定的相似性准则,将图像一层一层分裂,直到不能分为止。

    仅仅使用分裂是不够的,最后很有可能出现相邻的两个区域属于同一个目标的情况。

    为解决这一问题,在分裂后需要对图像进一步合并。

    合并过程只是合并相邻的区域,且经过合并组成的新区域需要满足一定的一致性测度准则。

    图像区域及四叉树

    可以将分裂合并算法总结为如下的步骤:

    1)给定一定相似性准则P,若对图像中的任一区域Ri,有P(Ri)=false,即不满足相似性准则,则将Ri 区域等分为四份子区域Ri1,Ri2,Ri3,Ri4 。

    2)对于相邻的区域Ri,Rj 若P(Ri ∪Ri)=true,则合并这两个区域。

    3)继续以上步骤直到分裂合并都不能进行时。

    最大类间方差阈值分割

    最大类间方差算法也叫大津算法,是1980年有日本学者大津提出的。

    最大类间方差法的原理是按照灰度特性将待分割图像分为背景和目标两部分,将背景和目标看作是两类,这两类间的方差越大,则说明其差别就越大,也就是说将目标类错分为背景或是将背景类错分为目标的概率就越小,因此使类间方差达到最大的分割就意味着此时的分割效果最好,错分概率最小。

    设一幅图像的灰度值为1~m级,灰度值i的像素数为ni,这时可以得到:

    像素总数为:

    各个灰度值的概率为:

    再用阈值T将其分为两组C0={1~T}和C1={T+1~m},各组产生的概率由下式给出。

    C0 产生的概率为:

    C1 产生的概率为:

    C0 的平均值为:

    C1的平均值为:

    其中,是整个图像的灰度平均值;指灰度为T的灰度均值,

    因此全部采样的灰度均值为:

    下式给出两组之间的方差:

    实际运用时,我们在1~m范围内改变T,求方差为最大时的T值,此时确定的T* 便是最大类间方差算法的阈值。

    此方法被公认为是阈值自动选择的最优方法。

    展开全文
  • 本文对近年在图像分割技术上出现的常用图像分割算法以及它们的优缺点进行了综述,并介绍了其在遥感图像中的应用,提出了图像分割算法的前景和面临的挑战。
  • 经典图像分割方法总结

    千次阅读 2019-04-26 09:09:21
    传统的图像分割方法 深度学习做图像分割 算法一:全卷积网络(FNC) 先进行卷积和池化,然后经过全连接,(VGG-16网络)提取出来图片特征,然后进行上采样(拿了三个池化层的结果,分别进行上采样,之后叠加...

    刚看到一个图像分割的视频,讲的很粗略,但对于了解这方面知识的基础,还是很不错的。。

    图像分割应用

    在这里插入图片描述

    分割的常用的三个数据集

    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    传统的图像分割方法

    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

    深度学习做图像分割

    算法一:全卷积网络(FCN)

    先进行卷积和池化(之后不进行全连接),(VGG-16网络)提取出来图片特征,然后进行上采样(拿了三个池化层的结果,分别进行上采样(根据原图和当前feature map的比值进行放大,从而上采样到原图大小),之后叠加,由粗到细(既考虑小的特征图的全局信息,也考虑大的特征图的细节信息),进行上采样预测),上采样到原图大小,之后对每个像素用softmax分类。。
    在这里插入图片描述在这里插入图片描述

    图像分割上采样常用的方法:

    (1)卷积操作:

    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    (2)padding和stride

    在这里插入图片描述

    (3)双线性差值上采样

    先在x轴上做线性差值,Q12和Q22得到R2,Q11和Q21得到R1
    然后在y轴做线性差值由R1和R2得到P
    所以P就是四个点线性加权得到的结果。。
    在这里插入图片描述

    双线性插值上采样的用途:

    主要用途就是放大feature map(上采样的作用),双线性插值的作用是在特征图进行大小缩放时(上采样是放大),利用双线性插值来的到相对准确的ROI的边界值(相对ROI Pooling而言);
    下面用途中,FCN是当做第一中种用途,现在的paper主要是后两种用途,因为反卷积并没有太大的优势。。
    在这里插入图片描述

    (4)带洞卷积(膨胀卷积)

    这样更利于考虑全局信息
    在这里插入图片描述

    (5)几种类型的特征金字塔

    在这里插入图片描述(a)多个尺度的原图,产生多个尺度的feature map,再对应多个输出;
    (b)一个尺度的原图,产生多个尺度的feature map,针对某一个尺度的feature map产生一个输出;
    (c)一个尺度的原图,产生多个尺度的feature map,每个feature map对一个一个输出;
    (d)一个尺度的原图,产生多个尺度的feature map,多个feature map相互融合,产生多个输出;
    其中第四种性能最好:
    操作方法:
    1扩大两倍然后与2进行叠加,然后得到3,小的特征图携带全局信息,大的特征图携带细节信息,相互融合,这样即利用了细节信息,又利用了全局信息。。
    在这里插入图片描述

    算法二:PSPNet

    采用的方法和FPN类似,池化产生多个尺度的feature map,然后利用卷积缩小他们的通道数,然后分别上采样放大到原图大小,然后所有拼接在一起,既有全局信息,又有局部信息。。
    在这里插入图片描述

    算法三:Mask-RCNN

    在这里插入图片描述

    (1)多分支预测

        实际主体结构和faster R-CNN差不多,只是多了一个mask这个步骤
    

    在这里插入图片描述

    (2)binary mask

    之前的FCN,是利用soft max进行多分类预测,这里是使用sigmoid进行二分类,准确率大幅提高
    在这里插入图片描述

    (3)Roi Align

    作用:bounding box 的映射时,得到更准确的边界值,使得框更精确。。
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    Roi Align 与Roi pooling的关系

    Roi Align实际是Roi pooling的精确版
    feature map中的小的变化,映射到原图上可能是好几个像素的变化,
    因为分割任务边框的精确度要求要比检测任务要求更高,所以Align可以增加分割进度。。具体精度提升如下:
    在这里插入图片描述

    展开全文
  • 文中主要以某山地航拍图为研究对像,对其进行背景分析然后再实现图像分割,为后期迷彩设计做准备。由于该山地背景纹理特征明显,故利用纹理分析对其进行背景分析,而灰度共生矩阵是纹理分析方法中最常用的一种方法。...
  • 图像分割综述

    万次阅读 多人点赞 2019-07-09 22:03:48
    图像分割是计算机视觉研究中的一个经典难题,已经成为图像理解领域关注的一个热点,图像分割是图像分析的第一步,是计算机视觉的基础,是图像理解的重要组成部分,同时也是图像处理中最困难的问题之一。所谓图像分割...

    本文作者净浩泽,公众号:计算机视觉life,编辑成员

    图像分割是计算机视觉研究中的一个经典难题,已经成为图像理解领域关注的一个热点,图像分割是图像分析的第一步,是计算机视觉的基础,是图像理解的重要组成部分,同时也是图像处理中最困难的问题之一。所谓图像分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,使得这些特征在同一区域内表现出一致性或相似性,而在不同区域间表现出明显的不同。简单的说就是在一副图像中,把目标从背景中分离出来。对于灰度图像来说,区域内部的像素一般具有灰度相似性,而在区域的边界上一般具有灰度不连续性。 关于图像分割技术,由于问题本身的重要性和困难性,从20世纪70年代起图像分割问题就吸引了很多研究人员为之付出了巨大的努力。虽然到目前为止,还不存在一个通用的完美的图像分割的方法,但是对于图像分割的一般性规律则基本上已经达成的共识,已经产生了相当多的研究成果和方法。

    本文对于目前正在使用的各种图像分割方法进行了一定的归纳总结,由于笔者对于图像分割的了解也是初窥门径,所以难免会有一些错误,还望各位读者多多指正,共同学习进步。

    传统分割方法

    这一大部分我们将要介绍的是深度学习大火之前人们利用数字图像处理、拓扑学、数学等方面的只是来进行图像分割的方法。当然现在随着算力的增加以及深度学习的不断发展,一些传统的分割方法在效果上已经不能与基于深度学习的分割方法相比较了,但是有些天才的思想还是非常值得我们去学习的。
    1.基于阈值的分割方法
    阈值法的基本思想是基于图像的灰度特征来计算一个或多个灰度阈值,并将图像中每个像素的灰度值与阈值作比较,最后将像素根据比较结果分到合适的类别中。因此,该方法最为关键的一步就是按照某个准则函数来求解最佳灰度阈值。
    阈值法特别适用于目标和背景占据不同灰度级范围的图。
    图像若只有目标和背景两大类,那么只需要选取一个阈值进行分割,此方法成为单阈值分割;但是如果图像中有多个目标需要提取,单一阈值的分割就会出现作物,在这种情况下就需要选取多个阈值将每个目标分隔开,这种分割方法相应的成为多阈值分割。

    如图所示即为对数字的一种阈值分割方法。
    阀值分割方法的优缺点:

    • 计算简单,效率较高;
    • 只考虑像素点灰度值本身的特征,一般不考虑空间特征,因此对噪声比较敏感,鲁棒性不高。
      从前面的介绍里我们可以看出,阈值分割方法的最关键就在于阈值的选择。若将智能遗传算法应用在阀值筛选上,选取能最优分割图像的阀值,这可能是基于阀值分割的图像分割法的发展趋势。
      2.基于区域的图像分割方法
      基于区域的分割方法是以直接寻找区域为基础的分割技术,基于区域提取方法有两种基本形式:一种是区域生长,从单个像素出发,逐步合并以形成所需要的分割区域;另一种是从全局出发,逐步切割至所需的分割区域。
      区域生长
      区域生长是从一组代表不同生长区域的种子像素开始,接下来将种子像素邻域里符合条件的像素合并到种子像素所代表的生长区域中,并将新添加的像素作为新的种子像素继续合并过程,知道找不到符合条件的新像素为止(小编研一第一学期的机器学习期末考试就是手写该算法 T.T),该方法的关键是选择合适的初始种子像素以及合理的生长准则。
      区域生长算法需要解决的三个问题:
      (1)选择或确定一组能正确代表所需区域的种子像素;
      (2)确定在生长过程中能将相邻像素包括进来的准则;
      (3)指定让生长过程停止的条件或规则。
      区域分裂合并
      区域生长是从某个或者某些像素点出发,最终得到整个区域,进而实现目标的提取。而分裂合并可以说是区域生长的逆过程,从整幅图像出发,不断的分裂得到各个子区域,然后再把前景区域合并,得到需要分割的前景目标,进而实现目标的提取。其实如果理解了上面的区域生长算法这个区域分裂合并算法就比较好理解啦。
      四叉树分解法就是一种典型的区域分裂合并法,基本算法如下:
      (1)对于任一区域,如果H(Ri)=FALSE就将其分裂成不重叠的四等分;
      (2)对相邻的两个区域Ri和Rj,它们也可以大小不同(即不在同一层),如果条件H(RiURj)=TURE满足,就将它们合并起来;
      (3)如果进一步的分裂或合并都不可能,则结束。
      其中R代表整个正方形图像区域,P代表逻辑词。
      区域分裂合并算法优缺点:
      (1)对复杂图像分割效果好;
      (2)算法复杂,计算量大;
      (3)分裂有可能破怪区域的边界。
      在实际应用当中通常将区域生长算法和区域分裂合并算法结合使用,该类算法对某些复杂物体定义的复杂场景的分割或者对某些自然景物的分割等类似先验知识不足的图像分割效果较为理想。
      分水岭算法
      分水岭算法是一个非常好理解的算法,它根据分水岭的构成来考虑图像的分割,现实中我们可以想象成有山和湖的景象,那么一定是如下图的,水绕山山围水的景象。
      分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭。分水岭的概念和形成可以通过模拟浸入过程来说明。在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸入水中,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形成分水岭。
      分水岭对微弱边缘具有良好的响应,图像中的噪声、物体表面细微的灰度变化都有可能产生过度分割的现象,但是这也同时能够保证得到封闭连续边缘。同时,分水岭算法得到的封闭的集水盆也为分析图像的区域特征提供了可能。

    3.基于边缘检测的分割方法

    基于边缘检测的图像分割算法试图通过检测包含不同区域的边缘来解决分割问题。它可以说是人们最先想到也是研究最多的方法之一。通常不同区域的边界上像素的灰度值变化比较剧烈,如果将图片从空间域通过傅里叶变换到频率域,边缘就对应着高频部分,这是一种非常简单的边缘检测算法。
    边缘检测技术通常可以按照处理的技术分为串行边缘检测和并行边缘检测。串行边缘检测是要想确定当前像素点是否属于检测边缘上的一点,取决于先前像素的验证结果。并行边缘检测是一个像素点是否属于检测边缘高尚的一点取决于当前正在检测的像素点以及与该像素点的一些临近像素点。
    最简单的边缘检测方法是并行微分算子法,它利用相邻区域的像素值不连续的性质,采用一阶或者二阶导数来检测边缘点。近年来还提出了基于曲面拟合的方法、基于边界曲线拟合的方法、基于反应-扩散方程的方法、串行边界查找、基于变形模型的方法。

    边缘检测的优缺点:
    (1)边缘定位准确;
    (2)速度快;
    (3)不能保证边缘的连续性和封闭性;
    (4)在高细节区域存在大量的碎边缘,难以形成一个大区域,但是又不宜将高细节区域分成小碎片;
    由于上述的(3)(4)两个难点,边缘检测只能产生边缘点,而非完整意义上的图像分割过程。这也就是说,在边缘点信息获取到之后还需要后续的处理或者其他相关算法相结合才能完成分割任务。
    在以后的研究当中,用于提取初始边缘点的自适应阈值选取、用于图像的层次分割的更大区域的选取以及如何确认重要边缘以去除假边缘将变得非常重要。

    结合特定工具的图像分割算法

    基于小波分析和小波变换的图像分割方法

    小波变换是近年来得到的广泛应用的数学工具,也是现在数字图像处理必学部分,它在时间域和频率域上都有量高的局部化性质,能将时域和频域统一于一体来研究信号。而且小波变换具有多尺度特性,能够在不同尺度上对信号进行分析,因此在图像分割方面的得到了应用,
    二进小波变换具有检测二元函数的局部突变能力,因此可作为图像边缘检测工具。图像的边缘出现在图像局部灰度不连续处,对应于二进小波变换的模极大值点。通过检测小波变换模极大值点可以确定图像的边缘小波变换位于各个尺度上,而每个尺度上的小波变换都能提供一定的边缘信息,因此可进行多尺度边缘检测来得到比较理想的图像边缘。

    上图左图是传统的阈值分割方法,右边的图像就是利用小波变换的图像分割。可以看出右图分割得到的边缘更加准确和清晰
    另外,将小波和其他方法结合起来处理图像分割的问题也得到了广泛研究,比如一种局部自适应阈值法就是将Hilbert图像扫描和小波相结合,从而获得了连续光滑的阈值曲线。

    基于遗传算法的图像分割

    ​ 遗传算法(Genetic Algorithms,简称GA)是1973年由美国教授Holland提出的,是一种借鉴生物界自然选择和自然遗传机制的随机化搜索算法。是仿生学在数学领域的应用。其基本思想是,模拟由一些基因串控制的生物群体的进化过程,把该过程的原理应用到搜索算法中,以提高寻优的速度和质量。此算法的搜索过程不直接作用在变量上,而是在参数集进行了编码的个体,这使得遗传算法可直接对结构对象(图像)进行操作。整个搜索过程是从一组解迭代到另一组解,采用同时处理群体中多个个体的方法,降低了陷入局部最优解的可能性,并易于并行化。搜索过程采用概率的变迁规则来指导搜索方向,而不采用确定性搜索规则,而且对搜索空间没有任何特殊要求(如连通性、凸性等),只利用适应性信息,不需要导数等其他辅助信息,适应范围广。
    ​ 遗传算法擅长于全局搜索,但局部搜索能力不足,所以常把遗传算法和其他算法结合起来应用。将遗传算法运用到图像处理主要是考虑到遗传算法具有与问题领域无关且快速随机的搜索能力。其搜索从群体出发,具有潜在的并行性,可以进行多个个体的同时比较,能有效的加快图像处理的速度。但是遗传算法也有其缺点:搜索所使用的评价函数的设计、初始种群的选择有一定的依赖性等。要是能够结合一些启发算法进行改进且遗传算法的并行机制的潜力得到充分的利用,这是当前遗传算法在图像处理中的一个研究热点。

    基于主动轮廓模型的分割方法

    ​ 主动轮廓模型(active contours)是图像分割的一种重要方法,具有统一的开放式的描述形式,为图像分割技术的研究和创新提供了理想的框架。在实现主动轮廓模型时,可以灵活的选择约束力、初始轮廓和作用域等,以得到更佳的分割效果,所以主动轮廓模型方法受到越来越多的关注。
    ​ 该方法是在给定图像中利用曲线演化来检测目标的一类方法,基于此可以得到精确的边缘信息。其基本思想是,先定义初始曲线C,然后根据图像数据得到能量函数,通过最小化能量函数来引发曲线变化,使其向目标边缘逐渐逼近,最终找到目标边缘。这种动态逼近方法所求得的边缘曲线具有封闭、光滑等优点。

    ​ 传统的主动轮廓模型大致分为参数主动轮廓模型和几何主动轮廓模型。参数主动轮廓模型将曲线或曲面的形变以参数化形式表达,Kass等人提出了经典的参数活动轮廓模型即“Snake”模型,其中Snake定义为能量极小化的样条曲线,它在来自曲线自身的内力和来自图像数据的外力的共同作用下移动到感兴趣的边缘,内力用于约束曲线形状,而外力则引导曲线到特征此边缘。参数主动轮廓模型的特点是将初始曲线置于目标区域附近,无需人为设定曲线的的演化是收缩或膨胀,其优点是能够与模型直接进行交互,且模型表达紧凑,实现速度快;其缺点是难以处理模型拓扑结构的变化。比如曲线的合并或分裂等。而使用水平集(level set)的几何活动轮廓方法恰好解决了这一问题。

    基于深度学习的分割

    1.基于特征编码(feature encoder based)

    在特征提取领域中VGGnet和ResNet是两个非常有统治力的方法,接下来的一些篇幅会对这两个方法进行简短的介绍

    a.VGGNet

    ​ 由牛津大学计算机视觉组合和Google DeepMind公司研究员一起研发的深度卷积神经网络。它探索了卷积神经网络的深度和其性能之间的关系,通过反复的堆叠33的小型卷积核和22的最大池化层,成功的构建了16~19层深的卷积神经网络。VGGNet获得了ILSVRC 2014年比赛的亚军和定位项目的冠军,在top5上的错误率为7.5%。目前为止,VGGNet依然被用来提取图像的特征。

    ​ VGGNet的优缺点

    1. 由于参数量主要集中在最后的三个FC当中,所以网络加深并不会带来参数爆炸的问题;
    2. 多个小核卷积层的感受野等同于一个大核卷积层(三个3x3等同于一个7x7)但是参数量远少于大核卷积层而且非线性操作也多于后者,使得其学习能力较强
    3. VGG由于层数多而且最后的三个全连接层参数众多,导致其占用了更多的内存(140M)
    b.ResNet

    ​ 随着深度学习的应用,各种深度学习模型随之出现,虽然在每年都会出现性能更好的新模型,但是对于前人工作的提升却不是那么明显,其中有重要问题就是深度学习网络在堆叠到一定深度的时候会出现梯度消失的现象,导致误差升高效果变差,后向传播时无法将梯度反馈到前面的网络层,使得前方的网络层的参数难以更新,训练效果变差。这个时候ResNet恰好站出来,成为深度学习发展历程中一个重要的转折点。
    ​ ResNet是由微软研究院的Kaiming He等四名华人提出,他们通过自己提出的ResNet Unit成功训练出来152层的神经网络并在ILSVRC2015比赛中斩获冠军。ResNet语义分割领域最受欢迎且最广泛运用的神经网络.ResNet的核心思想就是在网络中引入恒等映射,允许原始输入信息直接传到后面的层中,在学习过程中可以只学习上一个网络输出的残差(F(x)),因此ResNet又叫做残差网络。、

    使用到ResNet的分割模型:

    • Efficient Neural Network(ENet):该网络类似于ResNet的bottleNeck方法;
    • ResNet-38:该网络在训练or测试阶段增加并移除了一些层,是一种浅层网络,它的结构是ResNet+FCN;
    • full-resolution residual network(FRRN):FRRN网络具有和ResNet相同优越的训练特性,它由残差流和池化流两个处理流组成;
    • AdapNey:根据ResNet-50的网络进行改进,让原本的ResNet网络能够在更短的时间内学习到更多高分辨率的特征;
      ……
      ResNet的优缺点:
      1)引入了全新的网络结构(残差学习模块),形成了新的网络结构,可以使网络尽可能地加深;
      2)使得前馈/反馈传播算法能够顺利进行,结构更加简单;
      3)恒等映射地增加基本上不会降低网络的性能;
      4)建设性地解决了网络训练的越深,误差升高,梯度消失越明显的问题;
      5)由于ResNet搭建的层数众多,所以需要的训练时间也比平常网络要长。

    2.基于区域选择(regional proposal based)

    Regional proposal 在计算机视觉领域是一个非常常用的算法,尤其是在目标检测领域。其核心思想就是检测颜色空间和相似矩阵,根据这些来检测待检测的区域。然后根据检测结果可以进行分类预测。
    在语义分割领域,基于区域选择的几个算法主要是由前人的有关于目标检测的工作渐渐延伸到语义分割的领域的,接下来小编将逐步介绍其个中关系。

    Stage Ⅰ: R-CNN

    伯克利大学的Girshick教授等人共同提出了首个在目标检测方向应用的深度学习模型:Region-based Convolutional Neural Network(R-CNN)。该网络模型如下图所示,其主要流程为:先使用selective search算法提取2000个候选框,然后通过卷积网络对候选框进行串行的特征提取,再根据提取的特征使用SVM对候选框进行分类预测,最后使用回归方法对区域框进行修正。

    R-CNN的优缺点:

    • 是首个开创性地将深度神经网络应用到目标检测的算法;
    • 使用Bounding Box Regression对目标检测的框进行调整;
    • 由于进行特征提取时是串行,处理耗时过长;
    • Selective search算法在提取每一个region时需要2s的时间,浪费大量时间
    Stage Ⅱ:Fast R-CNN

    ​ 由于R-CNN的效率太低,2015年由Ross等学者提出了它的改进版本:Fast R-CNN。其网络结构图如下图所示(从提取特征开始,略掉了region的选择)Fast R-CNN在传统的R-CNN模型上有所改进的地方是它是直接使用一个神经网络对整个图像进行特征提取,就省去了串行提取特征的时间;接着使用一个RoI Pooling Layer在全图的特征图上摘取每一个RoI对应的特征,再通过FC进行分类和包围框的修正。

    Fast R-CNN的优缺点

    • 节省了串行提取特征的时间;
    • 除了selective search以外的其它所有模块都可以合在一起训练;
    • 最耗时间的selective search算法依然存在。
    Stage Ⅲ:Faster R-CNN

    2016年提出的Faster R-CNN可以说有了突破性的进展(虽然还是目标检测哈哈哈),因为它改变了它的前辈们最耗时最致命的部位:selective search算法。它将selective search算法替换成为RPN,使用RPN网络进行region的选取,将2s的时间降低到10ms,其网络结构如下图所示:

    Faster R-CNN优缺点:

    • 使用RPN替换了耗时的selective search算法,对整个网络结构有了突破性的优化;
    • Faster R-CNN中使用的RPN和selective search比起来虽然速度更快,但是精度和selective search相比稍有不及,如果更注重速度而不是精度的话完全可以只使用RPN;
    Stage Ⅳ:Mask R-CNN

    Mask R-CNN(终于到分割了!)是何恺明大神团队提出的一个基于Faster R-CNN模型的一种新型的分割模型,此论文斩获ICCV 2017的最佳论文,在Mask R-CNN的工作中,它主要完成了三件事情:目标检测,目标分类,像素级分割。
    恺明大神是在Faster R-CNN的结构基础上加上了Mask预测分支,并且改良了ROI Pooling,提出了ROI Align。其网络结构真容就如下图所示啦:

    Mask R-CNN的优缺点:

    • 引入了预测用的Mask-Head,以像素到像素的方式来预测分割掩膜,并且效果很好;
    • 用ROI Align替代了ROI Pooling,去除了RoI Pooling的粗量化,使得提取的特征与输入良好对齐;
    • 分类框与预测掩膜共享评价函数,虽然大多数时间影响不大,但是有的时候会对分割结果有所干扰。
    Stage Ⅴ:Mask Scoring R-CNN

    最后要提出的是2019年CVPR的oral,来自华中科技大学的研究生黄钊金同学提出的
    MS R-CNN,这篇文章的提出主要是对上文所说的Mask R-CNN的一点点缺点进行了修正。他的网络结构也是在Mask R-CNN的网络基础上做了一点小小的改进,添加了Mask-IoU。
    黄同学在文章中提到:恺明大神的Mask R-CNN已经很好啦!但是有个小毛病,就是评价函数只对目标检测的候选框进行打分,而不是分割模板(就是上文提到的优缺点中最后一点),所以会出现分割模板效果很差但是打分很高的情况。所以黄同学增加了对模板进行打分的MaskIoU Head,并且最终的分割结果在COCO数据集上超越了恺明大神,下面就是MS R-CNN的网络结构啦~

    MS R-CNN的优缺点:

    • 优化了Mask R-CNN中的信息传播,提高了生成预测模板的质量;
    • 未经大批量训练的情况下,就拿下了COCO 2017挑战赛实例分割任务冠军;
    • 要说缺点的话。。应该就是整个网络有些庞大,一方面需要ResNet当作主干网络,另一方面需要其它各种Head共同承担各种任务。

    3.基于RNN的图像分割

    Recurrent neural networks(RNNs)除了在手写和语音识别上表现出色外,在解决计算机视觉的任务上也表现不俗,在本篇文章中我们就将要介绍RNN在2D图像处理上的一些应用,其中也包括介绍使用到它的结构或者思想的一些模型。
    RNN是由Long-Short-Term Memory(LSTM)块组成的网络,RNN来自序列数据的长期学习的能力以及随着序列保存记忆的能力使其在许多计算机视觉的任务中游刃有余,其中也包括语义分割以及数据标注的任务。接下来的部分我们将介绍几个使用到RNN结构的用于分割的网络结构模型:

    1.ReSeg模型

    ReSeg可能不被许多人所熟知,在百度上搜索出的相关说明与解析也不多,但是这是一个很有效的语义分割方法。众所周知,FCN可谓是图像分割领域的开山作,而RegNet的作者则在自己的文章中大胆的提出了FCN的不足:没有考虑到局部或者全局的上下文依赖关系,而在语义分割中这种依赖关系是非常有用的。所以在ReSeg中作者使用RNN去检索上下文信息,以此作为分割的一部分依据。

    该结构的核心就是Recurrent Layer,它由多个RNN组合在一起,捕获输入数据的局部和全局空间结构。
    优缺点:

    • 充分考虑了上下文信息关系;
    • 使用了中值频率平衡,它通过类的中位数(在训练集上计算)和每个类的频率之间的比值来重新加权类的预测。这就增加了低频率类的分数,这是一个更有噪声的分割掩码的代价,因为被低估的类的概率被高估了,并且可能导致在输出分割掩码中错误分类的像素增加。
    2.MDRNNs(Multi-Dimensional Recurrent Neural Networks)模型

    传统的RNN在一维序列学习问题上有着很好的表现,比如演讲(speech)和在线手写识别。但是 在多为问题中应用却并不到位。MDRNNs在一定程度上将RNN拓展到多维空间领域,使之在图像处理、视频处理等领域上也能有所表现。
    该论文的基本思想是:将单个递归连接替换为多个递归连接,相应可以在一定程度上解决时间随数据样本的增加呈指数增长的问题。以下就是该论文提出的两个前向反馈和反向反馈的算法。

    4.基于上采样/反卷积的分割方法

    卷积神经网络在进行采样的时候会丢失部分细节信息,这样的目的是得到更具特征的价值。但是这个过程是不可逆的,有的时候会导致后面进行操作的时候图像的分辨率太低,出现细节丢失等问题。因此我们通过上采样在一定程度上可以不全一些丢失的信息,从而得到更加准确的分割边界。
    接下来介绍几个非常著名的分割模型:

    a.FCN(Fully Convolutional Network)

    是的!讲来讲去终于讲到这位大佬了,FCN!在图像分割领域已然成为一个业界标杆,大多数的分割方法多多少少都会利用到FCN或者其中的一部分,比如前面我们讲过的Mask R-CNN。
    在FCN当中的反卷积-升采样结构中,图片会先进性上采样(扩大像素);再进行卷积——通过学习获得权值。FCN的网络结构如下图所示:

    当然最后我们还是需要分析一下FCN,不能无脑吹啦~
    优缺点:

    • FCN对图像进行了像素级的分类,从而解决了语义级别的图像分割问题;
    • FCN可以接受任意尺寸的输入图像,可以保留下原始输入图像中的空间信息;
    • 得到的结果由于上采样的原因比较模糊和平滑,对图像中的细节不敏感;
    • 对各个像素分别进行分类,没有充分考虑像素与像素的关系,缺乏空间一致性。
    2.SetNet

    SegNet是剑桥提出的旨在解决自动驾驶或者智能机器人的图像语义分割深度网络,SegNet基于FCN,与FCN的思路十分相似,只是其编码-解码器和FCN的稍有不同,其解码器中使用去池化对特征图进行上采样,并在分各种保持高频细节的完整性;而编码器不使用全连接层,因此是拥有较少参数的轻量级网络:

    图像分割是计算机视觉研究中的一个经典难题,已经成为图像理解领域关注的一个热点,图像分割是图像分析的第一步,是计算机视觉的基础,是图像理解的重要组成部分,同时也是图像处理中最困难的问题之一。所谓图像分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,使得这些特征在同一区域内表现出一致性或相似性,而在不同区域间表现出明显的不同。简单的说就是在一副图像中,把目标从背景中分离出来。对于灰度图像来说,区域内部的像素一般具有灰度相似性,而在区域的边界上一般具有灰度不连续性。 关于图像分割技术,由于问题本身的重要性和困难性,从20世纪70年代起图像分割问题就吸引了很多研究人员为之付出了巨大的努力。虽然到目前为止,还不存在一个通用的完美的图像分割的方法,但是对于图像分割的一般性规律则基本上已经达成的共识,已经产生了相当多的研究成果和方法。

    本文对于目前正在使用的各种图像分割方法进行了一定的归纳总结,由于笔者对于图像分割的了解也是初窥门径,所以难免会有一些错误,还望各位读者多多指正,共同学习进步。

    SetNet的优缺点:

    • 保存了高频部分的完整性;
    • 网络不笨重,参数少,较为轻便;
    • 对于分类的边界位置置信度较低;
    • 对于难以分辨的类别,例如人与自行车,两者如果有相互重叠,不确定性会增加。
      以上两种网络结构就是基于反卷积/上采样的分割方法,当然其中最最最重要的就是FCN了,哪怕是后面大名鼎鼎的SegNet也是基于FCN架构的,而且FCN可谓是语义分割领域中开创级别的网络结构,所以虽然这个部分虽然只有两个网络结构,但是这两位可都是重量级嘉宾,希望各位能够深刻理解~

    5.基于提高特征分辨率的分割方法

    在这一个模块中我们主要给大家介绍一下基于提升特征分辨率的图像分割的方法。换一种说法其实可以说是恢复在深度卷积神经网络中下降的分辨率,从而获取更多的上下文信息。这一系列我将给大家介绍的是Google提出的DeepLab 。
    DeepLab是结合了深度卷积神经网络和概率图模型的方法,应用在语义分割的任务上,目的是做逐像素分类,其先进性体现在DenseCRFs(概率图模型)和DCNN的结合。是将每个像素视为CRF节点,利用远程依赖关系并使用CRF推理直接优化DCNN的损失函数。
    在图像分割领域,FCN的一个众所周知的操作就是平滑以后再填充,就是先进行卷积再进行pooling,这样在降低图像尺寸的同时增大感受野,但是在先减小图片尺寸(卷积)再增大尺寸(上采样)的过程中一定有一些信息损失掉了,所以这里就有可以提高的空间。
    接下来我要介绍的是DeepLab网络的一大亮点:Dilated/Atrous Convolution,它使用的采样方式是带有空洞的采样。在VGG16中使用不同采样率的空洞卷积,可以明确控制网络的感受野。

    图a对应3x3的1-dilated conv,它和普通的卷积操作是相同的;图b对应3x3的2-dilated conv,事迹卷积核的尺寸还是3x3(红点),但是空洞为1,其感受野能够达到7x7;图c对应3x3的4-dilated conv,其感受野已经达到了15x15.写到这里相信大家已经明白,在使用空洞卷积的情况下,加大了感受野,使每个卷积输出都包含了较大范围的信息。
    这样就解决了DCNN的几个关于分辨率的问题:
    1)内部数据结构丢失;空间曾计划信息丢失;
    2)小物体信息无法重建;
    当然空洞卷积也存在一定的问题,它的问题主要体现在以下两方面:
    1)网格效应
    加入我们仅仅多次叠加dilation rate 2的 3x3 的卷积核则会出现以下问题

    我们发现卷积核并不连续,也就是说并不是所有的像素都用来计算了,这样会丧失信息的连续性;
    2)小物体信息处理不当
    我们从空洞卷积的设计背景来看可以推测出它是设计来获取long-ranged information。然而空洞步频选取得大获取只有利于大物体得分割,而对于小物体的分割可能并没有好处。所以如何处理好不同大小物体之间的关系也是设计好空洞卷积网络的关键。

    6.基于特征增强的分割方法

    基于特征增强的分割方法包括:提取多尺度特征或者从一系列嵌套的区域中提取特征。在图像分割的深度网络中,CNN经常应用在图像的小方块上,通常称为以每个像素为中心的固定大小的卷积核,通过观察其周围的小区域来标记每个像素的分类。在图像分割领域,能够覆盖到更大部分的上下文信息的深度网络通常在分割的结果上更加出色,当然这也伴随着更高的计算代价。多尺度特征提取的方法就由此引进。
    在这一模块中我先给大家介绍一个叫做SLIC,全称为simple linear iterative cluster的生成超像素的算法。
    首先我们要明确一个概念:啥是超像素?其实这个比较容易理解,就像上面说的“小方块”一样,我们平常处理图像的最小单位就是像素了,这就是像素级(pixel-level);而把像素级的图像划分成为区域级(district-level)的图像,把区域当成是最基本的处理单元,这就是超像素啦。
    算法大致思想是这样的,将图像从RGB颜色空间转换到CIE-Lab颜色空间,对应每个像素的(L,a,b)颜色值和(x,y)坐标组成一个5维向量V[l, a, b, x, y],两个像素的相似性即可由它们的向量距离来度量,距离越大,相似性越小。
    算法首先生成K个种子点,然后在每个种子点的周围空间里搜索距离该种子点最近的若干像素,将他们归为与该种子点一类,直到所有像素点都归类完毕。然后计算这K个超像素里所有像素点的平均向量值,重新得到K个聚类中心,然后再以这K个中心去搜索其周围与其最为相似的若干像素,所有像素都归类完后重新得到K个超像素,更新聚类中心,再次迭代,如此反复直到收敛。
    有点像聚类的K-Means算法,最终会得到K个超像素。
    Mostahabi等人提出的一种前向传播的分类方法叫做Zoom-Out就使用了SLIC的算法,它从多个不同的级别提取特征:局部级别:超像素本身;远距离级别:能够包好整个目标的区域;全局级别:整个场景。这样综合考虑多尺度的特征对于像素或者超像素的分类以及分割来说都是很有意义的。
    接下来的部分我将给大家介绍另一种完整的分割网络:PSPNet:Pyramid Scene Parsing Network
    论文提出在场景分割是,大多数的模型会使用FCN的架构,但是FCN在场景之间的关系和全局信息的处理能力存在问题,其典型问题有:1.上下文推断能力不强;2.标签之间的关系处理不好;3.模型可能会忽略小的东西。
    本文提出了一个具有层次全局优先级,包含不同子区域时间的不同尺度的信息,称之为金字塔池化模块。
    该模块融合了4种不同金字塔尺度的特征,第一行红色是最粗糙的特征–全局池化生成单个bin输出,后面三行是不同尺度的池化特征。为了保证全局特征的权重,如果金字塔共有N个级别,则在每个级别后使用1×1 1×11×1的卷积将对于级别通道降为原本的1/N。再通过双线性插值获得未池化前的大小,最终concat到一起。其结构如下图:

    最终结果就是,在融合不同尺度的feature后,达到了语义和细节的融合,模型的性能表现提升很大,作者在很多数据集上都做过训练,最终结果是在MS-COCO数据集上预训练过的效果最好。

    为了捕捉多尺度特征,高层特征包含了更多的语义和更少的位置信息。结合多分辨率图像和多尺度特征描述符的优点,在不丢失分辨率的情况下提取图像中的全局和局部信息,这样就能在一定程度上提升网络的性能。

    7.使用CRF/MRF的方法

    首先让我们熟悉熟悉到底啥是MRF的CRF的。
    MRF全称是Marcov Random Field,马尔可夫随机场,其实说起来笔者在刚读硕士的时候有一次就有同学在汇报中提到了隐马尔可夫、马尔可夫链啥的,当时还啥都不懂,小白一枚(现在是准小白hiahia),觉得马尔可夫这个名字贼帅,后来才慢慢了解什么马尔科夫链呀,马尔可夫随机场,并且在接触到图像分割了以后就对马尔科夫随机场有了更多的了解。
    MRF其实是一种基于统计的图像分割算法,马尔可夫模型是指一组事件的集合,在这个集合中,事件逐个发生,并且下一刻事件的发生只由当前发生的事件决定,而与再之前的状态没有关系。而马尔可夫随机场,就是具有马尔可夫模型特性的随机场,就是场中任何区域都只与其临近区域相关,与其他地方的区域无关,那么这些区域里元素(图像中可以是像素)的集合就是一个马尔可夫随机场。
    CRF的全称是Conditional Random Field,条件随机场其实是一种特殊的马尔可夫随机场,只不过是它是一种给定了一组输入随机变量X的条件下另一组输出随机变量Y的马尔可夫随机场,它的特点是埃及设输出随机变量构成马尔可夫随机场,可以看作是最大熵马尔可夫模型在标注问题上的推广。
    在图像分割领域,运用CRF比较出名的一个模型就是全连接条件随机场(DenseCRF),接下来我们将花费一些篇幅来简单介绍一下。
    CRF在运行中会有一个问题就是它只对相邻节点进行操作,这样会损失一些上下文信息,而全连接条件随机场是对所有节点进行操作,这样就能获取尽可能多的临近点信息,从而获得更加精准的分割结果。
    在Fully connected CRF中,吉布斯能量可以写作:

    我们重点关注二元部分:

    其中k(m)为高斯核,写作:

    该模型的一元势能包含了图像的形状,纹理,颜色和位置,二元势能使用了对比度敏感的的双核势能,CRF的二元势函数一般是描述像素点与像素点之间的关系,鼓励相似像素分配相同的标签,而相差较大的像素分配不同标签,而这个“距离”的定义与颜色值和实际相对距离有关,这样CRF能够使图像尽量在边界处分割。全连接CRF模型的不同就在于其二元势函数描述的是每一个像素与其他所有像素的关系,使用该模型在图像中的所有像素对上建立点对势能从而实现极大地细化和分割。
    在分割结果上我们可以看看如下的结果图:

    可以看到它在精细边缘的分割比平常的分割方法要出色得多,而且文章中使用了另一种优化算法,使得本来需要及其大量运算的全连接条件随机场也能在很短的时间里给出不错的分割结果。
    至于其优缺点,我觉得可以总结为以下几方面:

    • 在精细部位的分割非常优秀;
    • 充分考虑了像素点或者图片区域之间的上下文关系;
    • 在粗略的分割中可能会消耗不必要的算力;
    • 可以用来恢复细致的局部结构,但是相应的需要较高的代价。
      OK,那么本次的推送就到这里结束啦,本文的主要内容是对图像分割的算法进行一个简单的分类和介绍。综述对于各位想要深入研究的看官是非常非常重要的资源:大佬们经常看综述一方面可以了解算法的不足并在此基础上做出改进;萌新们可以通过阅读一篇好的综述入门某一个学科,比如今天的内容就是图像分割。
      谢谢各位朋友们的观看!

    推荐阅读

    如何从零开始系统化学习视觉SLAM?
    从零开始一起学习SLAM | 为什么要学SLAM?
    从零开始一起学习SLAM | 学习SLAM到底需要学什么?
    从零开始一起学习SLAM | SLAM有什么用?
    从零开始一起学习SLAM | C++新特性要不要学?
    从零开始一起学习SLAM | 为什么要用齐次坐标?
    从零开始一起学习SLAM | 三维空间刚体的旋转
    从零开始一起学习SLAM | 为啥需要李群与李代数?
    从零开始一起学习SLAM | 相机成像模型
    从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?
    从零开始一起学习SLAM | 神奇的单应矩阵
    从零开始一起学习SLAM | 你好,点云
    从零开始一起学习SLAM | 给点云加个滤网
    从零开始一起学习SLAM | 点云平滑法线估计
    从零开始一起学习SLAM | 点云到网格的进化
    从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码
    从零开始一起学习SLAM | 掌握g2o顶点编程套路
    从零开始一起学习SLAM | 掌握g2o边的代码套路
    零基础小白,如何入门计算机视觉?
    SLAM领域牛人、牛实验室、牛研究成果梳理
    我用MATLAB撸了一个2D LiDAR SLAM
    可视化理解四元数,愿你不再掉头发
    最近一年语义SLAM有哪些代表性工作?
    视觉SLAM技术综述
    汇总 | VIO、激光SLAM相关论文分类集锦
    研究SLAM,对编程的要求有多高?
    2018年SLAM、三维视觉方向求职经验分享
    2018年SLAM、三维视觉方向求职经验分享
    深度学习遇到SLAM | 如何评价基于深度学习的DeepVO,VINet,VidLoc?
    视觉SLAM关键方法总结
    SLAM方向公众号、知乎、博客上有哪些大V可以关注?
    SLAM实验室
    SLAM方向国内有哪些优秀公司?
    SLAM面试常见问题
    SLAM相关领域数据集调研
    从零开始一起学习SALM-ICP原理及应用
    解放双手——相机与IMU外参的在线标定
    目标检测

    展开全文
  • 做大作业时汇总的资料,包括了一些彩色、灰度图像分割常用算法:K-means,模糊C,区域生长,阈值分割等
  • 图像分割方法总结

    一、灰度阈值法
    1、全局阈值法
    整幅图像使用同一个阈值做分割处理,适用于目标物和背景有明显对比的图像。这种方法是只考虑像素值不考虑空间特征的,例如峰谷法、最大熵分割法。
    如下是一维最大熵分割法实现。
    最大熵原理:只掌握关于未知分布的部分知识时,应选取符合这些知识的但是熵值最大的概率分布。因为熵越大,随机变量的不确定性越大,做准确预测的难度越大。

    int maxEntropy(IplImage *src);
    float calEntropy(CvHistogram *hist,int begin,int end);
    
    int main()
    {
        //Mat img =imread("E:/b.jpg",1);
    
        IplImage *src=cvLoadImage("G:\\4.bmp",CV_LOAD_IMAGE_GRAYSCALE); 
        IplImage *dst = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
        int threshold=maxEntropy(src);
         cvThreshold(src, dst, threshold, 255, CV_THRESH_BINARY); 
         //imshow("一维最大熵分割",img);
         cvNamedWindow("一维最大熵分割");
         cvShowImage("一维最大熵分割", dst);
         cvWaitKey(0);
         return 0;
    }
    
    int maxEntropy(IplImage *src)
    {
        assert(src);
        assert(src->depth == 8);  
        assert(src->nChannels == 1);
    
        int sizes=256;
        float range[2]={0,255};
        float *ranges[1]={&range[0]};
        CvHistogram *hist = cvCreateHist(1, &sizes, CV_HIST_ARRAY, ranges, 1);
        cvCalcHist(&src,hist,0,0);
        cvNormalizeHist(hist,0);
    
        int threthold=0;
        int Entropy_max=0;
        for(int i=0;i<sizes;i++)
        {
            float entropy=calEntropy(hist,0,i)+calEntropy(hist,i,sizes);
            if(entropy>=Entropy_max)
                Entropy_max=entropy;
        }
        return Entropy_max;
    }
    
    float calEntropy(CvHistogram *hist,int begin,int end)
    {
        float total=0;//总概率
        for(int i=begin;i<end;i++)
        {
            total+=cvQueryHistValue_1D(hist,i);
        }
        float entropy=0;
        for(int i=begin;i<end;i++)
        {
            float probability=cvQueryHistValue_1D(hist,i);
            if(probability==0)
                continue;
            probability/=total;
            entropy-=probability*log(probability);
        }
    
        return entropy;
    }

    2、自适应阈值法
    在许多情况下,目标和背景的对比度在图像中的各处是不一样的,实际处理时,需要按照具体情况将图像分成若干子区域分别选择阈值,或者动态地根据一定的邻域范围选择每点处的阈值,进行图像分割。
    OTSU法,它是按图像的灰度特性,将图像分成背景和目标2部分。背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致2部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。
    以前在遥感影像灰度阈值分割上尝试了一些自适应阈值法,影像背景地物比较复杂,效果都不太理想。

    3、人工确定

    二、基于边缘的图像分割
    1、差分法
    图像差分,就是把两幅图像的对应像素值相减,以削弱图像的相似部分,突出显示图像的变化部分。【原理都是共通的,这个也是比较简单的变化检测方法】
    2、梯度法
    Canny\Sobel算子等,他们是里面包含有计算梯度幅值和方向的步骤,也是一种梯度算子吧。
    Canny 步骤:首先消除噪声,一般使用高斯平滑滤波;然后计算梯度幅值和方向;然后非极大值抑制,也就是说选择局部范围内的极大值,抑制局部范围内的非极大值;最后是双阈值算法检测和连接,这一步是为了保留主要边缘,剔除不连续的、次要的边缘。
    这里原理解释主要参考:
    http://blog.csdn.net/likezhaobin/article/details/6892176
    代码根据该博主提供的代码进行了重构
    http://blog.csdn.net/likezhaobin/article/details/6892629

    
    /*****
        int* M ;                       //梯度幅值 
        unsigned char* N;            //非极大值抑制结果
        double* Theta ;             //梯度方向 
    ******/
    void Gaussian(unsigned char* nImageData,unsigned char* pCanny,int nWidth,int nHeight);
    void nonMaximumSuppression(unsigned char *pCanny,unsigned char* N,int* M,double* Theta,int nWidth,int nHeight);//极大值抑制
    void doubleThresholdDetection(unsigned char* N,int* M,int nWidth,int nHeight);//双阈值检测
    void TraceEdge(int y, int x, int nThrLow, unsigned char* pResult, int *pMag, int nWidth,int nHeight);
    void main()
    {
        /******彩色图灰度化********/
        IplImage *colorImage=cvLoadImage("G:\\5.jpg",-1);//读图,获取彩色图指针
    
        int width=colorImage->width;
        int height=colorImage->height;
        int sizeofPixel=width*height;//像素数
        IplImage *opencvGrayImage=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);//定义变换后的灰度图指针
        char *gray=(char*)malloc(sizeof(char)*width*height);//存放转换后的灰度像素值
        for(int i=0;i<sizeofPixel;i++)
        {
            uchar b=(uchar)colorImage->imageData[3*i+0];
            uchar g = (uchar)colorImage->imageData[3 * i + 1];  
            uchar r = (uchar)colorImage->imageData[3 * i + 2];  
            gray[i] = r * 0.299 + g * 0.587 + b * 0.114;  
        }
        opencvGrayImage->imageData=gray;
    
        unsigned char* nImageData = new unsigned char[width*height];   //保存图像中的数据 
        for(int j=0; j<height; j++)                                     //获取数据
        {  
            for(int i=0; i<width; i++)  
                nImageData[j*width+i] = (unsigned char)opencvGrayImage->imageData[j*width+i];  
        }  
    
        unsigned char*pCanny = new unsigned char[width*height];        //为平滑后的图像数据分配内存  
        Gaussian(nImageData,pCanny,width,height);//高斯模糊,不太理解
    
        int* M = new int[width*height];                       //梯度幅值 
        unsigned char* N =new unsigned char[width*height];  //非极大值抑制结果
        double* Theta = new double[width*height];             //梯度方向 
        nonMaximumSuppression(pCanny,N,M,Theta,width,height);//非极大值抑制结果
        doubleThresholdDetection(N,M,width,height);//双阈值检测
        opencvGrayImage->imageData=(char*)N;
        cvNamedWindow("GrayImage",CV_WINDOW_AUTOSIZE);  
        cvShowImage("GrayImage",opencvGrayImage);               //显示灰度图  
        cvWaitKey(0);  
        cvDestroyWindow("GrayImage");
    }
    
    void Gaussian(unsigned char* nImageData,unsigned char* pCanny,int nWidth,int nHeight)
    {
        /****高斯滤波****/
        double nSigma = 0.4;                            //定义高斯函数的标准差  
        int nWidowSize = 1+2*ceil(3*nSigma);            //定义滤波窗口的大小  
        int nCenter = (nWidowSize)/2;                   //定义滤波窗口中心的索引
    
    
        double* nData = new double[nWidth*nHeight];                      //两次平滑的中间数据  
    
        //////////////////////生成一维高斯滤波系数//////////////////////////////////    
        double* pdKernal_2 = new double[nWidowSize*nWidowSize]; //定义一维高斯核数组  
        double  dSum_2 = 0.0;                                   //求和,进行归一化        
        ///////////////////////二维高斯函数公式////////////////////////////////////      
        ////                         x*x+y*y                        ///////////////  
        ////                   -1*--------------                ///////////////  
        ////         1             2*Sigma*Sigma                ///////////////  
        ////   ---------------- e                                   ///////////////  
        ////   2*pi*Sigma*Sigma                                     ///////////////  
        ///////////////////////////////////////////////////////////////////////////  
        for(int i=0; i<nWidowSize; i++)  
        {  
            for(int j=0; j<nWidowSize; j++)  
            {  
                int nDis_x = i-nCenter;  
                int nDis_y = j-nCenter;  
                pdKernal_2[i+j*nWidowSize]=exp(-(1/2)*(nDis_x*nDis_x+nDis_y*nDis_y)  
                    /(nSigma*nSigma))/(2*3.1415926*nSigma*nSigma);  
                dSum_2 += pdKernal_2[i+j*nWidowSize];  
            }  
        }  
        for(int i=0; i<nWidowSize; i++)  
        {  
            for(int j=0; j<nWidowSize; j++)                 //进行归一化  
            {  
                pdKernal_2[i+j*nWidowSize] /= dSum_2;  
            }  
        }  
        int x;  
        int y;  
        for(int i=0; i<nHeight; i++)  
        {  
            for(int j=0; j<nWidth; j++)  
            {  
                double dFilter=0.0;  
                double dSum = 0.0;  
                for(x=(-nCenter); x<=nCenter; x++)                     //行  
                {  
                    for(y=(-nCenter); y<=nCenter; y++)             //列  
                    {  
                        if( (j+x)>=0 && (j+x)<nWidth && (i+y)>=0 && (i+y)<nHeight) //判断边缘  
                        {  
                            dFilter += (double)nImageData [(i+y)*nWidth + (j+x)]  
                            * pdKernal_2[(y+nCenter)*nWidowSize+(x+nCenter)];  
                            dSum += pdKernal_2[(y+nCenter)*nWidowSize+(x+nCenter)];  
                        }  
                    }  
                }  
                pCanny[i*nWidth+j] = (unsigned char)dFilter/dSum;  
            }  
        }
    }
    
    void nonMaximumSuppression(unsigned char *pCanny,unsigned char* N,int* M,double* Theta,int nWidth,int nHeight)
    {
        //////////////////同样可以用不同的检测器/////////////////////////  
        /////    P[i,j]=(S[i,j+1]-S[i,j]+S[i+1,j+1]-S[i+1,j])/2     /////  
        /////    Q[i,j]=(S[i,j]-S[i+1,j]+S[i,j+1]-S[i+1,j+1])/2     /////  
        /////////////////////////////////////////////////////////////////  
        double* P = new double[nWidth*nHeight];                 //x向偏导数  
        double* Q = new double[nWidth*nHeight];                 //y向偏导数  
    
    
        //计算x,y方向的偏导数  
        for(int i=0; i<(nHeight-1); i++)  
        {  
            for(int j=0; j<(nWidth-1); j++)  
            {  
                P[i*nWidth+j] = (double)(pCanny[i*nWidth + min(j+1, nWidth-1)] - pCanny[i*nWidth+j] + pCanny[min(i+1, nHeight-1)*nWidth+min(j+1, nWidth-1)] - pCanny[min(i+1, nHeight-1)*nWidth+j])/2;  
                Q[i*nWidth+j] = (double)(pCanny[i*nWidth+j] - pCanny[min(i+1, nHeight-1)*nWidth+j] + pCanny[i*nWidth+min(j+1, nWidth-1)] - pCanny[min(i+1, nHeight-1)*nWidth+min(j+1, nWidth-1)])/2;  
            }  
        }  
        //计算梯度幅值和梯度的方向  
        for(int i=0; i<nHeight; i++)  
        {  
            for(int j=0; j<nWidth; j++)  
            {  
                M[i*nWidth+j] = (int)(sqrt(P[i*nWidth+j]*P[i*nWidth+j] + Q[i*nWidth+j]*Q[i*nWidth+j])+0.5);  
                Theta[i*nWidth+j] = atan2(Q[i*nWidth+j], P[i*nWidth+j]) * 57.3;  
                if(Theta[i*nWidth+j] < 0)  
                    Theta[i*nWidth+j] += 360;              //将这个角度转换到0~360范围  
            }  
        }  
    
        //非极大值抑制
    
        int g1=0, g2=0, g3=0, g4=0;                            //用于进行插值,得到亚像素点坐标值  
        double dTmp1=0.0, dTmp2=0.0;                           //保存两个亚像素点插值得到的灰度数据  
        double dWeight=0.0;                                    //插值的权重
    
        //对边界进行初始化
        for(int i=0; i<nWidth; i++)  
        {  
            N[i] = 0;  
            N[(nHeight-1)*nWidth+i] = 0;  
        }  
        for(int j=0; j<nHeight; j++)  
        {  
            N[j*nWidth] = 0;  
            N[j*nWidth+(nWidth-1)] = 0;  
        }  
        //局部最大值查找
        for(int i=1; i<(nWidth-1); i++)  
        {  
            for(int j=1; j<(nHeight-1); j++)  
            {  
                int nPointIdx = i+j*nWidth;       //当前点在图像数组中的索引值  
                if(M[nPointIdx] == 0)  
                    N[nPointIdx] = 0;         //如果当前梯度幅值为0,则不是局部最大对该点赋为0  
                else  
                {  
                    ////////首先判断属于那种情况,然后根据情况插值///////  
                    ////////////////////第一种情况///////////////////////  
                    /////////       g1  g2                  /////////////  
                    /////////           C                   /////////////  
                    /////////           g3  g4              /////////////  
                    /////////////////////////////////////////////////////  
                    if( ((Theta[nPointIdx]>=90)&&(Theta[nPointIdx]<135)) ||   
                        ((Theta[nPointIdx]>=270)&&(Theta[nPointIdx]<315)))  
                    {  
                        //////根据斜率和四个中间值进行插值求解  
                        g1 = M[nPointIdx-nWidth-1];  
                        g2 = M[nPointIdx-nWidth];  
                        g3 = M[nPointIdx+nWidth];  
                        g4 = M[nPointIdx+nWidth+1];  
                        dWeight = fabs(P[nPointIdx])/fabs(Q[nPointIdx]);   //反正切  
                        dTmp1 = g1*dWeight+g2*(1-dWeight);  
                        dTmp2 = g4*dWeight+g3*(1-dWeight);  
                    }  
                    ////////////////////第二种情况///////////////////////  
                    /////////       g1                      /////////////  
                    /////////       g2  C   g3              /////////////  
                    /////////               g4              /////////////  
                    /////////////////////////////////////////////////////  
                    else if( ((Theta[nPointIdx]>=135)&&(Theta[nPointIdx]<180)) ||   
                        ((Theta[nPointIdx]>=315)&&(Theta[nPointIdx]<360)))  
                    {  
                        g1 = M[nPointIdx-nWidth-1];  
                        g2 = M[nPointIdx-1];  
                        g3 = M[nPointIdx+1];  
                        g4 = M[nPointIdx+nWidth+1];  
                        dWeight = fabs(Q[nPointIdx])/fabs(P[nPointIdx]);   //正切  
                        dTmp1 = g2*dWeight+g1*(1-dWeight);  
                        dTmp2 = g4*dWeight+g3*(1-dWeight);  
                    }  
                    ////////////////////第三种情况///////////////////////  
                    /////////           g1  g2              /////////////  
                    /////////           C                   /////////////  
                    /////////       g4  g3                  /////////////  
                    /////////////////////////////////////////////////////  
                    else if( ((Theta[nPointIdx]>=45)&&(Theta[nPointIdx]<90)) ||   
                        ((Theta[nPointIdx]>=225)&&(Theta[nPointIdx]<270)))  
                    {  
                        g1 = M[nPointIdx-nWidth];  
                        g2 = M[nPointIdx-nWidth+1];  
                        g3 = M[nPointIdx+nWidth];  
                        g4 = M[nPointIdx+nWidth-1];  
                        dWeight = fabs(P[nPointIdx])/fabs(Q[nPointIdx]);   //反正切  
                        dTmp1 = g2*dWeight+g1*(1-dWeight);  
                        dTmp2 = g3*dWeight+g4*(1-dWeight);  
                    }  
                    ////////////////////第四种情况///////////////////////  
                    /////////               g1              /////////////  
                    /////////       g4  C   g2              /////////////  
                    /////////       g3                      /////////////  
                    /////////////////////////////////////////////////////  
                    else if( ((Theta[nPointIdx]>=0)&&(Theta[nPointIdx]<45)) ||   
                        ((Theta[nPointIdx]>=180)&&(Theta[nPointIdx]<225)))  
                    {  
                        g1 = M[nPointIdx-nWidth+1];  
                        g2 = M[nPointIdx+1];  
                        g3 = M[nPointIdx+nWidth-1];  
                        g4 = M[nPointIdx-1];  
                        dWeight = fabs(Q[nPointIdx])/fabs(P[nPointIdx]);   //正切  
                        dTmp1 = g1*dWeight+g2*(1-dWeight);  
                        dTmp2 = g3*dWeight+g4*(1-dWeight);  
                    }  
                }         
                //////////进行局部最大值判断,并写入检测结果////////////////  
                if((M[nPointIdx]>=dTmp1) && (M[nPointIdx]>=dTmp2))  
                    N[nPointIdx] = 128;  
                else  
                    N[nPointIdx] = 0;  
            }  
        }  
    }
    
    void doubleThresholdDetection(unsigned char* N,int* M,int nWidth,int nHeight)
    {
        //双阈值检测,最大的梯度幅值为360
        int nHist[1024];   
        int nEdgeNum;             //可能边界数  
        int nMaxMag = 0;          //最大梯度数  
        int nHighCount; 
        //统计直方图
        for(int i=0;i<1024;i++)  
            nHist[i] = 0;  
        for(int i=0; i<nHeight; i++)  
        {  
            for(int j=0; j<nWidth; j++)  
            {  
                if(N[i*nWidth+j]==128)  
                    nHist[M[i*nWidth+j]]++;  
            }  
        }  
        //获取最大幅值及潜在边缘个数
        nEdgeNum = nHist[0];  
        nMaxMag = 0;                    //获取最大的梯度值        
        for(int i=1; i<1024; i++)           //统计经过“非最大值抑制”后有多少像素  
        {  
            if(nHist[i] != 0)       //梯度为0的点是不可能为边界点的  
            {  
                nMaxMag = i;  
            }     
            nEdgeNum += nHist[i];   //经过non-maximum suppression后有多少像素  
        }  
        //这段代码的意思是,按照灰度值从低到高的顺序,选取前79%个灰度值中的最大的灰度值为高阈值,低阈值大约为高阈值的一半,这是根据经验数据的来的.
        double  dRatHigh = 0.79;  
        double  dThrHigh;  
        double  dThrLow;  
        double  dRatLow = 0.5;  
        nHighCount = (int)(dRatHigh * nEdgeNum + 0.5);  
        int j=1;  
        nEdgeNum = nHist[1];  
        while((j<(nMaxMag-1)) && (nEdgeNum < nHighCount))  
        {  
            j++;  
            nEdgeNum += nHist[j];  
        }  
        dThrHigh = j;                                   //高阈值  
        dThrLow = (int)((dThrHigh) * dRatLow + 0.5);    //低阈值 
        for(int i=0; i<nHeight; i++)  
        {  
            for(int j=0; j<nWidth; j++)  
            {  
                if((N[i*nWidth+j]==128) && (M[i*nWidth+j] >= dThrHigh))  
                {  
                    N[i*nWidth+j] = 255;  
                    TraceEdge(i, j, dThrLow, N, M, nWidth,nHeight);  
                }  
            }  
        }
    }
    
    void TraceEdge(int y, int x, int nThrLow, unsigned char* pResult, int *pMag, int nWidth,int nHeight)  
    {  
        //对8邻域像素进行查询  
        int xNum[8] = {1,1,0,-1,-1,-1,0,1};  
        int yNum[8] = {0,1,1,1,0,-1,-1,-1};  
            long yy,xx,k;  
        for(k=0;k<8;k++)  
        {  
            yy = y+yNum[k];  
            xx = x+xNum[k];  
            if(pResult[yy*nWidth+xx]==128 && pMag[yy*nWidth+xx]>=nThrLow )  
            {  
                //该点设为边界点  
                pResult[yy*nWidth+xx] = 255;  
                //以该点为中心再进行跟踪  
                TraceEdge(yy,xx,nThrLow,pResult,pMag,nWidth,nHeight);  
            }  
        }  
    }  
    

    3、高通滤波
    图像的边缘、细节主要是集中在高频部分,为了突出边缘,则采用高通滤波器让高频通过,而削弱低频部分,对条带状噪声的影像做去噪工作也是有奇效,但是,高通滤波容易产生振铃现象或者伪现象。
    常用滤波器有二维理想高通滤波器、巴特沃斯高通滤波器、指数高通滤波器、梯形高通滤波器。

    步骤:
    1、首先对一副图像进行如下二维傅里叶变换。
    这里写图片描述
    然后F[0,0]是直流分量
    这里写图片描述
    直流分量表示图像较为平滑没有太大变化的部分,其他为交流分量,所以理想的情况应该是保持直流分量而对其他部分进行增幅,但是滤波器是会衰减直流分量的,所以会产生振铃效应,导致图像盲恢复会产生图像信息的损失。
    2、然后选择高通滤波器,如
    二维理想高通滤波器:
    这里写图片描述
    D0是滤波器的阻带半径,而D(u,v)是点到滤波器中央的距离。理想高通的滤波器的振幅特性如下所示
    这里写图片描述
    巴特沃斯高通滤波器:
    这里写图片描述
    巴特沃斯高通滤波器也可以通过改变次数n,对过度特性进行调整。过大的n会造成振铃现象。
    这里写图片描述
    高斯高通滤波器
    这里写图片描述
    高斯滤波器的过度特性很好,所以不会发生振铃现象。
    这里写图片描述

    参考资料:
    https://www.cnblogs.com/fuhaots2009/p/3465149.html
    4、模板匹配
    模板匹配与图像分割交集比较少,目前看的基本是基于形状模型的图像分割,模板匹配对其有一定帮助,局限性挺大的。我同学的毕设老师说模板匹配太低级了,不给用哈哈哈哈
    模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题。它是图像处理中最基本、最常用的匹配方法。模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。
    在 OpenCV 中,提供了相应的函数完成这个操作。
    matchTemplate 函数:在模板和输入图像之间寻找匹配,获得匹配结果图像
    minMaxLoc 函数:在给定的矩阵中寻找最大和最小值,并给出它们的位置
    其中OpenCV 提供了 6 种计算两幅图像相似度的方法。
    差值平方和匹配 CV_TM_SQDIFF
    标准化差值平方和匹配 CV_TM_SQDIFF_NORMED
    相关匹配 CV_TM_CCORR
    标准相关匹配 CV_TM_CCORR_NORMED
    相关匹配 CV_TM_CCOEFF
    标准相关匹配 CV_TM_CCOEFF_NORMED
    具体方法公式可以参考以下链接。

    参考资料http://blog.csdn.net/zhi_neng_zhi_fu/article/details/51029864
    http://blog.csdn.net/liyuanbhu/article/details/49837661

    三、基于区域的图像分割
    1、区域生长法
    首先对每个需要分割的区域找出一个种子像素作为生长的七点,然后将种子像素周围邻域中与种子有相同或相似性质的像素(根据事先确定的生长或相似准则来确定)合并到种子像素所在的区域中。而新的像素继续作为种子向四周生长,直到再没有满足条件的像素可以包括进来,一个区域就生长而成了。
    这个方法有两个关键:一个是种子点怎么选,一个是阈值的限定。原理代码以前po过。
    http://blog.csdn.net/weixin_37051000/article/details/60142281
    2、分水岭算法
    这个怕是一时半会讲不清,地学领域很爱用。
    这里又发展出了多种面向对象的分割方法

    四、分割后处理
    1、数学形态学:膨胀、腐蚀、开运算、闭运算
    2、图像平滑、锐化

    展开全文
  • 对当前比较常用的一些彩色图像分割方 法进行了综述,阐述了基于阈值、基于聚类、基于区域以及基于特定理论的几类分割方法各自的优缺点和应用场景。 最后根据基于过完备字典的稀疏表示能够刻画图像细节信息、实现图像...
  • matlab开发-使用常用方法进行图像分割。它是一种基于聚类的图像阈值。
  • 几种常用图像分割方法

    千次阅读 2018-11-20 16:43:26
    图像分割有很多各种各样的方法:1)基于数学统计的方法(灰度直方图)2)基于纹理的方法3)基于阈值的方法4)基于深度学习的方法5)基于几何数学的方法。当然这五种方法也可以交叉使用,总之,挑选适用的方法效率...
  • 图像分割简介

    千次阅读 2019-09-17 16:34:45
    图像分割需要将图像中不同的像素点进行分类,与物体检测相比,图像分割更加细致,难度更大,之前我分析过FCN,它是利用机器学习的方法进行图像分割,但是图像分割还有其他不同的方法,这也是我在这篇博客里头要提到...
  • 外医学图像分割相关文献进行研究总结的基础上,对国内外常用医学图像分割方法的基本理论和特 点进行了较为全面的论述,对各种分割方法的优缺点及其应用效果进行了总结。 [关键词]医学图像;图像分割;综述
  • 图像分割常用方法

    千次阅读 2017-04-14 17:01:47
    图像分割(Segmentation)指的是将数字图像细分为多个图像子区域(像素的集合)(也被称作超像素)的过程,就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析...
  • 常见的图像分割方法

    千次阅读 2020-05-11 22:57:08
    常见的图像分割方法有以下几种: 1.基于阈值的分割方法 灰度阈值分割法是一种最常用的并行区域技术,它是图像分割中应用数量最多的一类。阈值分割方法实际上是输入图像f到输出图像g的如下变换: 其中,T为阈值;...
  • 常见的图像分割方法有以下几种

    万次阅读 多人点赞 2018-04-19 18:33:08
    常见的图像分割方法有以下几种:1.基于阈值的分割方法 灰度阈值分割法是一种最常用的并行区域技术,它是图像分割中应用数量最多的一类。阈值分割方法实际上是输入图像f到输出图像g的如下变换: 其中,T为阈值;...
  • 数字图像处理中常用图像分割算法有哪些? 1.多数的图像分割算法 2.图像边缘分割 3.图像阈值分割 4.基于区域的分割 5.形态学分水岭算法 多数的图像分割算法 均是基于灰度值的不连续和相似的性质。在前者中,...
  • 图像分割方法及性能评价综述,丁亮,张永平,图像分割是图像处理与计算机视觉的基本问题之一,是图像处理与分析的关键步骤;本文对近年来常用图像分割方法进行综述,介绍了
  • 图像分割算法概述及常用边缘检测算法 Email:whowhoha@outlook.com 一、概述  用计算机进行数字图像处理的目的有两个,一是产生更适合人类视觉观察和识别的图像,二是希望计算机能够自动进行识别和理解图像。无论...
  • 图像分割常用方法介绍

    千次阅读 2017-04-14 17:12:06
    图像分割(Segmentation)指的是将数字图像细分为多个图像子区域(像素的集合)(也被称作超像素)的过程,就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析...
  • 图像分割实验常用matlab代码供参考;包括准确率、召回率等的计算代码
  • 图像处理——常用阈值分割方法及源码

    万次阅读 多人点赞 2018-07-18 20:37:18
     Otsu(大津法或最大类间方差法)使用的是聚类的思想,把图像的灰度数按灰度级分成2个部分,使得两个部分之间的灰度值差异最大,每个部分之间的灰度差异最小,通过方差的计算来寻找一个合适的灰度级别来划分。...
  • 数字图像处理论文关于图像分割的一些算法等等
  • matlab图像分割

    万次阅读 2017-03-29 18:06:43
    (1)基于阈值的分割方法:在阈值分割中,最常用分割方法是直方图阈值分割法。直方图阈值法必须假设每个峰值对应的是一个区域,而峰谷则代表了不同区域的边界值。与灰度图像不同的是,彩色图像有R,G,B,3个分量,...
  • Otsu法是常用的基于阈值的图像分割方法之一,二维Otsu法利用图像的像素灰度值分布及邻域像素的平均灰度分布构成的二维直方图对图像进行阈值分割。由于红外图像具有低对比度、低信噪比、边缘模糊的特点,仅采用二维...
  • 图像分割算法的优缺点比较

    万次阅读 多人点赞 2019-06-11 14:44:14
    基于聚类分析的图像分割方法。 基于小波变换的分割方法。 基于数学形态学方法。 基于人工神经网络的方法。 基于遗传算法的方法。 阈值分割 1、原理 用一个或几个阈值将图像的灰度直方图分成几个类, 认为图像中灰度...
  • (最开始接触医学图像分割时写的综述,写的比较幼稚,传上来的时候格式可能有些乱。需要原文的小伙伴可以加我qq:604395564联系,也欢迎做医学图像处理的小伙伴一起交流学习。自己写的,欢迎转载,但请注明出处哦^_^...
  • 为了解该问题的研究现状、存在问题及发展前景,在广泛调研现有文献和最新成果的基础上,针对2000年之后主流的图像分割方法进行了研究,将之分为四类:基于图论的方法、基于聚类的方法、基于分类的方法以及结合聚类和...
  • 脉冲耦合神经网络(Pulse Coupled Neural Network , PCNN )是一种新型神经网络模型,作为研究图像分割常用方法,一直广受关注。针对目前大量文献关注PCNN模型仿真实现研究的情况,本文基于PCNN模型提出了将最小...
  • 1图像语义分割的概念1.1图像语义分割的概念与原理图像语义分割可以说是图像理解的基石性技术,在自动驾驶系统(具体为街景识别与理解)、无人机应用(着陆点判断)以及穿戴式设备应用中举足轻重。我们都知道,图像...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,957
精华内容 20,382
关键字:

常用图像分割方法