图像分割 订阅
图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像素赋予相同的编号。 [1] 展开全文
图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像素赋予相同的编号。 [1]
信息
分割方法
阈值分割等
外文名
image segmentation
类    型
计算机技术
发展实践
1998
用    途
图像语义识别,图像搜索
中文名
图像分割
学    科
跨学科
图像分割引言
图像分割 图像分割 数字图像处理技术是一个跨学科的领域。随着计算机科学技术的不断发展,图像处理和分析逐渐形成了自己的科学体系,新的处理方法层出不穷,尽管其发展历史不长,但却引起各方面人士的广泛关注。首先,视觉是人类最重要的感知手段,图像又是视觉的基础,因此,数字图像成为心理学、生理学、计算机科学等诸多领域内的学者们研究视觉感知的有效工具。其次,图像处理在军事、遥感、气象等大型应用中有不断增长的需求。1998年以来,人工神经网络识别技术已经引起了广泛的关注,并且应用于图像分割。基于神经网络的分割方法的基本思想是通过训练多层感知机来得到线性决策函数,然后用决策函数对像素进行分类来达到分割的目的。这种方法需要大量的训练数据。神经网络存在巨量的连接,容易引入空间信息,能较好地解决图像中的噪声和不均匀问题。选择何种网络结构是这种方法要解决的主要问题。图像分割是图像识别和计算机视觉至关重要的预处理。没有正确的分割就不可能有正确的识别。但是,进行分割仅有的依据是图像中像素的亮度及颜色,由计算机自动处理分割时,将会遇到各种困难。例如,光照不均匀、噪声的影响、图像中存在不清晰的部分,以及阴影等,常常发生分割错误。因此图像分割是需要进一步研究的技术。人们希望引入一些人为的知识导向和人工智能的方法,用于纠正某些分割中的错误,是很有前途的方法,但是这又增加了解决问题的复杂性。在通信领域中,图像分割技术对可视电话等活动图像的传输很重要,需要把图像中活动部分与静止的背景分开,还要把活动部分中位移量不同的区域分开,对不同运动量的区域用不同的编码传输,以降低传输所需的码率。
收起全文
精华内容
参与话题
问答
  • 图像分割之(一)概述

    万次阅读 多人点赞 2013-01-23 00:23:03
    图像分割之(一)概述 zouxy09@qq.com http://blog.csdn.net/zouxy09    所谓图像分割指的是根据灰度、颜色、纹理和形状等特征把图像划分成若干互不交迭的区域,并使这些特征在同一区域内呈现出相似性,而在...

    图像分割之(一)概述

    zouxy09@qq.com

    http://blog.csdn.net/zouxy09

     

           所谓图像分割指的是根据灰度、颜色、纹理和形状等特征把图像划分成若干互不交迭的区域,并使这些特征在同一区域内呈现出相似性,而在不同区域间呈现出明显的差异性。我们先对目前主要的图像分割方法做个概述,后面再对个别方法做详细的了解和学习。

    1、基于阈值的分割方法

          阈值法的基本思想是基于图像的灰度特征来计算一个或多个灰度阈值,并将图像中每个像素的灰度值与阈值相比较,最后将像素根据比较结果分到合适的类别中。因此,该类方法最为关键的一步就是按照某个准则函数来求解最佳灰度阈值。

    2、基于边缘的分割方法

           所谓边缘是指图像中两个不同区域的边界线上连续的像素点的集合,是图像局部特征不连续性的反映,体现了灰度、颜色、纹理等图像特性的突变。通常情况下,基于边缘的分割方法指的是基于灰度值的边缘检测,它是建立在边缘灰度值会呈现出阶跃型或屋顶型变化这一观测基础上的方法。

    阶跃型边缘两边像素点的灰度值存在着明显的差异,而屋顶型边缘则位于灰度值上升或下降的转折处。正是基于这一特性,可以使用微分算子进行边缘检测,即使用一阶导数的极值与二阶导数的过零点来确定边缘,具体实现时可以使用图像与模板进行卷积来完成。

    3、基于区域的分割方法

          此类方法是将图像按照相似性准则分成不同的区域,主要包括种子区域生长法、区域分裂合并法和分水岭法等几种类型。

           种子区域生长法是从一组代表不同生长区域的种子像素开始,接下来将种子像素邻域里符合条件的像素合并到种子像素所代表的生长区域中,并将新添加的像素作为新的种子像素继续合并过程,直到找不到符合条件的新像素为止。该方法的关键是选择合适的初始种子像素以及合理的生长准则。

            区域分裂合并法(Gonzalez2002)的基本思想是首先将图像任意分成若干互不相交的区域,然后再按照相关准则对这些区域进行分裂或者合并从而完成分割任务,该方法既适用于灰度图像分割也适用于纹理图像分割。

            分水岭法(Meyer1990)是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭。该算法的实现可以模拟成洪水淹没的过程,图像的最低点首先被淹没,然后水逐渐淹没整个山谷。当水位到达一定高度的时候将会溢出,这时在水溢出的地方修建堤坝,重复这个过程直到整个图像上的点全部被淹没,这时所建立的一系列堤坝就成为分开各个盆地的分水岭。分水岭算法对微弱的边缘有着良好的响应,但图像中的噪声会使分水岭算法产生过分割的现象。

    4、基于图论的分割方法

            此类方法把图像分割问题与图的最小割(min cut)问题相关联。首先将图像映射为带权无向图G=<VE>,图中每个节点NV对应于图像中的每个像素,每条边∈E连接着一对相邻的像素,边的权值表示了相邻像素之间在灰度、颜色或纹理方面的非负相似度。而对图像的一个分割s就是对图的一个剪切,被分割的每个区域CS对应着图中的一个子图。而分割的最优原则就是使划分后的子图在内部保持相似度最大,而子图之间的相似度保持最小。基于图论的分割方法的本质就是移除特定的边,将图划分为若干子图从而实现分割。目前所了解到的基于图论的方法有GraphCutGrabCutRandom Walk等。

    5、基于能量泛函的分割方法

           该类方法主要指的是活动轮廓模型(active contour model)以及在其基础上发展出来的算法,其基本思想是使用连续曲线来表达目标边缘,并定义一个能量泛函使得其自变量包括边缘曲线,因此分割过程就转变为求解能量泛函的最小值的过程,一般可通过求解函数对应的欧拉(EulerLagrange)方程来实现,能量达到最小时的曲线位置就是目标的轮廓所在。按照模型中曲线表达形式的不同,活动轮廓模型可以分为两大类:参数活动轮廓模型(parametric active contour model)和几何活动轮廓模型(geometric active contour model)。

           参数活动轮廓模型是基于Lagrange框架,直接以曲线的参数化形式来表达曲线,最具代表性的是由Kasset a1(1987)所提出的Snake模型。该类模型在早期的生物图像分割领域得到了成功的应用,但其存在着分割结果受初始轮廓的设置影响较大以及难以处理曲线拓扑结构变化等缺点,此外其能量泛函只依赖于曲线参数的选择,与物体的几何形状无关,这也限制了其进一步的应用。

           几何活动轮廓模型的曲线运动过程是基于曲线的几何度量参数而非曲线的表达参数,因此可以较好地处理拓扑结构的变化,并可以解决参数活动轮廓模型难以解决的问题。而水平集(Level Set)方法(Osher1988)的引入,则极大地推动了几何活动轮廓模型的发展,因此几何活动轮廓模型一般也可被称为水平集方法。

     

    展开全文
  • 图像分割

    千次阅读 2018-07-03 22:04:58
    一、背景知识图像分割的主要算法:1.基于阈值的分割方法2.基于边缘的分割方法3.基于区域的分割方法4.基于聚类分析的图像分割方法5.基于小波变换的分割方法6.基于数学形态学的分割方法7.基于人工神经网络的分割方法二...

    一、背景知识

    图像分割的主要算法:

    1.基于阈值的分割方法

    2.基于边缘的分割方法

    3.基于区域的分割方法

    4.基于聚类分析的图像分割方法

    5.基于小波变换的分割方法

    6.基于数学形态学的分割方法

    7.基于人工神经网络的分割方法

    二、分类介绍

    1.基于阈值的分割方法:

    阈值分割方法:就是用一个或几个阈值将图像的灰度直方图分成几个类,认为图像中灰度值在同一类中的像素属于同一物体。由于是直接利用图像的灰度特性,因此计算方便简明、实用性强。显然,阈值分割方法的关键和难点是如何取得一个合适的阈值。而实际应用中,阈值设定易受噪声和光亮度影响。

    近年来的方法有:用最大相关性原则选择阈值的方法、基于图像拓扑稳定状态的方法、Yager测度极小化方法、灰度共生矩阵方法、方差法、熵法、峰值和谷值分析法等,其中,自适应阈值法、最大熵法、模糊阈值法、类间阈值法是对传统阈值法改进较成功的几种算法。更多的情况下,阈值的选择会综合运用2种或2种以上的方法,这也是图像分割发展的一个趋势。

    .基于阈值的分割方法特点

    阈值分割的优点是计算简单、运算效率较高、速度快。全局阈值对于灰度相差很大的不同目标和背景能进行有效的分割。当图像的灰度差异不明显或不同目标的灰度值范围有重叠时,应采用局部阈值或动态阈值分割法。另一方面,这种方法只考虑像素本身的灰度值,一般不考虑空间特征,因而对噪声很敏感。在实际应用中,阈值法通常与其他方法结合使用。

    2.基于边缘的分割方法:

    基于边缘检测的分割方法试图通过检测包含不同区域的边缘来解决分割问题,是最常用的方法之一。通常不同的区域之间的边缘上像素灰度值的变化往往比较剧烈,这是边缘检测得以实现的主要假设之一。常用灰度的一阶或者二阶微分算子进行边缘检测。常用的微分算子有一次微分(sobel算子,Robert算子等),二次微分(拉普拉斯算子等)和模板操作(Prewit算子,Kirsch算子等)

    特点

    基于边缘的分割方法其难点在于边缘检测时抗噪性和检测精度之间的矛盾。若提高检测精度,则噪声产生的伪边缘会导致不合理的轮廓;若提高抗噪性,则会产生轮廓漏检和位置偏差。为此,人们提出各种多尺度边缘检测方法,根据实际问题设计多尺度边缘信息的结合方案,以较好的兼顾抗噪性和检测精度。

    3.基于区域的分割方法:

    区域分割的实质就是把具有某种相似性质的像素连通,从而构成最终的分割区域。它利用了图像的局部空间信息,可有效地克服其他方法存在的图像分割连续空间小的缺点。在此类方法中:

    (1)如果从全图出发,按区域属性特征一致的准则决定每个像元的区域归属,形成区域图,常称之为区域生长的分割方法。(2)如果从像元出发,按区域属性特征一致的准则,将属性接近的连通像元聚集为区域,则是区域增长的分割方法。

    (3)若综合利用上述两种方法,就是分裂合并的方法。它是先将图像分割成很多的一致性较强的小区域,再按一定的规则将小区域融合成大区域,达到分割图像的目的。

    特点

    基于区域的分割方法往往会造成图像的过度分割,而单纯的基于边缘检测方法有时不能提供较好的区域结构,为此可将基于区域的方法和边缘检测的方法结合起来,发挥各自的优势以获得更好的分割效果。


    4.基于聚类分析的图像分割方法:

    特征空间聚类法进行图像分割是将图像空间中的像素用对应的特征空间点表示,根据它们在特征空间的聚集对特征空间进行分割,然后将它们映射回原图像空间,得到分割结果。其中,K均值、模糊C均值聚类(FCM)算法是最常用的聚类算法。K均值算法先选K个初始类均值,然后将每个像素归入均值离它最近的类并计算新的类均值。迭代执行前面的步骤直到新旧类均值之差小于某一阈值。模糊C均值算法是在模糊数学基础上对K均值算法的推广,是通过最优化一个模糊目标函数实现聚类,它不像K均值聚类那样认为每个点只能属于某一类,而是赋予每个点一个对各类的隶属度,用隶属度更好地描述边缘像素亦此亦彼的特点,适合处理事物内在的不确定性。利用模糊C均值(FCM)非监督模糊聚类标定的特点进行图像分割,可以减少人为的干预,且较适合图像中存在不确定性和模糊性的特点。

    聚类方法应注意几个问题:

    (1)聚类的类数如何确定。

    (2)怎样确定聚类的有效性准则。

    (3)聚类中心的位置和特性事先不清楚时,如何设置初始值。

    (4)运算的开销。

    并且FCM算法对初始参数极为敏感,有时需要人工干预参数的初始化以接近全局最优解,提高分割速度。另外,传统FCM算法没有考虑空间信息,对噪声和灰度不均匀敏感。

    5.基于小波变换的分割方法:

    基于小波变换的阈值图像分割方法的基本思想是,首先由二进小波变换将图像的直方图分解为不同层次的小波系数,然后依据给定的分割准则和小波系数选择阈值门限,最后利用阈值标出图像分割的区域。

    整个分割过程是从粗到细,有尺度变化来控制,即起始分割由粗略的L2(R)子空间上投影的直方图来实现,如果分割不理想,则利用直方图在精细的子空间上的小波系数逐步细化图像分割。分割算法的计算馈与图像尺寸大小呈线性变化。小波变换为信号在不同尺度上的分析和表征提供了一个精确和统一的框架。从图像分割的角度来看,小波分解提供了一个数学上完备的描述;小波变换通过选取合适的滤波器,可以极大地减少或去除所提取的不同特征之间的相关性,不仅具有“变焦”特性,而且在实现上有快速算法。

    特点

    小波变换是一种多尺度、多通道的分析工具它是空域和频域的局域变换,因而能有效地从信号中提取信息,通过伸缩和平移等运算功能对函数或信号进行多尺度分析,解决了傅立叶变换不能解决的许多问题。近年来多进制小波开始用于边缘检测。另外,利用正交小波基的小波变换也可提取多尺度边缘,并可通过对图像奇异度的计算和估计来区分一些边缘的类型。

    6.基于数学形态学的分割方法:

    数学形态学是一种非线性滤波方法,可以用于抑制噪声、特性提取、边缘检测、图像分割等图像处理问题。数学形态学首先被用来处理二值图像,后来也被用来处理灰度图像,现在又有学者开始用软数学形态学和模糊形态学来解决计算机视觉方面的问题。数学形态学的特点是能将复杂的形状进行分解,并将有意义的形状分量从无用的信息中提取出来。

    它的基本思想是利用一个称为结构元素的探针来收集图像的信息,当探针在图像中不断的移动时,不仅可根据图像各个部分间的相互关系来了解图像的结构特征,而且利用数学形态学基本运算还可以构造出许多非常有效的图像处理与分析方法。

    其基本的形态运算是腐蚀与膨胀。腐蚀具有使目标缩小、目标内孔增大以及外部孤立噪声消除的效果;而膨胀是将图像中与目标物体接触的所有背景点合并到物体中的过程,结果是使目标增大、孔径缩小,可以增补目标中的空间,使其形成连通域。数学形态学中另一对基本运算方法是开运算和闭运算。开运算具有消除图像是细小物体,并在物体影响纤细处分离物体和平滑较大物体边界的作用;闭运算具有填充物体影像内细小空间, 接邻近物体和平滑边界的作用。

    特点

    数学形态学应用于图像分割,具有定位效果好、分割精度高、抗噪声性能好的特点。同时这种方法也有着自身的局限性:由于在图像处理的前期工作中,采用数学形态学的开()运算,进行图像处理后,依然存在大量与目标不符的短线和孤立点;由于预处理工作的不彻底,还需要进行一系列的基于点的开()运算,因此运算速度明显下降。如何将数学形态学与其它方法综合运用以克服这些缺陷,将是数学形态学以后的工作方向。连接邻近物体和平滑边界的作用。

    7.基于人工神经网络的分割方法:

    近年来,人工神经网络识别技术已经引起了广泛的关注,并应用于图像分割。基于神经网络的分割方法的基本思想是通过训练多层感知机来得到线性决策函数,然后用决策函数对像素进行分类来达到分割的目的

    FCN 的引入:

      

          上图红色部分 对应CNN分类网络的最后三层,也就是 FC 全连接,通过 Softmax 得到一个1000维的向量(基于Imagenet的图像分类),表示1000个不同的分类对应的概率,“tabby cat” 作为概率最高的结果。

          下图蓝色部分将 分类网络对应的最后三层全连接 替换成了 卷积。整个网络全部通过卷积连接,so called 全卷积。这么做的目的是什么呢?

    ● 通过像素分类来定义语义分割

           全卷积网络的输出是一张分割图,如何输出这张分割图呢? 通过卷积,图像的分辨率逐渐降低,这里需要 引入一个概念,就是上采样,即将低分辨率的图像放大到和原始图像同分辨率上,这是一个关键点。比如经过5次卷积(pooling)后,图像的分辨率依次缩小了2,4,8,16,32倍。对于最后一层的输出图像,需要进行32倍的上采样,得到原图大小一样的图像。

           这个上采样是通过 反卷积(DeConvolution)实现的。来直观看一下反卷积的过程:

            

           加上反卷积过程,整个的网络可以描述成:

         

           由于前面采样部分过大,有时候会导致后面进行反卷积得到的结果分辨率比较低,导致一些细节丢失,解决的一个办法是 将 第 3|4|5 层反卷积结果叠加,结果我们就不贴了,肯定是上采样倍数越小,结果越好,来看叠加示意图(这种方式应该不陌生): 

            

    三. FCN 的改进

           虽然 FCN引领了CNN基于语义分割的方向,但仍有很多地方需要改进,比如上采样导致的像素分割不精细,效率也不够快等等,我们相信一定有办法让其 更高效、更精细。这里提到的一个 方法就是结合 CRF

           CRF 全称是 Conditional Random Field,中文叫 “条件随机场”,首先来理解什么是随机场,一堆随机的样本就可以理解为是随机场,假设这些样本之间有关联关系,就成立条件随机场,CRF 最早在深度学习的 NLP 领域有比较多的应用,可以理解为语境的上下文关系,可以参考下面这篇文章:

           Introduction to Conditional Random Fields

           第一个改进 来自于 UCLA 的 Liang-Chieh Chen,在像素分类后叠加了一个 Fully Connected Conditional Random Fields(全连接的条件随机场)。

           论文地址:Semantic image segmentation with deep convolutional nets and fully connected crfs

            

           通过上图示意可以看到,Fully Connected CRF 在前面 FCN 输出的基础上,以全连接的形式,实现了后处理过程,使得像素分割更加细致,具体请参考论文。


           接下来的改进有 通过 RNN + CRF 的idea:

           参考论文:Conditional random fields as recurrent neural networks

           根据实验对比效果来看,相当不错(注:DeepLab 就是上面的 Full connected CRF方法): 

            

           针对FCN的改进会在近两年一直持续,作者最关注的还是,Mask-RCNN,将目标检测与分割一起work的方法,接下来在下一篇文章介绍!

           “桃李不言,下自成蹊”,FCN 当真是属于这个级别的贡献,引领了在这条道路上的每一次Follow。


    四. 实例分割(Instance Segment)

           实例分割 与 语义分割的区别是要区分出每个目标(不仅仅是像素),相当于 检测+分割,通过一张图来直观理解一下:

            

     关于实例分割的一篇典型论文Mask RCNN,可以参考【Mask RCNN】代码实现可以参考【浅入浅出TensorFlow 8 - 行人分割

    特点

    用人工神经网络的方法分割图像,需要大量的训练数据。神经网络存在巨量的连接,容易引入空间信息,能较好地解决图像中的噪声和不均匀问题。选择何种网络结构是这种方法要解决的主要问题。

    8.基于遗传学算法的分割方法:

    遗传算法(GA),是一种模拟自然选择和遗传机制的搜索和优化过程,它具有很强的全局优化搜索能力,是一种具有广泛适用性的自适应搜索方法。它在搜索空间中是在种群中而不是在单点上进行寻优,它在求解过程中使用遗传操作规则而不是确定性规则来工作。这些特点使得遗传算法很适于应用在图像分割中,尤其是阈值分割法以及区域生长法中。利用GA的全局寻优能力及对初始位置的不敏感特性,可以改进图像分割的性能。

    特点

    遗传算法应用于图像分割,其难点在于适应度函数的选择以及交叉概率和变异概率的确定。GA还有可能收敛于局部最优。可考虑使用能够自适应设置交叉概率和变异概率自适应遗传算法以及和模拟退火法相结合的混合遗传算法。

    参考:https://blog.csdn.net/qq_28942201/article/details/79376188

              https://blog.csdn.net/linolzhang/article/details/71698570

    展开全文
  • 十六、数字图像处理之图像分割

    万次阅读 多人点赞 2019-05-13 09:13:18
    图像分割(一)点、线和边缘检测(1)点检测(2)线检测(3)使用函数edge的边缘检测(二)使用霍夫变换的线检测(三)阈值处理(1)基础知识(2)基本全局阈值处理(3)使用Otsu's方法的最佳全局阈值处理(4)使用...

    说明:图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像索赋予相同的编号。(来自百度百科)

    (一)点、线和边缘检测

    (1)点检测

    概念:将嵌在一幅图像的恒定区域或亮度几乎不变的区域里的孤立点的检测,就是点检测。可以用点检测的模板来将孤立的点检测出来:这个模板的作用就是当模板中心是孤立点时,模板的相应最强,而在非模板中心时,相应为零。
    在这里插入图片描述
    在MATLAB中进行点检测操作,基本语法为:

    g = abs(imfilter(tofloat(f),w))>=T;  %g是包含检测点的图像;f是输入图像;w是点检测模板
    

    运用上面的语法编写实验代码:

    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0903(a).tif');
    subplot(121),imshow(f);
    w = [-1 -1 -1;-1 8 -1;-1 -1 -1];
    g = abs(imfilter(tofloat(f),w));
    T = max(g(:));  %在滤波后图像中选择的最大值
    g = g >=T;
    subplot(122),imshow(g);
    

    在这里插入图片描述
    点检测的另一种方法是在大小为m×n的所有邻点中寻找一些点,最大值和最小值的差超出了T的值,可以用函数ordfilt2进行操作:

    g = ordfilt2(f,m*n,ones(m,n))-ordfilt2(f,1,ones(m,n));
    g = g>=T;
    

    (2)线检测

    线检测比点检测更加复杂一些,模板如图所示:
    在这里插入图片描述
    同样的,当检测的线是在中间那行或者是由“2”组成的行或列中,则此时的相应最大,其他部分的相应为零。

    编写实验代码:

    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0513(a).tif');
    subplot(231),imshow(f),title('原始图像');
    w = [2 -1 -1;-1 2 -1;-1 -1 2];
    g = imfilter(tofloat(f),w);
    subplot(232),imshow(g,[]),title('45°处理后的图像');
    gtop = g(1:120,1:120);
    gtop = pixeldup(gtop,4);
    subplot(233),imshow(gtop,[]),title('左上角放大的图像');
    gbot = g(end -119:end,end -119:end);
    gbot = pixeldup(gbot,4);
    subplot(234),imshow(gbot,[]),title('右下角放大的图像');
    g =abs(g);
    subplot(235),imshow(g,[]),title('绝对值的图像');
    T =max(g(:));
    g =g >=T;
    subplot(236),imshow(g),title('所有点满足g>=T的图像');
    

    在这里插入图片描述在这里插入图片描述实验分析: 在进行45°的边缘检测中,只能够检测到45°或者135°的边缘,并在matlab中进行显示,发现在第二幅图中,45°的边缘检测并不是清楚的看出45°的边缘,而只能看到由点组成的边缘,这是因为原图像中基本没有呈对角线的线条,因此并不能显示对角线的边缘。绝对值的图像是将图像变成了二值图像(只有黑与白),比灰度图像更加清晰看出检测到的线条边缘。

    (3)使用函数edge的边缘检测

    以上两种方法在图像分割中很重要,但是所常用的方法是边缘检测,这种方法是检测亮度的不连续性。这样的不连续是用一阶和二阶导数来检测的。
    首先,我们先介绍二阶函数的梯度向量公式:
    在这里插入图片描述
    这个向量的幅值可以简化为如下形式:通常使用梯度的幅值或近似值来作为“梯度”。
    在这里插入图片描述
    梯度向量的基本性质是:梯度向量指向(x,y)坐标处f的最大变化率方向。
    最大变化率处发生的角度是:
    在这里插入图片描述
    在图像处理工具箱中,可以使用函数edge来作为边缘估计器。

    [g,t] = edge(f,'method',parameters)
    

    在这里插入图片描述下面分别介绍表格中的边缘检测算子:

    1. sobel边缘检测算子
      在这里插入图片描述
      调用语法是:
    [g,t] = edge(f,'sobel',T,dir)  %T是阈值,dir是边缘检测首选方向:'horizontal'、'vertical'、‘both’
    
    1. prewitt边缘检测算子
      在这里插入图片描述
      调用语法为:(较容易产生噪声)
    [g,t] = edge(f,'prewitt',T,dir)  %T是阈值,dir是边缘检测首选方向:'horizontal'、'vertical'、‘both’
    
    1. Roberts边缘检测算子
      在这里插入图片描述
      调用语法为:
    [g,t] = edge(f,'roberts',T,dir)  %T是阈值,dir是边缘检测首选方向:'horizontal'、'vertical'、‘both’
    
    1. LoG检测算子
      高斯函数:
      在这里插入图片描述
      这个公式表示的是平滑函数。如果此函数和图像进行卷积,则图像会变得模糊,且模糊的程度是由σ决定的。这个函数的拉普拉斯算法是:
      在这里插入图片描述
      这个函数称为LoG算子。原理是:由于求二阶导数是线性操作,所以用这个函数卷积这幅图像与先用平滑函数对图像卷积,再对结果进行拉普拉斯计算的结果是一样的。

    这样会得到两种效果:一种是平滑图像,减少了噪声;另一种是计算拉普拉斯,从而产生双边缘图像,然后在双边缘之间定位由发现的零交叉组成的边缘。

    调用语法为:

    [g,t] = edge(f,'log',T,sigma)  %T是阈值,sigma是标准差,默认为2
    
    1. 零交叉检测算子
      这种算子与LoG方法类似,不同之处在于卷积使用特殊的滤波函数H来完成的。
      调用语法为:
    [g,t] = edge(f,'zerocross',T,H)  %T是阈值
    
    1. Canny检测算子
      这种算子是edge函数中最强的边缘检测算子
      (1)图像用指定了标准差σ的高斯滤波器来平滑,用来减少噪声;
      (2)局部梯度和边缘方向在每个点都进行计算。边缘点被定义为梯度方向上局部强度最大的点。
      (3)在(2)中决定的边缘点在梯度幅度图像上给出脊。然后算法追踪所有脊的顶部,设置所有的不在脊的顶部的像素为零。因此在输出中给出一条细线,这是非最大值抑制处理。脊像素使用称为“滞后阈值”的技术进行阈值处理,这种技术以使用两个阈值为基础,即T1和T2,且T1<T2。值大于T2的脊像素称为强边缘像素,T1和T2之间的脊像素称为弱边缘像素。
      (4)算法用合并8连接的弱像素点到强像素点的方法执行边缘连接。
      调用语法为:
    [g,t] = edge(f,'canny',T,sigma)  %T是向量=[T1,T2];sigma是标准差,默认为1
    

    编写实验代码:

    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0309(a).tif');
    subplot(231),imshow(f),title('原始图像');
    [gv,t] = edge(f,'sobel','vertical');
    subplot(232),imshow(gv),title('默认阈值垂直的sobel图像');
    t
    gv = edge(f,'sobel',0.15,'vertical');
    subplot(233),imshow(gv),title('阈值0.15垂直的sobel图像')
    gboth = edge(f,'sobel',0.15);
    subplot(234),imshow(gboth),title('阈值为0.15垂直水平的sobel图像')
    wneg45 = [-2 -1 0;-1 0 1;0 1 2];
    gneg45 = imfilter(tofloat(f),wneg45,'replicate');
    T =0.3*max(abs(gneg45(:)));
    gneg45 = gneg45>=T;
    subplot(235),imshow(gneg45),title('阈值45°边缘图像')
    

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

    在这里插入图片描述实验分析: 当参数是默认垂直的sobel边缘检测时,得到边缘细节是垂直的,水平的边缘线是没有能够检测出来的。当加入参数0.15之后,之前能够检测到的细节却不能够检测出来了,是因为这已经超出了阈值的范围;当采用垂直水平的边缘检测,将之前没有能够检测出的水平线能够检测并显示出来了;当所检测的边缘线是45°的时候,该算法只能够检测到45°或135°的边缘线条,并显示出来。

    sobel、Log和canny边缘检测算子进行比较,编写实验代码:

    f = tofloat(f);
    subplot(221),imshow(f),title('原始图像')
    [gSobel_dafault,ts] = edge(f,'sobel');
    [gLog_dafault,tlog] = edge(f,'log');
    [gCanny_dafault,tc] = edge(f,'canny');
    subplot(222),imshow(gSobel_dafault),title('默认的sobel图像');
    subplot(223),imshow(gLog_dafault),title('默认的log图像');
    subplot(224),imshow(gCanny_dafault),title('默认的canny图像');
    
    gSobel_best = edge(f,'sobel',0.05);
    gLog_best = edge(f,'log',0.003,2.25);
    gCanny_best = edge(f,'canny',[0.04 0.1],1.5);
    subplot(222),imshow(gSobel_best),title('最好效果的sobel图像');
    subplot(223),imshow(gLog_best),title('最好效果的log图像');
    subplot(224),imshow(gCanny_best),title('最好效果的canny图像');
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述实验分析: 同样的一幅图像,使用默认的sobel边缘检测得到的图像中线条是比较其他两种是比较少的,而且获取的边缘细节不是很完整,缺失了很多重要的细节,比如说草地上的细节等。但是在最佳的sobel边缘检测中,所得到的图像是比较完整的,线条细节基本上都被获取并显示出来,相比较其他两种方法,所得到的边缘细节是最完整的。在canny边缘检测中,默认参数的canny检测是最好的,所获得细节是最多的,其边缘基本都可以完整的检测到。

    (二)使用霍夫变换的线检测

    在理想情况下,只能产生边缘上的像素,为了更好的得到边缘特性,因此下面介绍霍夫变换的线检测方法。
    霍夫变换:是一种特征检测(feature extraction),被广泛应用在图像分析(image analysis)、计算机视觉(computer vision)以及数位影像处理(digital image processing)。霍夫变换是用来辨别找出物件中的特征,例如:线条。他的算法流程大致如下,给定一个物件、要辨别的形状的种类,算法会在参数空间(parameter space)中执行投票来决定物体的形状,而这是由累加空间(accumulator space)里的局部最大值(local maximum)来决定。(来自百度百科)

    霍夫变换的原理:

    我们将用极坐标系来表示直线。此时,直线的表达式为:
    在这里插入图片描述
    将其化简为:
    在这里插入图片描述
    一般来说,一条直线能够通过在平面θ-ρ 寻找交于一点的曲线数量来进行检测。 越多曲线交于一点也就意味着这个交点表示的直线由更多的点组成.。一般来说我们可以通过设置直线上点的阈值来定义多少条曲线交于一点,此时认为检测到了一条直线。霍夫线变换要做的就是:它追踪图像中每个点对应曲线间的交点。 如果交于一点的曲线的数量超过了 阈值, 那么可以认为这个交点所代表的参数对 (θ, ρ) 在原图像中为一条直线。

    在图像处理工具箱中提供了以下函数:
    函数hough实现了所描述的概念;
    函数houghpeaks寻找霍夫变换的峰值(累加单元的高计数);
    函数houghlines在原图像上提取线段。

    1. 函数hough
      调用函数:
     [H,theta,rho] = hough(f)   
     或 [H,theta,rho] = hough(f,'ThetaRes',val1,'RhoRes',val2) 
    

    其中,H是霍夫变换矩阵,theta和rho是ρ和θ值向量。f是二值图像,val1是0-90的标量,指定沿θ轴霍夫变换的间距(默认为1);val2是0<val2<hypot(size(I,2),size(I,2))的实际量,指定沿ρ轴的霍夫变换的间距(默认为1)。

    编写实验代码:

    f = zeros(101,101);
    f(1,1) = 1;f(101,1) = 1;f(1,101) = 1;
    f(101,101) = 1;f(51,51) = 1;
    H = hough(f)
    imshow(H,[])
    
     [H,theta,rho] = hough(f);
     imshow(H,[],'XData',theta,'YData',rho,'InitialMagnification','fit')
     axis on,axis normal
     xlabel('\theta'),ylabel('\rho')
    

    在这里插入图片描述
    在这里插入图片描述实验分析: 三条曲线(直线也可以考虑为曲线)在±45°处的交点指出:f中有两组三个共线的点。两条曲线在(ρ,θ)=(0,-90)、(-100,-90)、(0,0)和(100,0)处的交点指出:有4组位于垂直线和水平线上的共线点。(需要将图像放大以方便观察其坐标)

    1. 函数houghpeaks:寻找霍夫变换的峰值(累加单元的高计数)

    调用语法:

    peaks = houghpeaks(H,NumPeaks)
    或 peaks = houghpeaks(H,‘Threshold’,val1,'NHoodSize',val2)
    

    其中,val1可以从0到Inf变换,默认是0.5*max(H(:)),val2是指定量围绕峰值的邻域大小。
    这个过程的基本思想是:通过把峰值的直接邻域中的霍夫变换单元置0来清理峰值。

    1. 函数houghlines:当峰值在霍夫变换中被识别出来,则可用此函数来决定线的起始点和终点。
      调用函数:
    lines = houghlines(f,theta,rho,peaks)
    或lines = houghlines(f,'FillGap',val1,'MinLength',val2)
    

    其中,theta和rho是来自函数hough的输出,peaks是来自houghpeaks的输出。val1指定了与相同的霍夫变换相关的两条线段的距离。当两条线段之间的鹅咀里小于指定的值时,则把线段合并为一条线段(默认20);val2指定合并的线是保留还是去掉,如果合并的线比val2指定的值短,则丢掉(默认是40)。

    编写实验代码:

    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig1006(a).tif');
    subplot(131),imshow(f),title('原始图像');
    [H,theta,rho] = hough(f,'ThetaRes',0.2) 
    subplot(132),imshow(H,[ ],'XData',theta,'YData',rho,'InitialMagnification','fit')
    axis on,axis normal
    xlabel('\theta'),ylabel('\rho')
    
    peaks =houghpeaks(H,5);
    hold on
    plot(theta(peaks(:,2)),rho(peaks(:,1)),'linestyle','none','marker','s','color','w')
    
    lines = houghlines(f,theta,rho,peaks);
    subplot(133),imshow(f);
    for k = 1:length(lines)
    xy = [lines(k).point1;lines(k).point2];
    plot(xy(:,1),xy(:,2),'LineWidth',4,'Color',[0.8 0.8 0.8]);
    end
    

    (三)阈值处理

    (1)基础知识

    一般情况下,一张图片分为前景和背景,我们感兴趣的一般的是前景部分,所以我们一般使用阈值将前景和背景分割开来,使我们感兴趣的图像的像素值为1,不感兴趣的我0,有时一张图我们会有几个不同的感兴趣区域(不在同一个灰度区域),这时我们可以用多个阈值进行分割,这就是阈值处理。
    单个阈值:
    在这里插入图片描述
    两个阈值:
    在这里插入图片描述
    示意图如下:
    在这里插入图片描述

    (2)基本全局阈值处理

    一般选取阈值就是图像直方图的视觉检测。将区分度大的两个灰度级部分之间进行划分,取T为阈值来分开它们。在此基础上学习一种自动地选择阈值的算法,方法如下:

    1. 针对全局阈值选择初始估计值T;
    2. 用T分割图像,G1是所有灰度值大于T的像素组成,G2是所有灰度值小于等于T的像素组成;
    3. 分别计算G1和G2区域内的平均灰度值m1和m2;
    4. 计算出新的阈值,取他们的m1和m2平均值数;
    5. 重复步骤2.-4.,直到在连续的重复中,T的差异比预先设定的参数小为止;
    6. 使用函数im2bw分割图像:g = im2bw(f,T/den)

    编写实验代码:

    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0309(a).tif');
    f = imnoise(f,'gaussian');
    count = 0;
    T = mean2(f);
    done = false;
    while ~done
    count  = count+1;
    g = f>T;
    Tnext = 0.5*(mean(f(g))+mean(f(~g)));
    done = abs(T-Tnext)<0.5;
    T =Tnext;
    end
    
    count
    T
    
    g = im2bw(f,T/255);
    subplot(131),imshow(f),title('带噪声的图像');
    subplot(132),imhist(f),title('图像的直方图');
    subplot(133),imshow(g),title('全局阈值分割的结果')
    

    在这里插入图片描述
    在这里插入图片描述
    实验分析: count是表示含有的灰度级数目,则T表示阈值。当我们对图像进行噪声处理时,基本全局阈值分割出来的结果也会或多或少带有一些噪声,使得图像并不是很美观。因此下面的方法将对含有噪声的图像进行修改。

    (3)使用Otsu’s方法的最佳全局阈值处理

    Otsu’s方法的最佳方法是选择阈值k,最大类间方差σ2(k)来定义的:在这里插入图片描述
    当设置的方差越大,则完全分割一幅图像的阈值就会越接近。公式中的k就是我们所要寻找的最佳阈值,当k不唯一时,则将所有的最佳阈值进行取平均值即可。

    调用的语法是:

    [T,SM] = graythresh(f)   %SM是可分性度量,T是归一化的阈值
    

    编写实验代码:

    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0309(a).tif');
    f = imnoise(f,'gaussian');
    [T,SM] = graythresh(f)
    T*255
    

    (基本全局算法)一般来说,高SM值说明灰度分成两类的可能性比较高。
    在这里插入图片描述

    f2 = imread('C:\Users\Public\Pictures\Sample Pictures\Fig1014(a).tif');
    subplot(221),imshow(f2),title('原始图像');
    subplot(222),imhist(f2),title('原始图像直方图');
    count = 0;
    T = mean2(f2);
    done = false;
    while ~done
    count  = count+1;
    g = f2>T;
    Tnext = 0.5*(mean(f2(g))+mean(f2(~g)));
    done = abs(T-Tnext)<0.5;
    T =Tnext;
    end
    g = im2bw(f2,T/255);
    subplot(223),imshow(g,[]),title('用基本全局算法分割结果')
    [T,SM] = graythresh(f2);
    SM
    T*255
    g = im2bw(f2,T);
    subplot(224),imshow(g),title('用Otsu’s算法分割结果')
    

    在这里插入图片描述
    在这里插入图片描述实验分析: 可以看出,用基本全局阈值处理时细胞的分割效果并不是很好,没有能够分割清楚,是由于前景和背景的灰度级比较相近而不能够完全分离开,因此当使用了otsu’s算法进行分割时,可以完全将细胞(前景)和背景分割开来。尽管分离度的度量值比较低,但是还是可以准确地从背景中提取细胞。

    (4)使用图像平滑改进全局阈值处理

    噪声可以影响阈值的选择,当噪声不能够在源头减少,在阈值处理之前可以将图像进行平滑处理,这样可以更好地进行阈值处理。

    编写实验代码:

    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0513(a).tif');
    subplot(241),imshow(f),title('原始图像');
    fn = imnoise(f,'gaussian',0,0.038);
    subplot(242),imshow(fn),title('具有高斯噪声的图像');
    subplot(243),imhist(fn),title('具有高斯噪声的直方图');
    Tn = graythresh(fn);
    gn = im2bw(fn,Tn);
    subplot(244),imshow(gn),title('用otsu’s分割的图像');
    w = fspecial('average',5);
    fa = imfilter(fn,w,'replicate');
    subplot(245),imshow(fa),title('平滑后的图像');
    subplot(246),imhist(fa),title('平滑后的直方图');
    Ta = graythresh(fa);
    ga =im2bw(fa,Ta);
    subplot(247),imshow(ga),title('平滑后并用otsu’s分割的图像');
    

    在这里插入图片描述在这里插入图片描述实验分析: 当加入高斯噪声的图像,所显示的直方图并不能使用阈值处理进行分割图像,所以经过otsu’s全局阈值处理操作后发现,原始图像和噪声并不能够分离开。当使用平滑滤波器进行图像改善之后,从其直方图看出,可以使用阈值处理进行分割图像了,所以最后的效果图显示,图像与噪声分割开来,因此可以使用otsu’s全局阈值处理对图像进行操作。

    (5)使用边缘改进全局阈值处理

    边缘改进的阈值处理:主要是处理那些位于或接近物体和背景间边缘的像素,使得这些像素分离开的操作。

    具体算法过程如下:

    1. 用一种边缘查找方式计算图像的模板的值。
    2. 通过百分比指定阈值。由于计算的边缘模板值中有很多噪声,所以可以将计算值排序,并选择百分比相对高的值(大于百分下的值的阈值)作为阈值。
    3. 根据指定的阈值,对第一步的图像边缘的值进行选择。使高于阈值的像素点值为1,低于的值为零,由此选择出部分边缘点的二值图像(模板)。
    4. 用刚才计算出来的模板与原图像相乘,获得一幅新的图像。
    5. 对新的图像使用otsu进行分割。

    用自定义的函数percentile2i来计算灰度值I的对应指定的百分比:

    I = percentile2i(h,p)
    

    编写实验一代码:基于梯度边缘信息改进全局阈值处理

    f = tofloat(imread('C:\Users\Public\Pictures\Sample Pictures\Fig1013(a).tif'));
    subplot(231),imshow(f),title('原图像');
    subplot(232),imhist(f),title('原图像直方图');
    sx = fspecial('sobel');
    sy = sx';
    gx = imfilter(f,sx,'replicate');
    gy = imfilter(f,sy,'replicate');
    grad = sqrt(gx.*gx+gy.*gy);
    grad = grad/max(grad(:));
    
    h =imhist(grad);
    Q = percentile2i(h,0.999);
    
    markerImage = grad>Q;
    subplot(233),imshow(markerImage),title('以99.9%进行阈值处理后的梯度幅值图像');
    fp = f.*markerImage;
    subplot(234),imshow(fp),title('原图像与梯度幅值乘积的图像');
    hp = imhist(fp);
    hp(1) = 0;
    subplot(235),bar(hp),title('原图像与梯度幅值乘积的直方图');
    T = otsuthresh(hp);
    T*(numel(hp)-1)
    g = im2bw(f,T);
    subplot(236),imshow(g),title('改进边缘后的图像')
    

    在这里插入图片描述
    在这里插入图片描述
    实验分析: 原始图像本身具有高斯噪声,由其直方图单峰可以知道,此时的图像分割是不可能进行操作的,使用基本全局阈值处理是失败的。因此,实验只能够用梯度幅值处理后,将图像进行明显的灰度级分离,把阈值处理接近模式的中点,这样就可以得到基本完美的图像分割。

    编写实验二代码:用拉普拉斯边缘信息改进全局阈值处理

    f = tofloat(imread('C:\Users\Public\Pictures\Sample Pictures\Fig1017(a).tif'));
    subplot(231),imshow(f),title('原始图像');
    subplot(232),imhist(f),title('原始图像的直方图');
    hf = imhist(f);
    [Tf SMf] = graythresh(f);
    gf = im2bw(f,Tf);
    subplot(233),imshow(gf),title('对原始图像进行分割的图像');
    w= [-1 -1 -1;-1 8 -1;-1 -1 -1];
    lap = abs(imfilter(f,w,'replicate'));
    lap = lap/max(lap(:));
    h = imhist(lap);
    Q = percentile2i(h,0.995);
    markerImage = lap >Q;
    fp = f.*markerImage;
    subplot(234),imshow(fp),title('标记图像与原图像的乘积');
    hp = imhist(fp);
    hp(1) =0;
    subplot(235),bar(hp)
    T = otsuthresh(hp);
    g = im2bw(f,T);
    subplot(236),imshow(g),title('修改边缘后的阈值处理图像')
    

    在这里插入图片描述在这里插入图片描述实验分析: 在之前的学习知道,拉普拉斯算法是用于图像的锐化,把图像的边缘提取出来。在这个部分中,用拉普拉斯边缘信息改进全局阈值处理也是一样的,首先将原始图像的边缘提取出来,然后将原始图像与已标记好的图像进行相乘,得到的就是实验中所需要的图像,最终图像就如边缘改进结果那样,修改边缘信息提取出来,再用阈值进行处理。

    (6)基于局部统计的可变阈值处理

    当背景照明高度不均匀时,需要进行阈值处理的难度就增大,为了解决这个问题,运用局部统计的可变阈值处理的算法进行解决。我们用一幅图像中每个点的邻域中像素的标准差和均值,这是局部对比度和平均灰度的描述子
    为了计算局部标准差,使用函数stdfilt进行操作:g = stdfilt(f,nhood);
    为了计算局部均值,可以用函数localmean进行操作:

    function mean = localmean(f,nhood)
    if nargin ==1
        nhood = ones(3)/9;
    else
        nhood = nhood/sum(nhood(:));
    end
    mean = imfilter(tofloat(f),nhood,'replicate');
    

    用于执行局部阈值处理,可以用下面的函数来操作:

    function g = localthresh(f,nhood,a,b,meantype)
    f = tofloat(f);
    SIG = stdfilt(f,nhood);
    if nargin == 5 && strcmp(meantype,'global')
        MEAN = mean2(f);
    else
        MEAN = localmean(f,nhood);
    end
    g = (f > a*SIG) & (f > b*MEAN);
    

    编写实验代码:

    [TGlobal] = graythresh(f);
    gGlobal = im2bw(f,TGlobal);
    subplot(131),imshow(gGlobal),title('用otsu方法分割的图像');
    g = localthresh(f,ones(3),30,1.5,'global');
    SIG = stdfilt(f,ones(3));
    subplot(132),imshow(SIG,[]),title('局部标准差图像');
    subplot(133),imshow(g),title('局部阈值处理后的图像');
    

    在这里插入图片描述实验分析: 观察原图像发现,图像可以分为三种灰度级,发现除了细胞核的部分,细胞核与细胞的灰度级差别并不是很大,因此当我们使用全局阈值处理时,不能将里面的细胞核与细胞分离开,得到的阈值处理如otsu方法分割图像所示。当实验使用局部可变的阈值处理时,计算出图像的局部标准差,可以将细胞与细胞核分离开,因此当再次使用阈值处理时可以完整的将细胞与细胞核分离开,获得最终的处理结果。

    (7)使用移动平均的图像阈值处理

    移动平均是一种局部阈值处理方法,该方法以一幅图像的扫描行计算移动平均为基础。移动平均分割能减少光照偏差,且计算简单。当感兴趣的物体与图像尺寸相比较小(或较细)时,基于移动平均的阈值处理会工作的很好。打印图像和手写文本图像满足这一条件。

    移动平均需要计算图像中每一个点,因此分割用下面的表示式:
    在这里插入图片描述
    其中,K是[0,1]范围内的常数,mxy是输入图像的移动平均

    可以用如下的函数movingthresh来进行移动平均的操作:

    function g = movingthresh(f, n, K)
    f = tofloat(f);
    [M, N] = size(f);
    if (n < 1) || (rem(n, 1) ~= 0)
    error('n must be an integer >= 1.')
    end
    if K < 0 || K > 1
    error('K must be a fraction in the range [0, 1].')
    end
    f(2:2:end, :) = fliplr(f(2:2:end, :));
    f = f'; 	% Still a matrix.
    f = f(:)'; % Convert to row vector for use in function filter.
    maf = ones(1, n)/n; 	% The 1-D moving average filter.
    ma = filter(maf, 1, f); % Computation of moving average.
    g = f > K * ma;
    g = reshape(g, N, M)';
    g(2:2:end, :) = fliplr(g(2:2:end, :));
    

    编写实验代码:

    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig1019(a).tif');
    subplot(131),imshow(f),title('原始图像');
    T =graythresh(f);
    g1 = im2bw(f,T);
    subplot(132),imshow(g1),title('用otsu全局阈值分割后的图像');
    g2 = movingthresh(f,20,0.5);
    subplot(133),imshow(g2),title('用移动平均局部阈值分割后的图像');
    

    在这里插入图片描述在这里插入图片描述实验分析: 实验之前就说过,移动平均的图像阈值处理适用于处理打印图像和手写文本图像这种类型。对比房子的移动平均处理看出,最后所获得的图像不是实验所需要的图像,因此这种方法并不适用于这种图像处理。在处理手写文本图像的时候,经过局部移动平均阈值处理后,所获得的结正是我们所需要的。

    (四)基于区域的分割

    分割的目的是把图像分成一块一块的区域,是基于像素特性的分布,通过阈值处理完成的。

    (1)基本表达式

    令R表示整个图像区域,分割是把R分成n个子区域的处理,分割必须满足下面5条原则:
    在这里插入图片描述

    (2)区域生长

    区域生长(region growing) 是指将成组的像素或区域发展成更大区域的过程。从种子点的集合开始,从这些点的区域增长是通过将与每个种子点有相似属性像强度、灰度级、纹理颜色等的相邻像素合并到此区域。

    在区域生长中的主要问题如下:
    (1)表示区域的初始化种子的选择:在区域生长过程中,这些不同区域点合适属性的选择。
    (2)基于图像具体属性的像素生长不一定是好的分割。在区域生长过程中,不应该使用连通性或邻接信息。
    (3)相似性:相似性表示在灰度级中观察在两个空间邻接像素之间或像素集合的平均灰度级间的最小差分,它们将产生不同的区域。如果这个差分比相似度阈值小,则像素属于相同的区域。
    (4)区域面积:最小面积阈值与像素中的最小区域大小有关。在分割的图像中,没有区域比这个阈值小,它由用户定义。(来自百度百科)

    在图像处理工具中使用函数regiongrow进行区域生长的操作:

    [g,NR,SI,TI] = regiongrow(f,S,T)  %f是被分割图像,S/T可以是数组或标量,范围是[0,1]内
    

    编写实验代码:

    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0309(a).tif');
    subplot(221),imshow(f),title('原始图像');
    [g,NR,SI,TI]=regiongrow(f,255,65);%种子的像素值为255,65为阈值
    subplot(222),imshow(SI),title('种子点的图像');
    subplot(223),imshow(TI),title('所有通过阈值测试的像素');
    subplot(224),imshow(g),title('对种子点进行8连通分析后的结果');
    

    在这里插入图片描述

    (3)区域分离和聚合

    这个操作是区域生长的反操作,是将图像中的区域分离或合并这些区域。令R表示整个图像,选择属性P,这个操作将R连续地细分为越来越小的象限区域。如果P(R)=TRUE,就把图像分成4象限;如果对每个4象限来说,P都是FALSE,再细分象限就为子象限,以此类推划分下去,直到无法进一步合并的时候停止分离。这种方法也称作四叉树。(如图所示)
    在这里插入图片描述
    在图像处理工具箱中使用函数qtdecomp 进行四叉树分解的处理:

    z = qtdecomp(f,@split_test,parameters)  %split_test用来决定某个区域是否进行分离
    

    为了在四叉树分解中得到实际的四叉区域像素值,使用函数qtgetblk:

    [vals,r,c] = qtgetblk(f,z,m)  %vals是数组,r和c事行列坐标的向量,z是返回的稀疏矩阵
    

    函数splitmerge来计算两个区域的合并

    g = splitmerge(f,mindim,@predicate)  %mindim是分解中允许的最小块
    

    predicate函数是用户自定义的,用于考察该区域的是否符合要求

    flag = predicate(region)
    

    用代码编写以上过程:

    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig1023(a).tif');
    subplot(231),imshow(f),title('原始图像');
    g32 = splitmerge(f,32,@predicate) %使用最小块为32进行分割
    subplot(232),imshow(g32),title('使用最小块为32进行分割图像');
    g16 = splitmerge(f,16,@predicate) %使用最小块为16进行分割
    subplot(233),imshow(g16),title('使用最小块为16进行分割图像');
    g8= splitmerge(f,8,@predicate) %使用最小块为8进行分割
    subplot(234),imshow(g8),title('使用最小块为8进行分割图像');
    g4 = splitmerge(f,4,@predicate) %使用最小块为4进行分割
    subplot(235),imshow(g4),title('使用最小块为4进行分割图像');
    g2 = splitmerge(f,2,@predicate) %使用最小块为2进行分割
    subplot(236),imshow(g2),title('使用最小块为2进行分割图像');
    

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

    (五)使用分水岭变换的分割

    分水岭算法主要用于图像的分割,如果目标物体是连接在一起的,则分割起来会很困难。此时经常采用分水岭分割算法,会得到比较好的效果。分水岭分割算法把图像看成一幅地形图,亮度比较强的区域像素值较大,亮度暗的区域像素值比较小,通过寻找汇水盆地和分水岭界线对图像进行分割。分水岭的计算过程是一个迭代标注过程。分水岭比较经典的计算方法是L. Vincent提出的。在该算法中,分水岭计算分两个步骤,一个是排序过程,一个是淹没过程。首先对每个像素的灰度级进行从低到高排序,然后在从低到高实现淹没过程中,对每一个局部极小值在h阶高度的影响域采用先进先出(FIFO)结构进行判断及标注。

    注意:分割结果必须要根据种子区域,以减小过分割造成的影响。

    (1)使用距离变换的分水岭分割

    最常用的分水岭变换分割的是距离变换,主要是用于二值图像的处理,它是指从每个像素到最接近零值的像素的距离。
    在这里插入图片描述
    距离变换函数为:D = bwdist(f)

    计算距离变换的负分水岭变换,调用函数watershedL = watershed(A,conn)

    编写实验代码为:

    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig0513(a).tif');
    subplot(231),imshow(f),title('原始图像');
    g = im2bw(f,graythresh(f));   %把图像变换成二值图像
    subplot(232),imshow(g),title('二值图像');
    gc = ~g;
    subplot(233),imshow(gc),title('补的图像');
    D = bwdist(gc);
    subplot(234),imshow(D),title('距离变换图像');
    L = watershed(-D);
    w = L == 0;
    subplot(235),imshow(w),title('负分水岭脊的图像');
    g2 = g&-w;
    subplot(236),imshow(g2),title('黑色重叠后的图像');
    

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

    (2)使用梯度的分水岭分割

    梯度处理是在分水岭变换之前的预处理,它将沿着物体的边缘有较高的像素值,而在其他地方的像素值比较低。

    编写实验代码:

    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig1014(a).tif');
    subplot(221),imshow(f),title('原始图像');
    h = fspecial('sobel');
    fd = tofloat(f);
    g = sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h,'replicate').^2);
    subplot(222),imshow(g,[]),title('梯度和分水岭分割幅度图像');
    L =watershed(g);
    wr = L == 0;
    subplot(223),imshow(wr),title('严重分割过分割后图像');
    g2 = imclose(imopen(g,ones(3,3)),ones(3,3));
    L2 = watershed(g2);
    wr2 = L2 == 0;
    f2 = f;
    f2(wr2) = 255;
    subplot(224),imshow(f2),title('平滑梯度图像后的分水岭变换');
    

    在这里插入图片描述在这里插入图片描述实验分析: 观察两组图像,当梯度的分水岭分割时,所获得的图像基本上满足实验的效果,但由于严重的过度分割后,图像已不再是需要得到的效果,使得图像分割没有意义了。使用平滑梯度图像的分水岭分割后,虽然产生了一些缺陷(图像上被一些类似噪声污染),但没有影响图像的分割效果。基于梯度的分水岭分割法是修改梯度函数使得集水盆只响应想要探测的目标,再对梯度图像进行阈值处理,以消除灰度的微小变化产生的过度分割。

    (3)控制标记符的分水岭分割

    当直接用梯度进行分水岭变换时,容易造成过度分割,为了改善这样的情况,采用基于标记符的方式进行分割。

    编写实验代码:

    f = imread('C:\Users\Public\Pictures\Sample Pictures\Fig1028(a).tif');
    subplot(241),imshow(f),title('原始图像');
    h = fspecial('sobel');
    fd = tofloat(f);
    g = sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h,'replicate').^2);
    L =watershed(g);
    wr = L == 0;
    subplot(242),imshow(wr),title('梯度幅度图像进行分水岭变换图像');
    rm = imregionalmin(g);  %计算图像中所有的局部小区域的位置
    subplot(243),imshow(rm),title('梯度幅值的局部小区域图像');
    im = imextendedmin(f,2);  %用于计算比临近点更暗的图像中“低点”的集合
    fim = f;
    fim(im) = 175;
    subplot(244),imshow(f,[]),title('内部标记符图像');
    Lim = watershed(bwdist(im));
    em = Lim == 0;
    subplot(245),imshow(em,[]),title('外部标记符图像');
    g2 = imimposemin(g,im|em);  %用来修改一幅图像,使得其只在指定的位置处取得局部最小值
    subplot(246),imshow(g2),title('修改后的梯度幅值图像');
    L2 = watershed(g2);
    f2 = f;
    f2(L2 == 0) = 255;
    subplot(247),imshow(f2),title('最后的分割图像');
    

    在这里插入图片描述在这里插入图片描述实验分析: 当直接使用梯度幅度方法进行分割处理时,发现图像过度分割非常严重,而这样的分割是没有意义的,并不是我们所需要的。当采用控制标记符分水岭分割算法时,能调整过度分割的界限,设置内部标记符和外部标记符,把所需要的内外部标记符联合起来,再次进行分割,因此可以得到我们所需要的分割效果。

    展开全文
  • 图像分割综述【深度学习方法】

    万次阅读 多人点赞 2018-07-06 21:40:41
    CNN图像语义分割基本上是这个套路:下采样+上采样:Convlution + Deconvlution/Resize多尺度特征融合:特征逐点相加/特征channel...图13 DeepLab v3+Image Segmentation(图像分割)网络结构比较网络 父辈生辰...

    CNN图像语义分割基本上是这个套路:

    1. 下采样+上采样:Convlution + Deconvlution/Resize
    2. 多尺度特征融合:特征逐点相加/特征channel维度拼接
    3. 获得像素级别的segement map:对每一个像素点进行判断类别

    即使是更复杂的DeepLab v3+依然也是这个基本套路。

    图13 DeepLab v3+

    Image Segmentation(图像分割)网络结构比较

    网络 父辈生辰 增加的结构丢弃的结构优势劣势  
    VGG16 FCN的灵感来源        
    FCN
    VGG162014
    一个Deconv层(从无到有)所有fc层简单粗糙

    DeconvNet
    FCN2015
    Unpooling层(从无到有)、多个Deconv层(层数增加)、fc层(从无到有)




    SegNet
    DeconvNet2016
    每个max_pooling的max索引所有fc层



    DeepLab
    FCN







    PSPNet









    Mask-RCNN  2017   真正做到像素级   

    Image Segmentation(图像分割)族谱

    FCN

    • DeepLab

    • DeconvNet

      • SegNet
    • PSPNet

    • Mask-RCNN

    按分割目的划分

    • 普通分割

      将不同分属不同物体的像素区域分开。 
      如前景与后景分割开,狗的区域与猫的区域与背景分割开。

    • 语义分割

      在普通分割的基础上,分类出每一块区域的语义(即这块区域是什么物体)。 
      如把画面中的所有物体都指出它们各自的类别。

    • 实例分割

      在语义分割的基础上,给每个物体编号。 
      如这个是该画面中的狗A,那个是画面中的狗B。

    论文推荐:

    图像的语义分割(Semantic Segmentation)是计算机视觉中非常重要的任务。它的目标是为图像中的每个像素分类。如果能够快速准去地做图像分割,很多问题将会迎刃而解。因此,它的应用领域就包括但不限于:自动驾驶、图像美化、三维重建等等。

    语义分割是一个非常困难的问题,尤其是在深度学习之前。深度学习使得图像分割的准确率提高了很多,下面我们就总结一下近年来最具有代表性的方法和论文。

    Fully Convolutional Networks (FCN)

    我们介绍的第一篇论文是Fully Convolutional Networks for Semantic Segmentation,简称FCN。这篇论文是第一篇成功使用深度学习做图像语义分割的论文。论文的主要贡献有两点:

    1. 提出了全卷积网络。将全连接网络替换成了卷积网络,使得网络可以接受任意大小的图片,并输出和原图一样大小的分割图。只有这样,才能为每个像素做分类。
    2. 使用了反卷积层(Deconvolution)。分类神经网络的特征图一般只有原图的几分之一大小。想要映射回原图大小必须对特征图进行上采样,这就是反卷积层的作用。虽然名字叫反卷积层,但其实它并不是卷积的逆操作,更合适的名字叫做转置卷积(Transposed Convolution),作用是从小的特征图卷出大的特征图。

    这是神经网络做语义分割的开山之作,需彻底理解。

    DeepLab

    DeepLab有v1 v2 v3,第一篇名字叫做DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs。这一系列论文引入了以下几点比较重要的方法:

    第一个是带洞卷积,英文名叫做Dilated Convolution,或者Atrous Convolution。带洞卷积实际上就是普通的卷积核中间插入了几个洞,如下图。


    它的运算量跟普通卷积保持一样,好处是它的“视野更大了”,比如普通3x3卷积的结果的视野是3x3,插入一个洞之后的视野是5x5。视野变大的作用是,在特征图缩小到同样倍数的情况下可以掌握更多图像的全局信息,这在语义分割中很重要。

    Pyramid Scene Parsing Network

    Pyramid Scene Parsing Network的核心贡献是Global Pyramid Pooling,翻译成中文叫做全局金字塔池化。它将特征图缩放到几个不同的尺寸,使得特征具有更好地全局和多尺度信息,这一点在准确率提升上上非常有用。

    其实不光是语义分割,金字塔多尺度特征对于各类视觉问题都是挺有用的。

    Mask R-CNN

    Mask R-CNN是大神何凯明的力作,将Object Detection与Semantic Segmentation合在了一起做。它的贡献主要是以下几点。

    第一,神经网络有了多个分支输出。Mask R-CNN使用类似Faster R-CNN的框架,Faster R-CNN的输出是物体的bounding box和类别,而Mask R-CNN则多了一个分支,用来预测物体的语义分割图。也就是说神经网络同时学习两项任务,可以互相促进。

    第二,在语义分割中使用Binary Mask。原来的语义分割预测类别需要使用0 1 2 3 4等数字代表各个类别。在Mask R-CNN中,检测分支会预测类别。这时候分割只需要用0 1预测这个物体的形状面具就行了。

    第三,Mask R-CNN提出了RoiAlign用来替换Faster R-CNN中的RoiPooling。RoiPooling的思想是将输入图像中任意一块区域对应到神经网络特征图中的对应区域。RoiPooling使用了化整的近似来寻找对应区域,导致对应关系与实际情况有偏移。这个偏移在分类任务中可以容忍,但对于精细度更高的分割则影响较大。

    为了解决这个问题,RoiAlign不再使用化整操作,而是使用线性插值来寻找更精准的对应区域。效果就是可以得到更好地对应。实验也证明了效果不错。下面展示了与之前方法的对比,下面的图是Mask R-CNN,可以看出精细了很多。


    U-Net

    U-Net原作者官网

    U-Net是原作者参加ISBI Challenge提出的一种分割网络,能够适应很小的训练集(大约30张图)。U-Net与FCN都是很小的分割网络,既没有使用空洞卷积,也没有后接CRF,结构简单。

    图9 U-Net网络结构图

    整个U-Net网络结构如图9,类似于一个大大的U字母:首先进行Conv+Pooling下采样;然后Deconv反卷积进行上采样,crop之前的低层feature map,进行融合;然后再次上采样。重复这个过程,直到获得输出388x388x2的feature map,最后经过softmax获得output segment map。总体来说与FCN思路非常类似。

    为何要提起U-Net?是因为U-Net采用了与FCN完全不同的特征融合方式:拼接!


    图10 U-Net concat特征融合方式

    与FCN逐点相加不同,U-Net采用将特征在channel维度拼接在一起,形成更“厚”的特征。所以:

    语义分割网络在特征融合时也有2种办法:

    1. FCN式的逐点相加,对应caffe的EltwiseLayer层,对应tensorflow的tf.add()
    2. U-Net式的channel维度拼接融合,对应caffe的ConcatLayer层,对应tensorflow的tf.concat()

    综述介绍

    图像语义分割,简单而言就是给定一张图片,对图片上的每一个像素点分类
    从图像上来看,就是我们需要将实际的场景图分割成下面的分割图:

    不同颜色代表不同类别。经过阅读“大量”论文和查看PASCAL VOC Challenge performance evaluation server,发现图像语义分割从深度学习引入这个任务(FCN)到现在而言,一个通用的框架已经大概确定了。即:



    • FCN-全卷积网络
    • CRF-条件随机场
    • MRF-马尔科夫随机场
    前端使用FCN进行特征粗提取,后端使用CRF/MRF优化前端的输出,最后得到分割图。


    前端

    为什么需要FCN?

    我们分类使用的网络通常会在最后连接几层全连接层,它会将原来二维的矩阵(图片)压扁成一维的,从而丢失了空间信息,最后训练输出一个标量,这就是我们的分类标签。

    而图像语义分割的输出需要是个分割图,且不论尺寸大小,但是至少是二维的。所以,我们需要丢弃全连接层,换上全卷积层,而这就是全卷积网络了。具体定义请参看论文:Fully Convolutional Networks for Semantic Segmentation

    前端结构

    FCN

    此处的FCN特指Fully Convolutional Networks for Semantic Segmentation论文中提出的结构,而非广义的全卷积网络。

    作者的FCN主要使用了三种技术:

    • 卷积化(Convolutional)
    • 上采样(Upsample)
    • 跳跃结构(Skip Layer)

    卷积化

    卷积化即是将普通的分类网络,比如VGG16,ResNet50/101等网络丢弃全连接层,换上对应的卷积层即可。


    上采样

    此处的上采样即是反卷积(Deconvolution)。当然关于这个名字不同框架不同,Caffe和Kera里叫Deconvolution,而tensorflow里叫conv_transpose。CS231n这门课中说,叫conv_transpose更为合适。

    众所诸知,普通的池化(为什么这儿是普通的池化请看后文)会缩小图片的尺寸,比如VGG16 五次池化后图片被缩小了32倍。为了得到和原图等大的分割图,我们需要上采样/反卷积。

    反卷积和卷积类似,都是相乘相加的运算。只不过后者是多对一,前者是一对多。而反卷积的前向和后向传播,只用颠倒卷积的前后向传播即可。所以无论优化还是后向传播算法都是没有问题。图解如下:


    但是,虽然文中说是可学习的反卷积,但是作者实际代码并没有让它学习,可能正是因为这个一对多的逻辑关系。代码如下:

    layer {
      name: "upscore"
      type: "Deconvolution"
      bottom: "score_fr"
      top: "upscore"
      param {
        lr_mult: 0
      }
      convolution_param {
        num_output: 21
        bias_term: false
        kernel_size: 64
        stride: 32
      }
    }
    

    可以看到lr_mult被设置为了0.

    跳跃结构

    (这个奇怪的名字是我翻译的,好像一般叫忽略连接结构)这个结构的作用就在于优化结果,因为如果将全卷积之后的结果直接上采样得到的结果是很粗糙的,所以作者将不同池化层的结果进行上采样之后来优化输出。具体结构如下:


    而不同上采样结构得到的结果对比如下:



    当然,你也可以将pool1, pool2的输出再上采样输出。不过,作者说了这样得到的结果提升并不大。

    这是第一种结构,也是深度学习应用于图像语义分割的开山之作,所以得了CVPR2015的最佳论文。但是,还是有一些处理比较粗糙的地方,具体和后面对比就知道了。

    SegNet/DeconvNet

    这样的结构总结在这儿,只是我觉得结构上比较优雅,它得到的结果不一定比上一种好。

    SegNet



    DeconvNet


    这样的对称结构有种自编码器的感觉在里面,先编码再解码。这样的结构主要使用了反卷积和上池化。即:

     

    反卷积如上。而上池化的实现主要在于池化时记住输出值的位置,在上池化时再将这个值填回原来的位置,其他位置填0即OK。

    DeepLab

    接下来介绍一个很成熟优雅的结构,以至于现在的很多改进是基于这个网络结构的进行的。

    首先这里我们将指出一个第一个结构FCN的粗糙之处:为了保证之后输出的尺寸不至于太小,FCN的作者在第一层直接对原图加了100的padding,可想而知,这会引入噪声。

    而怎样才能保证输出的尺寸不会太小而又不会产生加100 padding这样的做法呢?可能有人会说减少池化层不就行了,这样理论上是可以的,但是这样直接就改变了原先可用的结构了,而且最重要的一点是就不能用以前的结构参数进行fine-tune了。所以,Deeplab这里使用了一个非常优雅的做法:将pooling的stride改为1,再加上 1 padding。这样池化后的图片尺寸并未减小,并且依然保留了池化整合特征的特性。

    但是,事情还没完。因为池化层变了,后面的卷积的感受野也对应的改变了,这样也不能进行fine-tune了。所以,Deeplab提出了一种新的卷积,带孔的卷积:Atrous Convolution.即:


    而具体的感受野变化如下:

    a为普通的池化的结果,b为“优雅”池化的结果。我们设想在a上进行卷积核尺寸为3的普通卷积,则对应的感受野大小为7.而在b上进行同样的操作,对应的感受野变为了5.感受野减小了。但是如果使用hole为1的Atrous Convolution则感受野依然为7.

    所以,Atrous Convolution能够保证这样的池化后的感受野不变,从而可以fine tune,同时也能保证输出的结果更加精细。即:



    总结

    这里介绍了三种结构:FCN, SegNet/DeconvNet,DeepLab。当然还有一些其他的结构方法,比如有用RNN来做的,还有更有实际意义的weakly-supervised方法等等。


    后端

    终于到后端了,后端这里会讲几个场,涉及到一些数学的东西。我的理解也不是特别深刻,所以欢迎吐槽。


    全连接条件随机场(DenseCRF)

    对于每个像素i具有类别标签x_i还有对应的观测值y_i,这样每个像素点作为节点,像素与像素间的关系作为边,即构成了一个条件随机场。而且我们通过观测变量y_i来推测像素i对应的类别标签x_i。条件随机场如下:


    条件随机场符合吉布斯分布:(此处的x即上面说的观测值)

    P(\mathbf{X=x|I})=\frac{1}{Z(\mathbf{I})}\exp(-E(\mathbf{x|I}))

    其中的E(\mathbf{x|I})是能量函数,为了简便,以下省略全局观测\mathbf{I}

    E(\mathbf{x})=\sum_i{\Psi_u(x_i)}+\sum_{i<j}\Psi_p(x_i, x_j)

    其中的一元势函数\sum_i{\Psi_u(x_i)}即来自于前端FCN的输出。而二元势函数如下:

    \Psi_p(x_i, x_j)=u(x_i, x_j)\sum_{m=1}^M{\omega^{(m)}k_G^{(m)}(\mathbf{f_i, f_j)}}

    二元势函数就是描述像素点与像素点之间的关系,鼓励相似像素分配相同的标签,而相差较大的像素分配不同标签,而这个“距离”的定义与颜色值和实际相对距离有关。所以这样CRF能够使图片尽量在边界处分割。

    而全连接条件随机场的不同就在于,二元势函数描述的是每一个像素与其他所有像素的关系,所以叫“全连接”。

    关于这一堆公式大家随意理解一下吧... ...而直接计算这些公式是比较麻烦的(我想也麻烦),所以一般会使用平均场近似方法进行计算。而平均场近似又是一堆公式,这里我就不给出了(我想大家也不太愿意看),愿意了解的同学直接看论文吧。


    CRFasRNN

    最开始使用DenseCRF是直接加在FCN的输出后面,可想这样是比较粗糙的。而且在深度学习中,我们都追求end-to-end的系统,所以CRFasRNN这篇文章将DenseCRF真正结合进了FCN中。

    这篇文章也使用了平均场近似的方法,因为分解的每一步都是一些相乘相加的计算,和普通的加减(具体公式还是看论文吧),所以可以方便的把每一步描述成一层类似卷积的计算。这样即可结合进神经网络中,并且前后向传播也不存在问题。

    当然,这里作者还将它进行了迭代,不同次数的迭代得到的结果优化程度也不同(一般取10以内的迭代次数),所以文章才说是as RNN。优化结果如下:


    马尔科夫随机场(MRF)

    在Deep Parsing Network中使用的是MRF,它的公式具体的定义和CRF类似,只不过作者对二元势函数进行了修改:

    \Psi(y_i^u, y_i^v)=\sum_{k=1}^K\lambda_ku_k(i, u, j, v)\sum_{\forall{z\in{N_j}}}d(j, z)p_z^v

    其中,作者加入的\lambda_k为label context,因为u_k只是定义了两个像素同时出现的频率,而\lambda_k可以对一些情况进行惩罚,比如,人可能在桌子旁边,但是在桌子下面的可能性就更小一些。所以这个量可以学习不同情况出现的概率。而原来的距离d(i,j)只定义了两个像素间的关系,作者在这儿加入了个triple penalty,即还引入了j附近的z,这样描述三方关系便于得到更充足的局部上下文。具体结构如下:


    这个结构的优点在于:

    • 将平均场构造成了CNN
    • 联合训练并且可以one-pass inference,而不用迭代


    高斯条件随机场(G-CRF)

    这个结构使用CNN分别来学习一元势函数和二元势函数。这样的结构是我们更喜欢的:

    而此中的能量函数又不同于之前:

    E(\mathbf{x})=\frac{1}{2}\mathbf{x}^T(\mathbf{A+\lambda I)x}-\mathbf{Bx}

    而当(\mathbf{A+\lambda I)}是对称正定时,求E(\mathbf{x})的最小值等于求解:

    (\mathbf{A+\lambda I)x}=\mathbf{B}

    而G-CRF的优点在于:

    • 二次能量有明确全局
    • 解线性简便很多 

    感悟

    • FCN更像一种技巧。随着基本网络(如VGG, ResNet)性能的提升而不断进步。
    • 深度学习+概率图模型(PGM)是一种趋势。其实DL说白了就是进行特征提取,而PGM能够从数学理论很好的解释事物本质间的联系。
    • 概率图模型的网络化。因为PGM通常不太方便加入DL的模型中,将PGM网络化后能够是PGM参数自学习,同时构成end-to-end的系统。

    完结撒花

    引用

    [1]Fully Convolutional Networks for Semantic Segmentation

    [2]Learning Deconvolution Network for Semantic Segmentation

    [3]Efficient Inference in Fully Connected CRFs with Gaussian Edge Potentials

    [4]Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs

    [5]Conditional Random Fields as Recurrent Neural Networks

    [6]DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs

    [7]Semantic Image Segmentation via Deep Parsing Network

    [8]Fast, Exact and Multi-Scale Inference for Semantic Image Segmentation with Deep Gaussian CRFs

    [9]SegNet


    图像分割 (Image Segmentation) 重大资源:

    入门学习

    1. A 2017 Guide to Semantic Segmentation with Deep Learning 概述——用深度学习做语义分割
    2. 从全卷积网络到大型卷积核:深度学习的语义分割全指南
    3. Fully Convolutional Networks
    4. 语义分割中的深度学习方法全解:从FCN、SegNet到各代DeepLab
    5. 图像语义分割之FCN和CRF
    6. 从特斯拉到计算机视觉之「图像语义分割」
    7. 计算机视觉之语义分割
    8. Segmentation Results: VOC2012 PASCAL语义分割比赛排名

    进阶论文

    1. U-Net [https://arxiv.org/pdf/1505.04597.pdf]
    2. SegNet [https://arxiv.org/pdf/1511.00561.pdf]
    3. DeepLab [https://arxiv.org/pdf/1606.00915.pdf]
    4. FCN [https://arxiv.org/pdf/1605.06211.pdf]
    5. ENet [https://arxiv.org/pdf/1606.02147.pdf]
    6. LinkNet [https://arxiv.org/pdf/1707.03718.pdf]
    7. DenseNet [https://arxiv.org/pdf/1608.06993.pdf]
    8. Tiramisu [https://arxiv.org/pdf/1611.09326.pdf]
    9. DilatedNet [https://arxiv.org/pdf/1511.07122.pdf]
    10. PixelNet [https://arxiv.org/pdf/1609.06694.pdf]
    11. ICNet [https://arxiv.org/pdf/1704.08545.pdf]
    12. ERFNet [http://www.robesafe.uah.es/personal/eduardo.romera/pdfs/Romera17iv.pdf]
    13. RefineNet [https://arxiv.org/pdf/1611.06612.pdf]
    14. PSPNet [https://arxiv.org/pdf/1612.01105.pdf]
    15. CRFasRNN [http://www.robots.ox.ac.uk/%7Eszheng/papers/CRFasRNN.pdf]
    16. Dilated convolution [https://arxiv.org/pdf/1511.07122.pdf]
    17. DeconvNet [https://arxiv.org/pdf/1505.04366.pdf]
    18. FRRN [https://arxiv.org/pdf/1611.08323.pdf]
    19. GCN [https://arxiv.org/pdf/1703.02719.pdf]
    20. DUC, HDC [https://arxiv.org/pdf/1702.08502.pdf]
    21. Segaware [https://arxiv.org/pdf/1708.04607.pdf]
    22. Semantic Segmentation using Adversarial Networks [https://arxiv.org/pdf/1611.08408.pdf]

    综述

    1. A Review on Deep Learning Techniques Applied to Semantic Segmentation Alberto Garcia-Garcia, Sergio Orts-Escolano, Sergiu Oprea, Victor Villena-Martinez, Jose Garcia-Rodriguez 2017
    2. Computer Vision for Autonomous Vehicles: Problems, Datasets and State-of-the-Art
    3. 基于内容的图像分割方法综述 姜 枫 顾 庆 郝慧珍 李 娜 郭延文 陈道蓄 2017

    Tutorial

    1. Semantic Image Segmentation with Deep Learning
    2. A 2017 Guide to Semantic Segmentation with Deep Learning
    3. Image Segmentation with Tensorflow using CNNs and Conditional Random Fields

    视频教程

    1. CS231n: Convolutional Neural Networks for Visual Recognition Lecture 11 Detection and Segmentation 
    2. Machine Learning for Semantic Segmentation - Basics of Modern Image Analysis

    代码

    Semantic segmentation

    1. U-Net (https://arxiv.org/pdf/1505.04597.pdf)
    2. SegNet (https://arxiv.org/pdf/1511.00561.pdf)
    3. DeepLab (https://arxiv.org/pdf/1606.00915.pdf)
    4. FCN (https://arxiv.org/pdf/1605.06211.pdf)
    5. ENet (https://arxiv.org/pdf/1606.02147.pdf)
    6. LinkNet (https://arxiv.org/pdf/1707.03718.pdf)
    7. DenseNet (https://arxiv.org/pdf/1608.06993.pdf)
    8. Tiramisu (https://arxiv.org/pdf/1611.09326.pdf)
    9. DilatedNet (https://arxiv.org/pdf/1511.07122.pdf)
    10. PixelNet (https://arxiv.org/pdf/1609.06694.pdf)
    11. ICNet (https://arxiv.org/pdf/1704.08545.pdf)
    12. ERFNet (http://www.robesafe.uah.es/personal/eduardo.romera/pdfs/Romera17iv.pdf)
    13. RefineNet (https://arxiv.org/pdf/1611.06612.pdf)
    14. PSPNet (https://arxiv.org/pdf/1612.01105.pdf)
    15. CRFasRNN (http://www.robots.ox.ac.uk/%7Eszheng/papers/CRFasRNN.pdf)
    16. Dilated convolution (https://arxiv.org/pdf/1511.07122.pdf)
    17. DeconvNet (https://arxiv.org/pdf/1505.04366.pdf)
    18. FRRN (https://arxiv.org/pdf/1611.08323.pdf)
    19. GCN (https://arxiv.org/pdf/1703.02719.pdf)
    20. DUC, HDC (https://arxiv.org/pdf/1702.08502.pdf)
    21. Segaware (https://arxiv.org/pdf/1708.04607.pdf)
    22. Semantic Segmentation using Adversarial Networks (https://arxiv.org/pdf/1611.08408.pdf)

    Instance aware segmentation

    1. FCIS [https://arxiv.org/pdf/1611.07709.pdf]
    2. MNC [https://arxiv.org/pdf/1512.04412.pdf]
    3. DeepMask [https://arxiv.org/pdf/1506.06204.pdf]
    4. SharpMask [https://arxiv.org/pdf/1603.08695.pdf]
    5. Mask-RCNN [https://arxiv.org/pdf/1703.06870.pdf]
    6. RIS [https://arxiv.org/pdf/1511.08250.pdf]
    7. FastMask [https://arxiv.org/pdf/1612.08843.pdf]

    Satellite images segmentation

    Video segmentation

    Autonomous driving

    Annotation Tools:

    Datasets

    1. Stanford Background Dataset[http://dags.stanford.edu/projects/scenedataset.html]
      1. Sift Flow Dataset[http://people.csail.mit.edu/celiu/SIFTflow/]
      2. Barcelona Dataset[http://www.cs.unc.edu/~jtighe/Papers/ECCV10/]
      3. Microsoft COCO dataset[http://mscoco.org/]
      4. MSRC Dataset[http://research.microsoft.com/en-us/projects/objectclassrecognition/]
      5. LITS Liver Tumor Segmentation Dataset[https://competitions.codalab.org/competitions/15595]
      6. KITTI[http://www.cvlibs.net/datasets/kitti/eval_road.php]
      7. Stanford background dataset[http://dags.stanford.edu/projects/scenedataset.html]
      8. Data from Games dataset[https://download.visinf.tu-darmstadt.de/data/from_games/]
      9. Human parsing dataset[https://github.com/lemondan/HumanParsing-Dataset]
      10. Silenko person database[https://github.com/Maxfashko/CamVid]
      11. Mapillary Vistas Dataset[https://www.mapillary.com/dataset/vistas]
      12. Microsoft AirSim[https://github.com/Microsoft/AirSim]
      13. MIT Scene Parsing Benchmark[http://sceneparsing.csail.mit.edu/]
      14. COCO 2017 Stuff Segmentation Challenge[http://cocodataset.org/#stuff-challenge2017]
      15. ADE20K Dataset[http://groups.csail.mit.edu/vision/datasets/ADE20K/]
      16. INRIA Annotations for Graz-02[http://lear.inrialpes.fr/people/marszalek/data/ig02/]

    比赛

    1. MSRC-21 [http://rodrigob.github.io/are_we_there_yet/build/semantic_labeling_datasets_results.html]
    2. Cityscapes [https://www.cityscapes-dataset.com/benchmarks/]
    3. VOC2012 [http://host.robots.ox.ac.uk:8080/leaderboard/displaylb.php?challengeid=11&compid=6]

    领域专家

    1. Jonathan Long
    2. Liang-Chieh Chen
    3. Hyeonwoo Noh
    4. Bharath Hariharan
    5. Fisher Yu
    6. Vijay Badrinarayanan
    7. Guosheng Lin
    展开全文
  • 深度学习之图像分割

    万次阅读 多人点赞 2019-05-06 10:23:37
    CNN图像语义分割基本上是这个套路: 下采样+上采样:Convlution + Deconvlution/Resize 多尺度特征融合:特征逐点相加/特征channel维度拼接 ...Image Segmentation(图像分割)网络结构比较 网络 ...
  • 图像分割—基于图的图像分割(Graph-Based Image Segmentation) https://blog.csdn.net/huixingshao/article/details/42642973/ Reference: Efficient Graph-Based Image Segmentation,IJCV 2004,MIT Code   ...
  • 图像分割算法

    万次阅读 2019-01-18 17:31:04
    一.区域生长 算法概括:将具有相似性质的像素点连成合并在一起。每一个区域,要有一个种子点作为生长起点,然后将种子点周围所设置领域的像素点...算法概括:对于均值分割,就是迭代计算出一个T,使得阈值T能够把灰...
  • 题目: 基于MATLAB的图像分割算法研究 作者姓名 XXX 学号 指导教师 XX教授 学科专业 计算机科学与技术 所在学院 计算机学院 提交日期 引言 数字图像处理技术是一个跨学科的领域。随着计算机科学技术的不断发展...
  • matlab图像分割算法源码

    千次阅读 多人点赞 2019-03-09 17:37:37
    1.图像反转 MATLAB程序实现如下: I=imread(‘xian.bmp’); J=double(I); J=-J+(256-1); %图像反转线性变换 H=uint8(J); subplot(1,2,1),imshow(I); subplot(1,2,2),imshow(H); 2.灰度线性变换 MATLAB程序...
  • 图像分割算法综述概括性介绍了传统的图像分割算法包括区域生长法、分水岭算法等,同时也介绍了结合特定工具如小波分析、小波变换、遗传算法等进行图像分割的方法,最后采用深度学习进行图像分割
  • 遥感图像分割算法

    2013-07-27 17:00:50
    遥感图像分割是对遥感图像进行处理的最为关键的一步。马尔科夫随机场模型作为先验模型,在 图像分割领域已经得到了广泛的应用,实践证明该模型有助于提高图像分割的效果。但是由于环境和传感 器的影响,遥感图像具有...
  • 图像分割算法综述

    千次阅读 2019-07-02 20:07:25
    图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割...
  • 【Matlab系列】常用的图像分割算法及其实现

    千次阅读 多人点赞 2017-12-30 17:03:37
    (1)基于阈值的分割方法:可在各种颜色空间或不同通道中完成阈值、自适应阈值图像分割。 (2)基于边缘的分割方法:各种边缘检测算子,Sobel,Canny等。 (3)基于区域的分割方法:分水岭、区域归并与分裂。...
  • 基于MATLAB的几种图像分割算法

    万次阅读 多人点赞 2018-09-06 16:08:11
    最大类间方差法:基本思路是根据直方图以某一会灰度为阈值将图像分割成两部分,计算两组的方差,当被分成的两组之间的方差最大时,这个灰度为阈值灰度值 img = imread('C:\Users\dell\Desktop\前单图\3.3.JPG');%...
  • 基于颜色信息的图像分割算法

    万次阅读 2017-04-14 10:17:18
    1.算法原理(1)RGB颜色模型 我们通过在镜头前放置红(R),绿(G),蓝(B)三种颜色的滤光镜,得到R、G、B的三颜色通道。将三种滤光镜所生成的图像的灰度值以三基色原理组合在一起表示目标图像颜色的方式,就是...
  • 图像分割算法总结

    万次阅读 2015-03-31 10:20:56
    图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于...
  • 图像分割算法的优缺点比较

    万次阅读 多人点赞 2019-06-11 14:44:14
    数字图像处理常用的图像分割算法有: 基于阀值的分割方法。 基于边缘的分割方法。 基于区域的分割方法。 基于聚类分析的图像分割方法。 基于小波变换的分割方法。 基于数学形态学方法。 基于人工神经网络的方法。 ...
  • 数字图像处理中常用图像分割算法有哪些? 1.多数的图像分割算法 2.图像边缘分割 3.图像阈值分割 4.基于区域的分割 5.形态学分水岭算法 多数的图像分割算法 均是基于灰度值的不连续和相似的性质。在前者中,...
  • 图像分割算法的研究与实现_开题报告
  • 图像分割算法概述及常用边缘检测算法 Email:whowhoha@outlook.com 一、概述  用计算机进行数字图像处理的目的有两个,一是产生更适合人类视觉观察和识别的图像,二是希望计算机能够自动进行识别和理解图像。无论...
  • 点击上方“AI算法与图像处理”,选择加"星标"或“置顶”重磅干货,第一时间送达图像分割是计算机视觉研究中的一个经典难题,已经成为图像理解领域关注的一个热点,图像分割是图像...
  • 图像处理--图像分割算法介绍

    万次阅读 2016-11-15 17:21:22
    图像分割的主要算法: 1.基于阈值的分割方法 2.基于边缘的分割方法 3.基于区域的分割方法 4.基于聚类分析的图像分割方法 5.基于小波变换的分割方法 6.基于数学形态学的分割方法 7.基于人工神经网络的分割方法 ...
  • meanshift图像分割算法

    热门讨论 2011-11-13 09:31:50
    此算法是经典的meanshift图像分割算法,用c++写的
  • 传统与深度学习图像分割算法

    千次阅读 2019-09-29 17:16:07
    1998年以来,人工神经网络识别技术已经引起了广泛的关注,并且应用于图像分割。基于神经网络的分割方法的基本思想是通过训练多层感知机来得到线性决策函数,然后用决策函数对像素进行分类来达到分割的目的。这种方法...
  • 基于颜色的图像分割算法MATLAB代码

    热门讨论 2009-12-09 09:58:47
    通过对彩色图像中颜色信息进行选取,作为分类标识。基于LAB颜色空间,计算各像素点颜色到标识的距离,实现图像分割及区域检测
  • 回顾图像分割的经典算法

    万次阅读 多人点赞 2018-02-10 10:24:58
    [转] ...车载摄像头探查到图像,后台计算机可以自动将图像分割归类,以避让行人和车辆等障碍。随着近些年深度学习的火热,使得图像分割有了巨大的发展,本文为大家介绍深...
  • 一种基于图像交互式对的分割算法,原理和区域生长类似,通过不断合并区域,达到最终分割效果。
  • 常见图像分割算法实现源代码

    热门讨论 2014-09-30 16:31:01
    常见图像分割算法实现源代码,对于在选择合适的分割算法,可以做分析对比,减少开发时间,包括边界分割,阈值分割,区域分割等
  • Graphcut 图像分割算法

    2018-05-30 10:13:26
    此类方法把图像分割问题与图的最小割(min cut)问题相关联。首先用一个无向图G=,E>表示要分割的图像,V和E分别是顶点(vertex)和边(edge)的集合。此处的Graph和普通的Graph稍有不同。普通的图由顶点和边构成,...
  • 2.针对传统的模糊c均值聚类(FCM)图像分割方法未考虑图像的空间信息,本文采用了一种结合空问信息的模糊C均值聚类分割算法;该方法将图像的二维直方图引入传统的模糊C均值聚类算法,并对隶属函数做了改进;依据平方...

空空如也

1 2 3 4 5 ... 20
收藏数 152,454
精华内容 60,981
关键字:

图像分割