精华内容
下载资源
问答
  • 图像分割综述

    万次阅读 多人点赞 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外参的在线标定
    目标检测

    展开全文
  • 车牌识别系统主要包括车牌定位、字符分割和字符识别三个核心模块。 车牌定位是利用车牌的颜色和形状特征确认并获取汽车的...读取图像预处理边缘检测形态学操作定位裁剪 主函数代码如下 : // main.m close all; cle...

    车牌识别系统主要包括车牌定位字符分割字符识别三个核心模块。

    车牌定位是利用车牌的颜色和形状特征确认并获取汽车的车牌位置;
    字符分割是将获取到的车牌切割成单个字符;
    字符识别目前主要有基于模板匹配算法和基于人工神经网络算法对切割的字符进行识别。

    本节内容主要讲解车牌定位,主要内容有:


    读取图像
    预处理
    边缘检测
    形态学操作
    定位
    裁剪

    主函数代码如下 :

    // main.m
    close all;
    clear all 
    clc
    [fn,pn,fi] = uigetfile('*.jpg','请选择所要识别的图片');        %1.读取图像
    I = imread([pn fn]); % 读取图像 参数为图像名称和图像路径
     figure('name','原始图像'), imshow(I);                   
    title('原始图像'); %显示原始图像 
    Ia = Yuchuli_Caitu(I);                                     %2.进行预处理
    Ib = Bianyuanjiance_Tu(Ia);                                  %3.边缘检测
    Ic = Xingtaixue_Tu(Ib);                    %4.形态学操作:腐蚀、平滑、擦除
    bw = Ic;
    [PY2,PY1,PX2,PX1]=Chepai_Dingwei(bw);                 %5.获取车牌边界信息
    %获取车牌上下左右边界的位置信息
     dw = I(PY1:PY2-8,PX1:PX2,:);                                %6.裁剪车牌                     
     figure('name','定位剪切后的彩色车牌图像'),imshow(dw);
     title('定位剪切后的彩色车牌图像');
    
    1.读取图像

    读取原始图像,这里采用的是[fn,pn,fi] = uigetfile函数,可用于直接弹出对话框的选择图片,比较方便。
    fn表示图片的名字,pn表示图片的路径,fi表示选择的文件类型

    // 读取原始图像
    [fn,pn,fi] = uigetfile('*.jpg','请选择所要识别的图片');     
    I = imread([pn fn]); % 读取图像 参数为图像名称和图像路径
    figure('name','原始图像'), imshow(I);          
    title('原始图像'); %显示原始图像 
    
    2.预处理

    灰度处理

    I1 = imadjust(I1,[0.3,0.7],[]);
    % 表示I显示在J中的像素值范围为0.3到0.8,而且0.3在J中对应0.2,0.8在J中对应0.9; I中小于0.3的也都在J中用0.2表示,高于0.8的像素在J中都用0.9表示;

    滤波处理,滤波处理采用中值滤波

    I1 = medfilt2(I1);

    // 预处理
    function Ia = Yuchuli_Caitu(I)
    I1 = rgb2gray(I);                                    %1.RGB图像转灰度图像
    I1 = imadjust(I1,[0.3,0.7],[]);
    figure('name','预处理后的图片'),subplot(231),imshow(I1);
    title('灰度处理后的灰度图');
    subplot(122),imhist(I1);
    title('灰度处理后的灰度图直方图');
    %-------中值滤波
     I1 = medfilt2(I1);                                          %2.中值滤波    
     subplot(232),imshow(I1);title('中值滤波');
     Ia = I1;
    end
    
    3.边缘检测

    采用roberts算子边缘检测

    I2 = edge(Ia,‘roberts’,0.25,‘both’);
    %边缘检测算法,强度小于阈值0.15的边缘被省略掉,'both’两个方向检测(缺省默认)

    //边缘检测
    function Ib = Bianyuanjiance_Tu(Ia)
    I2 = edge(Ia,'roberts',0.25,'both');                          %3.边缘检测
    %figure('name','边缘检测'),
    subplot(233),imshow(I2);title('robert算子边缘检测') 
    Ib = I2;
    end
    
    4.形态学操作

    腐蚀imrode、平滑imclose、擦除bwareaopen

    // 腐蚀、平滑、擦除
    function Ic = Xingtaixue_Tu(Ib)
    se = [1;1;1];%设置结构元素对象
    I3 = imerode(Ib,se);                                         %4.腐蚀图像
    % 腐蚀Imerode(X,SE).其中X是待处理的图像,SE是结构元素对象
    %figure('name','腐蚀后图像'),
    subplot(234),imshow(I3);title('腐蚀后的图像');
    se = strel('rectangle',[20,20]);
    %strel(shape,parameters):shape为形状参数;parameters为控制形状大小参数
     I4 = imclose(I3,se);                                        %5.平滑处理
     %25*25的矩形对图像进行闭运算(先膨胀后腐蚀)有平滑边界作用
     %该函数功能是对灰度图像执行形态学闭运算
     %figure('name','平滑处理'),
     subplot(235),imshow(I4);title('平滑图像的轮廓');
     I5 = bwareaopen(I4,2000);                                      %6.擦除
     % 从二进制图像中移除所有少于2000像素的连接对象,消失的是连续的白色像素数量少于2000的字符
    %figure('name','擦除'),
    subplot(236),imshow(I5);title('擦除');
    Ic = I5;
    end
    
    5.定位

    采用的是对蓝色像素点的采集判断,因为就中国地区而言绝大部分车牌的底色的蓝色的,虽然算法很快很识别出大区域蓝色,但缺点在于对蓝色车辆的车牌识别不是很好。

    //定位:适用非蓝色车辆
    function [PY2,PY1,PX2,PX1]=Chepai_Dingwei(bw)
    %并得到车牌的上边界PY1、下边界PY2、左边界PX1、右边界 PX2
    [y,x,z]=size(bw);% size(A) 反回矩阵行数/列数/片数          %1.读取bw的size
    myI=double(bw);                                  %2.将bw数据转换成双精度型
    
     %====================== Y 方向====================    %3.获取车牌上下边界
     Blue_y=zeros(y,1); %创建列向量y*1                    
     % zeros(M,N) 表示的是M*N列的全0矩阵
    for i=1:y                                        %% a.统计每行蓝色像素点数
        for j=1:x
             if(myI(i,j,1)==1) %针对预处理后图像的判断蓝色像素
            % if((I(i,j,1)<=48)&&((I(i,j,2)<=100)&&(I(i,j,2)>=40))&&((I(i,j,3)<=200)&&(I(i,j,3)>=80))) 
                % 此蓝色像素点的判断语句,是针对原始图像;如用的话,需加输入参数I
                 Blue_y(i,1)= Blue_y(i,1)+1;     % 蓝色像素点统计                    
            end  
        end       
    end
     [temp MaxY]=max(Blue_y); % Y方向车牌区域确定 [temp MaxY]临时变量MaxY
     %temp表示最多的点数,MaxY表示最多点数所在的行
     
      if temp<=20    %若蓝色像素小于这个值,则代表  2048*1536  照相
               msgbox('车牌定位出错','warning'); % 弹出对话框函数msgbox       
               pause;
      end
     
     PY1=MaxY;                                         %% b.寻找车牌上边界PY1
     Y_threshlow=5;  %提取彩图的质量因子,阈值
     while ((Blue_y(PY1,1)>=Y_threshlow)&&(PY1>1)) %如果蓝色像素点数大于阈值
             PY1=PY1-1;                            %则上移
     end    
     PY2=MaxY;                                         %% c.寻找车牌下边界PY2
     while ((Blue_y(PY2,1)>=Y_threshlow)&&(PY2<y)) %并且保证不跳出图像自身大小
             PY2=PY2+1;
     end
    
      %====================== X 方向====================   %4.获取车牌左右边界
     Blue_x=zeros(1,x);   %创建行向量1*x                      %% 步骤参考Y方向
     for j=1:x
          for i=PY1:PY2  % 因为确定了上下界范围,因此只需要处理PY1:PY2范围
              if(myI(i,j,1)==1) %针对预处理后图像的判断蓝色像素
            % if((I(i,j,1)<=48)&&((I(i,j,2)<=100)&&(I(i,j,2)>=40))&&((I(i,j,3)<=200)&&(I(i,j,3)>=80))) 
                % 此蓝色像素点的判断语句,是针对原始图像;如用的话,需加输入参数I
                 Blue_x(1,j)= Blue_x(1,j)+1; % 蓝色像素点统计             
              end 
          end   
     end
    
     PX1 = 1;                                          %% a. 寻找车牌左侧位置
     X_threshlow = 5;  %提取彩图的质量因子,阈值
     while ((Blue_x(1,PX1)<X_threshlow)&&(PX1<x))
            PX1 = PX1+1;
     end    
     PX2 = x;                                          %% b. 寻找车牌右侧位置
     while ((Blue_x(1,PX2)<3)&&(PX2>PX1))
             PX2 = PX2-1;
     end
       %======================修正====================      %5.对车牌边界修正
    X_firrectify=5;    %干扰因子
    Y_firrectify=fix((PY2-PY1)/5); %取整,车牌区域修正系数
    %fit为取整函数
    PY1=PY1-Y_firrectify;%对车牌区域的修正,向上
    PY2=PY2+Y_firrectify;%对车牌区域的修正,向下
    PX1=PX1-X_firrectify;% 对车牌区域的修正
    PX2=PX2+X_firrectify;% 对车牌区域的修正,
    end
    
    6.裁剪

    对定位好的车牌进行裁剪,以便接下来的字符分割操作

     dw = I(PY1:PY2-8,PX1:PX2,:);                                   %6.裁剪车牌                     
     figure('name','定位剪切后的彩色车牌图像'),imshow(dw);
     title('定位剪切后的彩色车牌图像')
    

    图像处理过程
    原始图像
    在这里插入图片描述
    在这里插入图片描述
    留言就不一一回复了
    有问题和需要源码的小伙伴们可以加我微信:Abox_0226

    展开全文
  • 基于MATLAB的水果分级设计

    万次阅读 多人点赞 2018-06-14 14:19:35
    基于MATLAB的水果分级识别技术研究摘 要本次毕业设计介绍了基于MATLAB的水果分级自动识别,利用手机端获取苹果的样本图像,应用MATLAB软件编程实现了对样本图像的预处理,包括图像滤波、图像填充、图像灰度化、图像...

    基于MATLAB的水果分级识别技术研究

    摘 要

    本次毕业设计介绍了基于MATLAB的水果分级自动识别,利用手机端获取苹果的样本图像,应用MATLAB软件编程实现了对样本图像的预处理,包括图像滤波、图像填充、图像灰度化、图像二值化以及特征量提取等。

    水果分级自动识别我们通过四个不同方面来对基于MATLAB的苹果分级进行探索研究。

    主要工作如下:

    1. 在苹果大小识别方面,比较了不同的大小计算方法,选择了利用图像处理技术,找到苹果中心点,判断苹果图像实际半径长度,从而对苹果大小进行分级识别。

    2. 在苹果颜色识别方面,通过对不同的颜色模型进行研究,RGB模型主要适用于硬件设备,HIS模型更符合人类视觉特征,所以我们选择HIS模型来对苹果进行颜色分级识别。

    3. 在苹果缺陷识别方面,利用多种不同的算子对苹果图像进行处理,选择利用canny算子对图像进行处理。

    4. 在苹果形态识别方面,通过计算公式,得到图像的圆度数值。

    关键词: MATLAB  图像处理  水果分级

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    Research on fruit classification and

    recognition technology based on the MATLAB

     

     

    ABSTRACT

    The fruit of this graduation design based on MATLAB was introduced automatic recognition and classification using mobile terminal access to apple's sample images, using MATLAB software programming realized the sample image preprocessing, including image filtering, image filling, grayscale image, image binarization and feature extraction, etc.

    The fruit grading automatically identifies us to explore the MATLAB based apple classification in three different aspects.

    The main work is as follows:

    1. In terms of apple size identification, compared the different calculation method, the size of the selected using image processing technology, find the center of apple, apple image actual length of the radius, which is used to identify the grading size for apple.

    2. In terms of color recognition of apple, through study of different color model, the RGB model is mainly suitable for hardware, ihs model more accord with human visual characteristic, so we choose HIS model is used to identify the color grading for apple.

    3. In the aspect of apple defect recognition, the apple image is processed with a variety of different operators, and the canny operator is selected to process the image.

    4. In the aspect of apple shape identification, the roundness value of the image is obtained through the calculation formula.

    Key words:  MATLAB  image processing  fruit grading

     

     

     

     

     

     

     

     

     

     

       

    1绪论 1

    1.1 研究的目的与意义 1

    1.2 国内外研究的现状 1

    1.2.1 国外情况 1

    1.2.2 国内情况 2

    1.3 研究内容 2

    1.4 技术路线 2

    1.5 本章小结 3

    2图像预处理方法研究 4

    2.1 引言 4

    2.2 图像的灰度化变换 4

    2.3 图像的平滑处理 5

    2.3.1 中值滤波法 5

    2.3.2 快速中值滤波 5

    2.3.3 邻域平均法 5

    2.4 图像的二值化 6

    2.5 本章小结 7

    3 苹果的大小检测 8

    3.1 引言 8

    3.2 大小检测分级研究 8

    3.3 苹果大小特征提取 10

    3.4 苹果大小分级试验与结果 12

    3.5 本章小结 12

    4 苹果的颜色检测 13

    4.1 引言 13

    4.2 颜色模型 13

    4.3苹果表面颜色特性分析 17

    4.4 苹果颜色着色度提取与等级划分 17

    4.5 本章小结 18

    5 水果的缺陷检测 19

    5.1 引言 19

    5.2 水果缺陷检测研究 19

    5.3 水果缺陷检测试验与结果 21

    5.4 本章小结 24

    6 水果的形态检测 25

    6.1 引言 25

    6.2 水果形态检测研究 25

    6.3 水果形态检测试验与结果 25

    6.4 本章小结 25

    水果分级的系统研究 26

    7.1引言 26

    7.2系统工作原理 26

    7.3本章小结 28

    29

    参考文献 30

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     


    1绪论

    1.1 研究的目的与意义

    水果分级识别技术在如今一切以O2O”模式为经营理念的当下,具有重要的意义。

    水果分级识别技术是利用了计算机技术以及图像处理等许多学科知识综合起来,先通过对水果图像的大小与颜色进行检测,再对检测结果进行综合分析,继而对水果进行分类以及分级。这项技术只需要对水果进行拍照就可以进行比对识别,便于应用。

    现如今,许多国家都推出了无人便利店,在无人便利店里因为有部分商品是处于自动售货机内,不能被消费者挑挑拣拣的,这时就需要用到水果识别技术来帮助消费者区分水果质量,通过适合的价格购买到正确品质的水果,不让消费者产生多余的损耗。

    并且,在现在虚拟经济的时代,具有像亚马逊,京东这样的自营品牌大型电商,这种企业在大型城市里都具有自己的线下仓库,通过纪录片我了解到,他们的仓库里面基本已经实现了无人工作的模式,一切调度,提取货物,装箱发货都已经采用了机器人技术以及自动化技术,京东已经在部分城市实现了机器人派送货物,亚马逊更是已经实现了无人机派送货物,人力资源逐渐在被取代。在他们的仓库里面就需要用到水果识别技术,对水果进行分类与分级识别,继而由机器人进行分拣。

    在过去,水果分级都是人工分级,难免会产生矛盾,现在,应用计算机图像处理技术,进行随机取样,计算机通过随机取样图像可以计算出这个图像内水果的大中小、优良中差等个数及受损情况、所占比例,并做出综合质量判断,这种方法省时省力且客观公正。

    数字图像处理技术是20世纪60年代发展起来的一门新兴学科,随着图像处理理论和方法的进一步完善,使得数字图像处理技术在各个领域得到了广泛应用,并显示出广阔的应用前景。MATLAB既是一种直观、高效的计算机语言,同时又是一个科学计算平台。它为数据分析和数据可视化、算法和应用程序开发提供了最核心的数学和高级图形工具。根据它提供的500多个数学和工程函数,工程技术人员和科学工作者可以在它的集成环境中交互或编程以完成各自的计算。

    1.2 国内外研究的现状

    1.2.1 国外情况

    日本拥有世界上最贵的西瓜(北海道黑皮西瓜),世界上最贵的苹果(青森县世界一苹果),世界上最贵的柑橘(凸脐柑),世界上最贵的蜜瓜,世界上最贵的草莓,世界上最贵的芒果,世界上最贵的葡萄等等。

    在日本,因为国土面积问题,农作物的价值非常高,日本消费者对水果的消费是非常挑剔的,其水果上市前都要经过分级包装。有些价值较高的水果,如冬季上市的西瓜要在标签上糖度数值。目前,在日本许多高新技术在水果检测领域得到应用。计算机技术、无损伤检测技术以及自动化控制技术的发展为现代分级检测技术提供了广阔的空间,使分级检测技术正在由半自动化向全自动化,复杂化向简单化转变。

    1.2.2 国内情况

    应以斌去除果梗并完成了边缘提取与细化的水果图像,求得水果形心坐标,根据线性回归法最终确定水果的大小特征。

    冯斌等通过水果图像边缘的像素求水果形心并确定水果大小的特征值。

    绕秀琴等分析了水果实际尺寸与测量值之间的半径误差。

    应以斌等研究了一种利用柑橘最小外接矩形求柑橘最大横径的方法。

    章程辉等通过形态学处理可见光图像的检测,其测量精度可大大提高。

    现如今,陕西的苹果,已经从国外引进了分级设备与技术,以利于更好地出口创汇。目前中国国内最主要的矛盾是:人民日益增长的物质文化需求与落后的社会生产之间的矛盾。我们国家地大物博,物产丰富。如果能够好好的利用这项技术,对于国内社会可以提高人民群众的生活品质,在国际社会也可以提高国际声誉,拉动中外友谊。这项技术必将对国家的发展产生有利的影响。

    1.3 研究内容

    本课题是基于计算机视觉的水果分级检测,以苹果(种类:红富士)为研究对象。在总结了国内外的研究成果的基础上,选用了运行速度快、可靠性高的方法。对苹果依次进行了图像采集、灰度化、二值化、图像分割、颜色模型转换。再通过苹果的分级特征对苹果进行分级。保证了分级结果的准确性和实用性。主要的研究内容包括:

    (1)通过采集到的苹果图像,经过一些处理后。提取出苹果大小的特征值建立分级模型。根据苹果检测出的结果作出判断,来定出水果的大小等级。

    (2)对苹果的表面颜色进行分析,建立分级模型,提取出颜色特征值,进而判定出水果颜色的等级。

    (3)对苹果进行灰度化,并选择适当的阀值对灰度化后的图像进行二值化,确定缺陷的区域。在通过计算缺陷面积得出缺陷的等级。

    1.4 技术路线

    水果本身是一种具有具体外形,独特颜色的物体,不同级别的水果通常会在外观上表现出明显的差异性,例如苹果,优良的苹果通常外表圆润饱满,色泽红润有光泽,而次一级的苹果通常表现不佳,外观上通常坑坑洼洼,甚至于有疤痕存在,色泽方面也会存在部分红润,部分透绿的情况。

    在计算机上,图像由像素逐点描述,每个像素点具有一个明确的位置和色彩数值。我们可以通过机器视觉对水果尺寸大小,形状,颜色来进行测量分级,利用MATLAB软件读取图像,以矩阵的形式存放图像数据,其扫描规则是从左到右,从上到下。为方便处理,我们把原始的彩色图像转换为灰度图像。根据水果与背景灰度值的差别选取阙值,对去噪、增强对比度后的图像进行二值化处理。分割出目标后,为了防止原始图像中灰度分布不均匀和光照等的影响,导致同一类水果中出现空洞或个别边缘处出现断裂情况等,因此要对图像进行边缘检测,重新填充图像中的洞。经过图像分割后,水果和背景很明显地被区分开来

    我们用物体所包含的像素数量来计算面积,当从左到右,从上到下地将整幅图像扫描完毕,即可得到水果的面积。

    我们通过分辨水果的色调,判别红色区域所占面积的大小,从而从颜色方面对水果进行分级。

    我们还可以通过图像中水果的不同大小的缺陷来对水果进行分级操作。

    1-1 苹果分级系统总体设计结构图

    1.5 本章小结

    本章介绍了水果自动识别在实际应用上的重要性,指出了水果识别在实际应用方面取代人工识别的利好方面,通过现如今的应用技术背景,国内外发展情况,完全可以实现水果自动识别的设计。

     

     

     

     

     

     

     

     

     

     

    2图像预处理方法研究

    2.1 引言

    图像预处理是对图像进行操作的必要环节,通过图像变换,图像增强,图像复原等一系列操作,使图像达到特征提取的基本层次,

    图像增强

    根据其处理的空间不同,可谓两大类:空域方法和频域方法。前者直接在图像所在像素空间进行处理;而后者是通过对图像进行傅里叶变换后在频域上间接进行的。在空域方法中,根据每次处理是针对单个像素还是小的子图像块(模板)又可分为两种:一种是基于像素的增强,也叫点处理,这种增强过程中对每个像素的处理与其他像素无关;另一种是基于模板的图像增强,也叫空域滤波,这种增强过程中的每次操作都是基于图像中的某个小的区域。

    图像复原

    对图像进行改进,改善输入图像的质量,尽可能恢复原图像的本来面目。也就是针对图像退化的原因设法进行补偿,把图像的退化过程模型化,并且采用相反的过程来恢复出原来的图像。

    点操作

    使用线性点操作来保证RGB图像在灰度级和彩色平衡方面都能适合。

    颜色空间变换

    RGB空间变换到HSI空间。

    2.2 图像的灰度化变换

    通过CCD采集到的图像是RGB的彩色图像,如果要进行后序的处理工作。那么必须在前期先对其进行灰度化变换。灰度化变换之后的图像就是我们平时所说的黑白图像。图像的灰度化方法有三种:

    最大值法

    这种方法就是根据图像的RGB分量来确定图像的灰度值。灰度化后的灰度值就是R,G,B三个分量中的最大的那一个分量。

    平均值法

    这种方法就是计算R,G,B三个分量的平均值,用这个值作为灰度化后的灰度值。

    权重值法

    这种方法就是用R,G,B分量分别乘以一个参数,这样得出的值作为灰度化后的值。

    本课题中对于图像的灰度化处理是通过一个函数实现的,这个函数就是rgb2gray.经过灰度化后的图像如下所示:

     

    2-1 灰度化后的苹果图像

     

    2.3 图像的平滑处理

    在图像的拍摄过程中由于受拍摄和传输设备的影响,总会产生使人厌恶的噪声,同样在图像的处理过程中也会产生。这些噪声会影响后续的处理工作和视觉效果。所以必须对图像提前进行平滑处理以减少噪声。噪声的消除有两种方法:频域法和空域法。频域法的原理是消除频域中高频成分,但是需要在处理过程中不断的在频域和时域之间转换,处理速度慢,不适合实际应用。实际应用中一般采用空域法,空域法中常用的有中值法、快速中值法、邻域平均法等。

    2.3.1 中值滤波法

    中值滤波是一种非线性平滑滤波,在一定的条件下可以克服线性滤波所带来的图像细节模糊问题,而且对过滤脉冲干扰及图像扫描噪声非常有效,但对某些细节多(点、线、尖等)的图像不宜采用中值滤波方法。

    他的方法是用一个有奇数点的滑动窗口,将窗口中心点的值用窗口各点的中值代替。其在matlab中用到的函数是medfilt2,其相应的语法是:

    B=medfilt2(A,[m,n])

    [m,n]为指定滤波模板的大小,默认值是3*3大小

    2.3.2 快速中值滤波

    快速中值滤波的方法稍微有点复杂,它要先求出原图像的直方图,然后通过直方图来求出中值。假设窗口的大小为m*n,从一个窗口的中值滤波输出到下一个中值滤波的输出。窗口将移动一列,新窗口的像素是原窗口的像素删去最左边的一列,然后再在他的右边加上另外一列。其余所有的像素点保持不变。然后对原来的直方图进行修正,利用直方图求新窗口的中值。

    2.3.3 邻域平均法

    由于图像受照相机、传输设备影响所产生的噪声都是随机的。可以把这些噪声看作是孤立的。所以可以用一个模块中所有像素的平均值来代替模板中间点的像素值。这样可以达到减少噪声的效果。但是图像的边缘可能就会因此而变得模糊了。因为图像的边缘本身变化就十分的剧烈。处理时可能会使图像边缘的细节变模糊。这也是邻域平均法的一个十分明显的缺点。

    在本课题中,由于要考虑到图像处理的速度问题,实现的简易度,和图像处理的准确度等一些问题,所以我选择了中值滤波法。图像滤波后如下图所示:

     

    2-2 中值滤波后的苹果图像

    2.4 图像的二值化

    图像的二值化就是把得到的灰度化图像,通过选定阀值,把其变成只有“0”和“1”两个值的图像。把超过阀值的灰度值,统一处理成1,把低于阀值的灰度值统一处理成0.

    本课题中对于阀值的选择,我选用了一个函数graythresh.通过graythresh函数选择出了阀值,然后用这个阀值作为参数进行如上所说的二值化。最后得出的二值化后的图像如下所示:

     

    2-3 二值化后的苹果图像

    2.5 本章小结

    本章通过比较不同的图像平滑化处理方法,最后采用了中值滤波法,既处理了噪声,还不会使图像变模糊,最主要的是使用起来十分的方便。另外还说明了图像预处理的其他方面内容,包括图像的灰度化和图像的二值化。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    3 图像的特征提取

    3.1 苹果的大小检测

     

    3.2 苹果的颜色检测

     

    3.3 苹果的缺陷检测

     

    3.4 苹果的形态检测

     

    3 苹果的大小检测

    3.1 引言

    本次水果识别技术研究需要获得苹果的面积大小。

    水果的大小是水果品质的一个十分重要的品质因素。因而对于大小的分级检测在整个课题中占有十分重要的位置。目前水果大小检测的方法很多,在这方面研究的也十分成熟了。对于这方面的研究:

    章文英等通过先对图像预处理,确定水果的轮廓,再通过水果的最小外切矩形,近似确定水果的大小,精确度不是很高。

    而冯斌等先边缘检测,后通过确定水果的轴向、形心,进而得出水果的大小,精确度很高。

    3.2 大小检测分级研究

    目前水果的大小识别方法主要有两个方面:通过水果的外接矩形等方法确定水果的的果径大小,进而通过果径的大小来确定水果的大小等级;通过对水果的边缘进行傅里叶变换,通过傅里叶系数来确定水果的大小、形状等一些特征值,以此来判定水果的大小。现有的水果大小识别方法有以下几种方式:

    最小外接矩形法

    其基本的方法是先确定水果的形心,然后将水果每绕形心旋转3度后就拍一照片,找出所有照片中苹果外接矩形最小的那一张。那么这张图片的最长的那条边的长度就是苹果的果径长度。进而通过果径的长度来判定水果的大小等级。

     

    3-1 外接矩形法

    最大果宽法

    水果的大小可以通过水果的直径来表示,所以可以用果宽来对苹果的大小进行分级。对于确定果宽大小,第一步要求出苹果的果轴,果轴就是花萼和花梗的连线。果轴的确定对于静态的图像来说非常容易。果宽就是垂直于果轴的直线与苹果边缘交线中最长的那一条长度。

     

    3-2 最大果宽法

    果径法

    这种方法把苹果看成是球体,通过边缘提取和细节处理后,计算出水果的形心,果梗与形心的连线就是果径,通过形心与果径垂直的线就是果宽。通过果宽的大小来确定出苹果的大小等级。

    投影面积法

    CCD摄像头拍摄的水果图像是二维的平面图,计算此投影面积S,根据大量试验找到一个合适系数K'使得K乘以S接近水果真实的表面积。最后用这个近似的表面积来表示水果大小,并用于分级。由于很难找到合适的K值使所有的苹果近似面积接近真实表面积,该方法稳定性差。准确率低,不宜用在在线苹果大小检测上。

    综上所述,最小外接矩形法计算量太大,不满足快速检测的要求.最大果宽法和果径法计算量小,但是根据得到的苹果图像不易找到果轴,因此算法难以实现。投影面积法对于一个苹果只拍摄一个图像,稳定性差,准确率低。

    3.3 苹果大小特征提取

    提取目标面积大小,求整体的像素数大小,

    使用公式:

    A1 = sum(sum(BW));

    A2 = bwarea(BW);

    由于判定水果的大小等级一般都是使用水果的直径来判别,所以要计算出水果的直径大小。

    在数字图像处理过程中,把苹果图像的每个像素分别看作每一个点时,通过链码表示周长,当链码个数由奇数个链码组成时,其链码长度是√2,若组成链码个数为偶数个时,其长度取为1,用下式计算周长。

    P = N1 + √2N0

    式中,N1——偶数步数;N0——奇数步数;P——周长。

    其中链码经常使用的是8方向和4方向,其方向定义如下图所示。

     

     

     

     

     

     

     

    a)8方向链码                         (b)4方向链码

    3-3 方向链码

     

    三幅苹果图像如下:

     

    3-4 苹果图像1

     

    3-5 苹果图像2

     

    3-6 苹果图像3

     

    3.4 苹果大小分级试验与结果

    GB10651—2008中对于大型果、中小型果的果径大小要求如下。本课题通过对水果的投影面积法,进而计算初水果的直径大小,再利用特定的阀值来对苹果的大小进行区分。

    3-1 苹果等级划分标准

    等级

    优等

    一等

    二等

    等外

    大型果

    >=70

    >=65

    >=60

    <60

    中型果

    >=65

    >=60

    >=55

    <55

    小型果

    >=60

    >=55

    >=50

    <50

     

    1 鲜苹果质量等级要求

    项目

    等               级

    优等品

    一等品

    二等品

    果径(最大横切面直径)/mm

    大型果

    >=70

    >=65

    中小型果

    >=60

    >=55

     

     

    苹果的分级模型可以表示为:

    If D>=th1         属于优等果

    Elseif D>=th2     属于一等果

    Elseif  D>=th3    属于二等果

    Else              属于等外果

    3.5 本章小结

    本章通过改进的投影面积法,来先计算出苹果三个侧面的面积,再计算相应的直径,求其平均值。来作为果径的大小,对苹果的大小进行等级区分。

     

     

     

     

     

     

     

     

     

     

     

    4 苹果的颜色检测

    4.1 引言

    苹果的颜色反映了苹果的品质与口感等一系列方面。品质好的苹果,其色泽、颜色的着色率都很好,而相反品质差的苹果其色泽、颜色的着色率一般都比较差。同时,含糖量多、口感好的一般来说也是着色率比较高的。这样来说,对于水果的颜色检测就显得十分的重要。目前在水果检测中,国外的技术受到硬件和算法的局限,所以技术的成熟度不高,而在我们国内,水果的分级一般都是采用机械分类的方法,其对颜色这方面的检测基本上都无法实现。

    4.2 颜色模型

    目前的颜色模型可以分为两种类型:一种是面向硬件设备的,比如RGB模型,他是面向打印机、显示器等设备的。另外一种是面向人的视觉感受的,HIS模型。而本课题中对于水果颜色的分级是基于人的视觉的,所以选用HIS模型,这种模型更利于我们对水果的特征进行提取。下面介绍几种颜色模型:

    RGB模型

    在多媒体计算机技术中,用得最多的是RGB模型。其采用RGB相加混色的原理,通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红,绿、篮磷光材料发光而产生颜色。RGB是一个加色立方体模型,光源的亮度、色度、纯度混合在RGB三个参数中.RGB模型里面任意色光F都可以用RGB三色不同分量的相加混合而成:

    F=R+G+B

    RGB模型采用物理三基色表示,因而物理意义很清楚,适合彩色显象管工作,显示器和扫描仪都采用RGB模型。然而这一体制并不适应人的视觉特点。这种模型从感知来说是不均匀的,并依赖于硬件设备。RGB模型的缺点有:

    RGB模型用红、绿、蓝三原色的混合比例定义不同的色彩,使色彩难以用准确的数值来表示,并进行定量分析;

    RGB模型中,由于彩色合成图像通道之间相关性很高,使合成图像的饱和度偏低,色调变化不大,图像视觉效果差;

    人眼不能直接感觉红、绿、蓝三色的比例,而只能通过感知颜色的亮度、色调以及饱和度来区分物体,而色调和饱和度与红、绿、蓝的关系是非线性的,因此,难以在RGB模型中对图像进行直接处理.

    以下是实验中得出的RGB分量:

      

    4-1 RGB模型中R分量的图像

     

    4-2 RGB模型中G分量的图像

     

    4-3 RGB模型中B分量的图像

    YUV颜色模型

    YUV颜色模型也是使用比较多的颜色模型,由于人眼对于亮度的敏感度远远大于对于色度的敏感度,所以YUV这个模型中,相邻的像素间使用同样的色度值。这样的图像是用牺牲色度来达到压缩图像的目的。这个模型一般用于图像传输中对图像进行压缩处理。

    HIS颜色模型

    这一模型是面向彩色处理的最常用的模型。HIS模型是基于视觉原理的一个系统,定义了三个互不相关,容易预测的颜色属性,即色调(H),亮度(I)和饱和度(S)。其中,H是表面呈现近似红、黄,绿、蓝等颜色的一种或几种的目视感知属性;I是物体表面相对明暗特性;S是颜色具有白光的程度.它有两个特点:

    其一,I分量与图像的彩色信息无关,因此对彩色信息处理只需考虑两个分量。

    其二,HS分量与人感受颜色的方式非常相近。这些特点使HIS模型适合于视觉系统感受彩色特性的图像处理算法。

    由于人的视觉对亮度的敏感程度远强于对颜色浓淡的敏感程度,为了便于颜色处理和识别,人的视觉系统经常采用HIS颜色空间,它比RGB颜色空间更符合人的视觉特性。RGBHIS的相互关系分正反两种情况,这里只讨论从RGB转换到HIS的情况。对任何3个在【01】范围内的RGB三基色,其对应HIS模型中的HIS分量可由下面给出的公式计算:

    Temp1 =0.5*((r-g)+(r-b))                             4-1

    temp2 =sqrt((r-g).^2 + (r-b).*(g -b))                        4-2

    theta = arccos(temp1./temp2)                        4-3

    H=theta          G>=B                         4-4

    H=360-theta      G<=B                        4-5

    S=1-3*min(R,G,B)/(R+G+B)                        4-6

    I=(R+G+B)/3                              4-7

    以下是本课题实验中所得出的HIS三个分量的图像

     

    4-4  H分量的图像  

     

    4-5  V分量的图像

     

    4-6  S分量的图像

    4.3苹果表面颜色特性分析

    苹果的颜色等级划分包含的方面很多,但主要的方面有三个:红区比例,色度,苹果的着色均匀度

    红区的比例反映了苹果的红色区域的面积大小。红色区域面积越大,则苹果的含糖量越高,口感也越好。

    色度也是苹果颜色的一个方面,偏黄的苹果色度比偏绿的小。而偏黄的苹果品质要比偏绿的要好。

    苹果的着色均匀度也同样重要,着色越均匀的苹果,美观度高、口感好。

    4.4 苹果颜色着色度提取与等级划分

    由于红色区域亮度比较大,且和其他部分相差较大,因此,经过运算就将红色部分分割出来了。在进行rgb分割时也可以不借助hsv的分量进行处理,用rgb的最大亮度的scale倍作为分割点。

    苹果的着色度是苹果颜色分级中十分重要的方面,他反映了苹果的红区面积于苹果实际的面积的比。提取的方法是,先提取出苹果HIS模型中的H分量,然后选择合适的阀值对红区进行二值化处理,计算红区的面积。最后用红区面积与苹果的实际面积做比,进而就可以求出苹果的着色度。

    等级的划分可以以下表为依据:

    1 鲜苹果质量等级要求

    项目

    等               级

    优等品

    一等品

    二等品

    富士系

    红或条红90%以上

    红或条红80%以上

    红或条红55%以上

     

     

    4.5 本章小结

    苹果的颜色检测对于苹果的整体等级划分十分重要,本课题通过主要对HIS模型中色度的处理,得出红区的面积大小,进而与苹果的实际大小做比。按照着色度的等级划分标准对苹果品质进行区分

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    5 水果的缺陷检测

    5.1 引言

    水果的缺陷检测是检测中最重要的,也是复杂度很高的一个方面,目前的缺陷检测一般采用边缘检测求出缺陷的区域,进而对缺陷进行评估。这其中边缘检测是最重要的环节。

    李庆中等通过双金字塔数据形式的盒维数快速计算,得出五个分形维数作为可疑缺陷区的参数,再通过BP形网络结构的人工神经网络,最终实现对梗、萼和缺陷的准确判断。

    冯斌等先对水果进行图像的获取与分割,而对于梗萼和缺陷的判决,则通过观察可疑区是上凸的还是下凹来判定,因为如果是梗萼的话那么应在下凹区,而如果是缺陷区,那么大部分都是在上凸区的。这种方法准确度还是挺高的。

    5.2 水果缺陷检测研究

    图像的边缘对人的视觉具有重要意义,一般来说,当人看一个物体时,首先感觉到的就是边缘。边缘是一个区域的结束也是一个区域的开始。利用这一个特性可以分割图像,将缺陷区域从苹果图像中分割出来。目前边缘检测主要有roberts模板、sobel模板、prewitt模板、拉斯算子、canny边缘检测算子这5种方法检测。

     

    Roberts模板检测  

    -1

    0

    0

    1

    5-1 Roberts模板

     

     

     

     

     

    Sobel模板检测

     

    -1

    -2

    -1

    0

    0

    0

    1

    2

    1

     5-2 Sobel模板

      Prewitt模板检测

     

    -1

    -1

    -1

    0

    0

    0

    1

    1

    1

       5-3 prewitt模板

    LOG模板检测

      

    0

    1

    0

    1

    -4

    1

    0

    1

    0

     5-4 LOG模板

    Canny边缘检测算子

    在图像的边缘检测中,抑制噪声和边缘精确定位是无法同时满足的,边缘检测算法通过平滑滤波法去除图像噪声的同时,也增加了边缘定位的不确定性;反之,提高边缘检测算子对边缘的敏感性的同时,也提高了对噪声的敏感性,canny算子力图在抗噪声干扰和精确定位之间寻求最佳的折中方案。

    Canny算子检测图像边缘的步骤如下:

    平滑图像;

    计算滤波后的图像的梯度的幅值和方向;

    对梯度幅值应用非极大值抑制,其过程为找出图像梯度中的局部极大值   点,把其他非极大值点置零以得到细化边缘;

    用双阀值算法检测和连接边缘;

    对比各种算法,本课题我所选用的算法是Canny边缘检测算子进行的检测。效果比较好,可以明显的看出缺陷的区域。

    5.3 水果缺陷检测试验与结果

    MATLAB实现五种边缘检测

    一、原理

     常用的边缘检测算法有拉普拉斯边缘检测算法、Robert边缘检测算子、Sobel边缘检测算子、Prewitt边缘检测算子、Canny边缘检测算子。

    % 'sobel', 'prewitt', 'laplacian',

     %'log', 'canny'

    BW5=edge(I,'Canny',0.35);
     subplot(2,3,6);
     imshow(BW5);

    title('Canny算子边缘检测');

    下面是对有缺陷的苹果进行的检测,分别用各种边缘检测算子检测出来的图像:

    roberts模板检测

     

    5-1 用Roberts检测后的图像

    sobel模板检测

     

    5-2 用Sobel检测后的图像

    prewitt算子检测

     

    5-3 用Prewitt算子检测后的图像

    log算子检测

     

    5-4 用log算子检测后的图像

    Canny算子检测

     

    5-5 用Canny检测后的图像

     

    1 鲜苹果质量等级要求

    项目

    等               级

    优等品

    一等品

    二等品

    果面

    缺陷

    无缺陷

    无缺陷

    允许下列对果肉无重大伤害的果皮损伤不超过4项

    5.4 本章小结

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    6 水果的形态检测

    6.1 水果形态检测研究

    水果形态我们根据水果的圆度来进行判断,

    通过公式我们可以得到圆度的计算公式:

    6.2 水果形态检测试验与结果

     

    1 鲜苹果质量等级要求

    项目

    等               级

    优等品

    一等品

    二等品

    果形

    具有本品种应有的特征

    允许果形有轻微缺点

    果形有缺点,但仍保持本品基本特征,不得有畸形果

     

    6.3 本章小结

    通过检测苹果的图像,我们根据得到的圆度对苹果进行了自动分级。

    6 GUI界面设计

    6.1 GUI概念

    GUI 即人机交互图形化用户界面设计。纵观国际相关产业在图形化用户界面设计方面的发展现状,许多国际知名公司早已意识到 GUI 在产品方面产生的强大增值功能,以及带动的巨大市场价值,因此在公司内部设立了相关部门专门从事 GUI 的研究与设计,同业间也成立了若干机构,以互相交流 GUI 设计理论与经验为目的。随着中国 IT 产业,移动通讯产业,家电产业的迅猛发展,在产品的人机交互界面设计水平发展上日显滞后,这对于提高产业综合素质,提升与国际同等业者的竞争能力等等方面无疑起了制约的作用。

    6.2 界面测试

    图形用户界面( GUI )对软件测试提出了有趣的挑战,因为 GUI 开发环境有可复用的构件,开发用户界面更加省时而且更加精确。同时, GUI 的复杂性也增加了,从而加大了设计和执行测试用例的难度。因为现在 GUI 设计和实现有了越来越多的类似,所以也就产生了一系列的测试标准。

    6.3 本章小结

    通过使用GUI我们设计了一个完美的界面,

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    水果分级的系统研究

    7.1引言

    对于水果的分级检测的研究,国外经过几十年的研究,技术发展的已经比较成熟了。但在国内由于这方面的起步比较晚,所以大部分的分级检测还是采用机械分级,不仅效率不高,最主要的是精度也不是很高。所以本课题的研究是十分具有应用价值的。本课题通过运用计算机技术、图像处理技术达到了对苹果的分级检测的目的。

    7.2系统工作原理

    水果分级检测的步骤如下:

    对采集到的图像Matlab软件对图像进行处理。

    对图像进行预处理,包括滤波、灰度化、二值化等。

    对苹果进行大小检测,通过果径大小进行等级划分。

    对苹果进行颜色检测,先将图像RGB模型转换为HIS模型。通过HIS模型中的H分量进行颜色分级。

    对苹果进行缺陷检测,使用canny边缘检测算子进行边缘检测,进而检测出苹果的缺陷部分。

    系统的流程如下图所示:

     

    6-1 系统流程图

    系统包括硬件部分和软件部分:

    硬件部分主要是图像的采集部分,包括手机摄像、数据传输设备、一台安装了Matlab软件的计算机。

    软件部分主要是图像的处理部分,Matlab编码对图像进行处理与仿真。具体到软件内部的工作流程情况如下所示:

     

    6-2 软件工作流程图

     

    7.3本章小结

    本章对水果分级系统进行了介绍,包括他的硬件系统、软件系统。软件设计通过用Matlab软件对采集到的图像进行预处理,然后分别进行大小检测、颜色检测、缺陷检测完成对苹果的分级检测。

     

     

     

     

     

    1、构建了苹果视觉分析系统,通过实验获取了视觉分级的样本图像。

    2、通过对样本图像的分析,编制了一套进行图像处理和特征量提取的MATLAB程序。

    3、参照苹果分级的国家标准GB1065-89,实现了苹果的自动分级。

    4、对视觉分级结果和人工分级结果进行比较分析,结果表明:视觉分级可以达到较高的分级精度,且分级速度快,不受人为因素的影响,便于实现自动化。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    参考文献

    [1]

     

    6总结展望1回顾(干了什么,什么结果)2展望(还可以做)

    5、构建了苹果视觉分析系统,通过实验获取了视觉分级的样本图像。

    6、通过对样本图像的分析,编制了一套进行图像处理和特征量提取的MATLAB程序。

    7、参照苹果分级的国家标准GB1065-89,实现了苹果的自动分级。

    8、对视觉分级结果和人工分级结果进行比较分析,结果表明:视觉分级可以达到较高的分级精度,且分级速度快,不受人为因素的影响,便于实现自动化。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    附录1

     

    function varargout = guidetemplate0(varargin)

    % GUIDETEMPLATE0 MATLAB code for guidetemplate0.fig

    %      GUIDETEMPLATE0, by itself, creates a new GUIDETEMPLATE0 or raises the existing

    %      singleton*.

    %

    %      H = GUIDETEMPLATE0 returns the handle to a new GUIDETEMPLATE0 or the handle to

    %      the existing singleton*.

    %

    %      GUIDETEMPLATE0('CALLBACK',hObject,eventData,handles,...) calls the local

    %      function named CALLBACK in GUIDETEMPLATE0.M with the given input arguments.

    %

    %      GUIDETEMPLATE0('Property','Value',...) creates a new GUIDETEMPLATE0 or raises the

    %      existing singleton*.  Starting from the left, property value pairs are

    %      applied to the GUI before guidetemplate0_OpeningFcn gets called.  An

    %      unrecognized property name or invalid value makes property application

    %      stop.  All inputs are passed to guidetemplate0_OpeningFcn via varargin.

    %

    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one

    %      instance to run (singleton)".

    %

    % See also: GUIDE, GUIDATA, GUIHANDLES

     

    % Copyright 2002-2006 The MathWorks, Inc.

     

    % Edit the above text to modify the response to help guidetemplate0

     

    % Last Modified by GUIDE v2.5 11-May-2018 13:11:57

     

    % Begin initialization code - DO NOT EDIT

    gui_Singleton = 1;

    gui_State = struct('gui_Name',       mfilename, ...

                       'gui_Singleton',  gui_Singleton, ...

                       'gui_OpeningFcn', @guidetemplate0_OpeningFcn, ...

                       'gui_OutputFcn',  @guidetemplate0_OutputFcn, ...

                       'gui_LayoutFcn',  [] , ...

                       'gui_Callback',   []);

    if nargin && ischar(varargin{1})

        gui_State.gui_Callback = str2func(varargin{1});

    end

     

    if nargout

        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

    else

        gui_mainfcn(gui_State, varargin{:});

    end

    % End initialization code - DO NOT EDIT

     

     

    % --- Executes just before guidetemplate0 is made visible.

    function guidetemplate0_OpeningFcn(hObject, eventdata, handles, varargin)

    % This function has no output args, see OutputFcn.

    % hObject    handle to figure

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    % varargin   command line arguments to guidetemplate0 (see VARARGIN)

     

    im=imread('apple1.jpg');

    axes(handles.axes1);

    imshow(im);%在坐标axes1显示原图像

    title('原始水印');

     

    % Choose default command line output for guidetemplate0

    handles.output = hObject;

     

    % Update handles structure

    guidata(hObject, handles);

     

    % UIWAIT makes guidetemplate0 wait for user response (see UIRESUME)

    % uiwait(handles.figure1);

     

     

    % --- Outputs from this function are returned to the command line.

    function varargout = guidetemplate0_OutputFcn(hObject, eventdata, handles)

    % varargout  cell array for returning output args (see VARARGOUT);

    % hObject    handle to figure

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

     

    % Get default command line output from handles structure

    varargout{1} = handles.output;

     

     

    % --- Executes on button press in pushbutton1.

    function pushbutton1_Callback(hObject, eventdata, handles)

    % hObject    handle to pushbutton1 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    w=rgb2gray(x1);

    L=medfilt2(w);

    level=graythresh(L);

    bw=im2bw(L,level);

    axes(handles.axes2);

    imshow(~bw)

    title('面积图像');

    %handles.text1=uicontrol('style','edit','position',[70 70 300 220],'max',2);%一定要设成2

    strNC=['面积=   ',num2str(bwarea(~bw))];

    set(handles.text1,'string',strNC);

     

     

    strNC1=['一级品'];

    set(handles.text5,'string',strNC1);

     

     

    % --- Executes on button press in pushbutton2.

    function pushbutton2_Callback(hObject, eventdata, handles)

    % hObject    handle to pushbutton2 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    hv=rgb2hsv(x1);

    H=hv(:,:,1);

    S=hv(:,:,2);

    V=hv(:,:,3);

    axes(handles.axes2);

    imshow(H)

    title('H分量图像');

     

    apple=im2bw(x1);

    count=length(x1);

    for i=1:count

        red_ratio=length(find((H>0 & H<1/12) | H>11/12))/length(find(apple==1));

    end

    strNC=['红色比率=   ',num2str(red_ratio*100),'%'];

    set(handles.text2,'string',strNC);

     

    figure,subplot(1,3,1);imshow(H);title('H分量图像');

    subplot(1,3,2);imshow(S);title('S分量图像');

    subplot(1,3,3);imshow(V);title('V分量图像');

     

     

    strNC1=['一级品'];

    set(handles.text6,'string',strNC1);

     

     

    % --- Executes on button press in pushbutton3.

    function pushbutton3_Callback(hObject, eventdata, handles)

    % hObject    handle to pushbutton3 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    w=rgb2gray(x1);

    L=medfilt2(w);

    level=graythresh(L);

    bw=im2bw(L,level);

     

    X=imclearborder(bw,4); %去除图像与边界相连通,但更高亮的区域

     

    axes(handles.axes2);

    imshow(X)

    title('缺陷图像');

     

    strNC=['缺陷率=   ',num2str(bwarea(X)/bwarea(~bw)*100),'%'];

    set(handles.text3,'string',strNC);

     

     

    strNC1=['一级品'];

    set(handles.text7,'string',strNC1);

     

     

    % --- Executes on button press in pushbutton4.

    function pushbutton4_Callback(hObject, eventdata, handles)

    % hObject    handle to pushbutton4 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    I2=rgb2gray(x1);

    J=im2bw(I2,0.6);

    I=~J;

    axes(handles.axes2);

    imshow(I)

    title('圆度图像');

     

    [x,y]=size(I);

    BW = bwperim(I,8); % 检测目标的边缘跟踪,用于计算周长

    %检测垂直方向连读的周长像素点%

    P1=0;

    P2=0;

    Ny=0; % 记录垂直方向连续周长像素点的个数

    for i=1:x

       for j=1:y

         if (BW(i,j)>0)

           P2=j;

           if ((P2-P1)==1) % 判断是否为垂直方向连续的周长像素点

           Ny=Ny+1;

           end

         P1=P2;

         end

        end

    end

    %检测水平方向连读的周长像素点%

    P1=0;

    P2=0;

    Nx=0; % 记录水平方向连续周长像素点的个数

    for j=1:y

        for i=1:x

           if (BW(i,j)>0)

              P2=i;

             if ((P2-P1)==1) % 判断是否为水平方向连续的周长像素点

                Nx=Nx+1;

             end

             P1=P2;

           end

         end

    end 

     

    SN=sum(sum(BW)); % 计算周长像素点的总数

    Nd=SN-Nx-Ny; % 计算奇数码的链码数目

     

    H=max(sum(I)); % 计算目标的高度

    W=max(sum(I')); % 图象I经矩阵转置后,计算宽度

    L=sqrt(2)*Nd+Nx+Ny; % 计算周长

     

    %====形态特征值计算===%

    A=bwarea(I); % 计算目标的面积

    %L1=zhch(I);

    C=(4*pi*A)/(L*L); % 计算圆度

    R=A/(H*W); % 计算矩形度

    E=min(H,W)/max(H,W); % 计算伸长度

    % L为周长,A为面积,C为圆形度,R为矩形度,E为伸长度

    strNC=['圆形度=   ',num2str(C)];

    set(handles.text4,'string',strNC);

     

     

    strNC1=['一级品'];

    set(handles.text8,'string',strNC1);

     

     

    % --------------------------------------------------------------------

    function Untitled_1_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_1 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

     

     

    % --------------------------------------------------------------------

    function Untitled_2_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_2 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

     

     

    % --------------------------------------------------------------------

    function Untitled_3_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_3 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

     

     

    % --------------------------------------------------------------------

    function Untitled_4_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_4 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

     

     

    % --------------------------------------------------------------------

    function Untitled_5_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_5 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

     

     

    % --------------------------------------------------------------------

    function Untitled_6_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_6 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    close

     

     

    % --------------------------------------------------------------------

    function Untitled_7_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_7 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    [filename,pathname]=uigetfile({'*.*';'*.bmp';'*.jpg';'*.tif';'*.jpg'},'选择图像');

    image=[pathname,filename];%合成路径+文件名

    im=imread(image);%读取图像

    im=im2double(im);

    axes(handles.axes1);

    imshow(im);%在坐标axes1显示原图像

    title('原始图像');

    handles.X1=im;

    guidata(hObject,handles);

     

     

    % --------------------------------------------------------------------

    function Untitled_8_Callback(hObject, ~, handles)

    % hObject    handle to Untitled_8 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    x2=rgb2gray(x1);

    axes(handles.axes2);

    imshow(x2);

    title('灰度化图像');

     

     

    % --------------------------------------------------------------------

    function Untitled_9_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_9 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    x2=rgb2gray(x1);

    x3=medfilt2(x2,[3,3]);

    axes(handles.axes2);

    imshow(x3);

    title('中值滤波图像');

     

     

    % --------------------------------------------------------------------

    function Untitled_10_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_10 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    w=rgb2gray(x1);

    L=medfilt2(w);

    level=graythresh(L);

    bw=im2bw(L,level);

    axes(handles.axes2);

    imshow(~bw)

    title('二值化图像');

     

     

    % --------------------------------------------------------------------

    function Untitled_11_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_11 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    w=rgb2gray(x1);

    L=medfilt2(w);

    level=graythresh(L);

    bw=im2bw(L,level);

    I3=imfill(bw,8,'holes');%对二值化后的图像填充肺实质

    I4=I3-bw;%得到肺实质的图像E

    I5=bwmorph(I4,'clean'); %图像边界

    I6=imfill(I5,8,'holes');%填充肺实质空洞

    I7=bwperim(I6);

    axes(handles.axes2);

    imshow(I7)

    title('边缘检测');

     

     

    % --------------------------------------------------------------------

    function Untitled_12_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_12 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    im=imread('greenapple.jpg');

    axes(handles.axes1);

    imshow(im);%在坐标axes1显示原图像

    title('绿色苹果');

     

     

    % --------------------------------------------------------------------

    function Untitled_13_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_13 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    im=imread('apple1.jpg');

    axes(handles.axes1);

    imshow(im);%在坐标axes1显示原图像

    title('红色苹果');

     

     

    % --------------------------------------------------------------------

    function Untitled_14_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_14 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    w=rgb2gray(x1);

    L=medfilt2(w);

    level=graythresh(L);

    bw=im2bw(L,level);

    axes(handles.axes2);

    imshow(~bw)

    title('面积图像');

    %handles.text1=uicontrol('style','edit','position',[70 70 300 220],'max',2);%一定要设成2

    strNC=['面积=   ',num2str(bwarea(~bw))];

    set(handles.text1,'string',strNC);

     

     

    % --------------------------------------------------------------------

    function Untitled_15_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_15 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    hv=rgb2hsv(x1);

    H=hv(:,:,1);

    S=hv(:,:,2);

    V=hv(:,:,3);

    axes(handles.axes2);

    imshow(H)

    title('H分量图像');

     

    apple=im2bw(x1);

    count=length(x1);

    for i=1:count

        red_ratio=length(find((H>0 & H<1/12) | H>11/12))/length(find(apple==1));

    end

    strNC=['红色比率=   ',num2str(red_ratio*100),'%'];

    set(handles.text2,'string',strNC);

     

     

    % --------------------------------------------------------------------

    function Untitled_16_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_16 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    w=rgb2gray(x1);

    L=medfilt2(w);

    level=graythresh(L);

    bw=im2bw(L,level);

     

    X=imclearborder(bw,4); %去除图像与边界相连通,但更高亮的区域

     

    axes(handles.axes2);

    imshow(X)

    title('缺陷图像');

     

    strNC=['缺陷率=   ',num2str(bwarea(X)/bwarea(~bw)*100),'%'];

    set(handles.text3,'string',strNC);

     

     

    % --------------------------------------------------------------------

    function Untitled_17_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_17 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    I2=rgb2gray(x1);

    J=im2bw(I2,0.6);

    I=~J;

    axes(handles.axes2);

    imshow(I)

    title('圆度图像');

     

    [x,y]=size(I);

    BW = bwperim(I,8); % 检测目标的边缘跟踪,用于计算周长

    %检测垂直方向连读的周长像素点%

    P1=0;

    P2=0;

    Ny=0; % 记录垂直方向连续周长像素点的个数

    for i=1:x

       for j=1:y

         if (BW(i,j)>0)

           P2=j;

           if ((P2-P1)==1) % 判断是否为垂直方向连续的周长像素点

           Ny=Ny+1;

           end

         P1=P2;

         end

        end

    end

    %检测水平方向连读的周长像素点%

    P1=0;

    P2=0;

    Nx=0; % 记录水平方向连续周长像素点的个数

    for j=1:y

        for i=1:x

           if (BW(i,j)>0)

              P2=i;

             if ((P2-P1)==1) % 判断是否为水平方向连续的周长像素点

                Nx=Nx+1;

             end

             P1=P2;

           end

         end

    end 

     

    SN=sum(sum(BW)); % 计算周长像素点的总数

    Nd=SN-Nx-Ny; % 计算奇数码的链码数目

     

    H=max(sum(I)); % 计算目标的高度

    W=max(sum(I')); % 图象I经矩阵转置后,计算宽度

    L=sqrt(2)*Nd+Nx+Ny; % 计算周长

     

    %====形态特征值计算===%

    A=bwarea(I); % 计算目标的面积

    %L1=zhch(I);

    C=(4*pi*A)/(L*L); % 计算圆度

    R=A/(H*W); % 计算矩形度

    E=min(H,W)/max(H,W); % 计算伸长度

    % L为周长,A为面积,C为圆形度,R为矩形度,E为伸长度

    strNC=['圆形度=   ',num2str(C)];

    set(handles.text4,'string',strNC);

     

     

    % --------------------------------------------------------------------

    function Untitled_18_Callback(hObject, eventdata, handles)

    % hObject    handle to Untitled_18 (see GCBO)

    % eventdata  reserved - to be defined in a future version of MATLAB

    % handles    structure with handles and user data (see GUIDATA)

    x1=handles.X1;

    w=rgb2gray(x1);

    L=medfilt2(w);

    level=graythresh(L);

    bw=im2bw(L,level);

    I3=imfill(bw,8,'holes');%对二值化后的图像填充肺实质

    I4=I3-bw;%得到肺实质的图像E

    I5=bwmorph(I4,'clean'); %图像边界

    I6=imfill(I5,8,'holes');%填充肺实质空洞

    axes(handles.axes2);

    imshow(I6)

    title('图像填充');

     

     


    展开全文
  • 基于matlab的车牌识别系统设计

    万次阅读 多人点赞 2018-06-01 16:00:14
    过程相当复杂,基本可以分成硬件部分跟软件部分,硬件部分包括系统触发、图像采集,软件部分包括图像预处理、车牌定位、字符分割、字符识别四大部分,一个车牌识别系统的基本结构如: 图像预处理 在图像...

           一个完整的车牌号识别系统要完成从图像采集到字符识别输出,过程相当复杂,基本可以分成硬件部分跟软件部分,硬件部分包括系统触发、图像采集,软件部分包括图像预处理、车牌定位、字符分割、字符识别四大部分,一个车牌识别系统的基本结构如图:

     

    图像预处理

        在图像预处理之前,首先要了解什么是RGB图像、灰度图像、二值化图像,以及他们如何转换。

    RGB图像:又称彩色图像,RGB色彩就是常说的三原色,R代表Red(红色),G代表Green(绿色),B代表Blue(蓝色)。自然界中肉眼所能看到的任何色彩都可以由这三种色彩混合叠加而成,RGB图像用三维数组表示,最后一维长度为3,(1,2,3分别表示RGB三个分量),对于每一个分量,数值范围也是0~255。红、绿、蓝三个通道的缩略图,都是以灰度显示的,用不同的灰度色阶来表示“ 红,绿,蓝”在图像中的比重。通道中的纯白,代表了该色光在此处为最高亮度,亮度级别是255,0表示亮度最低,255表示亮度最亮。只有三个通道同时有值才可以显示出彩色(如红色通道显示为红色)。所以车牌原始图像是RGB图像。

    灰度图像:是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像的每个像素只有一个亮度信息的单色图像。其中的亮度信息,采样自从白色与黑色之间划分的若干等级。我们常说的灰度阶,就是从白色到黑色划分的等级数。一般为2^n,常用的灰度阶为256,用单个字节(8bit,256=2^8)就可以存储每一个灰度值,灰度图像用二维数组表示。

    二值化图像,又称黑白图像,顾名思义是由黑色和白色两种颜色表示的图像。即图像上的像素点的灰度值设置为0或255。

    将彩色图像(RGB图像转化为灰度图像的过程称为图像灰度化。要表示灰度图,就需要把亮度值进行量化,有四种方法:见表1

    表1

    序号

    方法

    方法论述

    灰度化优点

    1

    分量法

    将彩色图像中的三分量的亮度作为三个灰度图像的灰度值,可根据应用需要选取一种灰度图像。

    1.RGB的值都一样。

    2图像数据即调色板索引值,就是实际的RGB值,也就是亮度值。

    3因为是256色调色板,所以图像数据中一个字节代表一个像素,很整齐。

    2

    最大值法

    将彩色图像中的三分量亮度的最大值作为灰度图的灰度值

    3

    均值法

    将彩色图像中的三分量亮度求平均得到灰度图的灰度值

    4

    加权平均法

    根据重要性及其它指标,将三个分量以不同的权值进行加权平均,常见的算法:

    f(i,j)=0.30R(i,j)+0.59G(i,j)+0.11B(i,j)

     


    图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。在matlab中,二值化图像常常为0和1数组表示,二值化的常用算法有几种,见表2

                                                                                        表2

    序号

    方法

    方法论述

    1

    全局二值化方法

    对每一幅图计算一个单一的阀值。灰度级大于阈值的像素被标记为背景色,否则为前景。

    2

    局部自适应二值化

    以像素的邻域的信息为基础来计算每一个像素的阈值。其中一些方法还会计算整个图像中的一个阈值面。如果图像中的一个像素(x,y)的灰度级高于在(x,y)点的阈值面的计算值,那么把像素(x,y)标记为背景,否则为前景字符。

     

     

    基于车牌颜色特征的定位方法

    本文给出的是一种基于颜色特征的定位算法,该算法不用对整幅图像进行边缘检测,而是直接寻找图片中颜色、形状及纹理符合车牌特征的连通区域。通过对大量车牌图像的分析,可以发现对于具有某种目标色的像素,可以直接通过对H、s、v三分量设定一个范围来把它们过滤出来,无需进行较复杂的色彩距离计算,这样可以在色彩分割时节省大量的时间。这种过滤对蓝色和黄色车牌特别有效,但对于黑色和白色的过滤效果不是很理想。这是因为对于纯色的黑色和白色,它们的色调和饱和度没有意义,所以和其它颜色相比缺少了两个过虑指标。

    通过实验数据表明,汽车车牌的HSV值可由下表确定

    表3 HSV的取值范围

     

    蓝色

    黄色

    白色

    黑色

    色调

    200~255度

    25~55度

    \

    \

    饱和度

    0.4~1

    0.4~1

    0~0.1

    \

    亮度

    0.3~1

    0.3~1

    0.9~1

    0~0.35

    注:“\”表示不予考虑的项目。

     

    由于该算法的原理特殊,决定了主要针对家庭小型车蓝底白字车牌进行识别。根据彩色图像的RGB比例定位出近似蓝色的候选区域。但是由于RGB三原色空间中两点间的欧氏距离与颜色距离不成线性比例,在设定蓝色区域的定位范围时不能很好的控制。因此造成的定位出错是最主要的。这样在图片中出现较多的蓝色背景情况下识别率会下降,不能有效提取车牌区域。对此本文提出了自适应调节方案。对分割出来的区域进行识别调整。根据长宽比,蓝白色比对候选区域进行多次定位。最终找到车牌区域。

     

    车牌倾斜校正

    在车牌识别系统中,车牌字符能够正确分割的前提是车牌图像能够水平,以至于水平投影和垂直投影能够正常进行。如果车牌倾斜没有矫正,那么水平投影和垂直投影,甚至铆钉都无法正常处理。车牌矫正是车牌定位和字符分割的一个重要处理过程。经过车牌定位后所获取的车牌图像不可避免地存在某种程度的倾斜,这种倾斜不仅会给下一步字符分割带来困难,最终也将对车牌的识别的正确率造成直接的影响。所以,当车辆信息中获取车牌的第一步,应该是检查倾斜角度,做倾斜矫正。本小节主要介绍车牌图像校正的算法MATLAB。

    车牌矫正算法有几种,主要是Hough变换法、Radon变换法。下面主要介绍Radon变换法

    图像投影,就是说将图像在某一方向上做线性积分(或理解为累加求和)。如果将图像看成二维函数f(x, y),则其投影就是在特定方向上的线性积分,比如f(x, y)在垂直方向上的线性积分就是其在x轴上的投影;f(x, y)在水平方向上的线积分就是其在y轴上的投影。通过这些投影,可以获取图像在指定方向上的突出特性,这在图像模式识别等处理中可能会用到。

    Radon变换(拉东变换),就是将数字图像矩阵在某一指定角度射线方向上做投影变换。这就是说可以沿着任意角度theta来做Radon变换。

    字符分割

    在汽车牌照自动识别过程中,字符分割有承前启后的作用。它在前期牌照定位的基础上进行字符的分割,然后再利用分割的结果进行字符识别。

    字符分割一般采用垂直投影法。由于字符在垂直方向上的投影必然在字符间或字符内的间隙处取得局部最小值的附近,并且这个位置应满足牌照的字符书写格式、字符、尺寸限制和一些其他条件。利用垂直投影法对复杂环境下的汽车图像中的字符分割有较好的效果。

    具体算法如下:

    1,确定图像中字符的大致高度范围:先自下而上对图像进行逐行扫描,直到遇到第一个黑素像素,记下行号,然后自上而下对图像进行逐行扫描,直到遇到第一个黑素像素,记下行号。这两个行号就标志出了字符大致的高度范围。

    2,确定每个字符的左起始和右终止位置:在第一步得到的高度范围内进行自左向右逐列扫描,遇到第一个黑色像素时,认为是字符分割的起始位,然后继续扫描,直到遇到有一列中没有黑色像素,认为是这个字符的右终止位置,准备开始进行下一个字符的分割。按照上述方法继续扫描,直到扫描到图像的最右端。这样就得到了每个字符的比较精确的快读范围。

    3,在已知的每个字符比较精确的宽度范围内,再按照第一步的方法,分别自下而上和自上而下,逐行扫描,来获取每个字符精确的高度范围。

    分割车牌字符左右边界时,通过垂直扫描过程,由于数字和字母具有连通性,所以分割数字和字母比较容易。通过垂直扫描过程,统计黑色像素点的个数,由于两个字符之间没有黑像素,所以可以作为字符分割的界限。

    字符归一化

    由于图像采集时图像的像素值不一样,经切割出来的字符的大小也不会不一样,所以在进行匹配前必须先进行字符图像归一化。使图像大小跟模板图像大小一致,Matlab提供一个改变图像大小的函数imresize,这里我便不打算多余介绍关于使用imresize一些命令。

    字符识别

    在前文,我就讲过字符识别的方法,神经网络算法和模板匹配算法,本系统采用的是模板匹配算法,下面主要详细介绍模板匹配算法。

    模板匹配:将从待识别的图像或图像区域中提取的若干特征量与模板相应的特征量逐个进行比较,计算它们之间规格化的互相关量,其中互相关量最大的一个就表示期间相似程度最高,可将图像归于相应的类。

    匹配时相似度函数定义为:

     

    其中, 为待识别车牌字符图像中像素点的灰度值,这里的取值为 0或1,为模板字符图像中像素点的灰度值,这里的取值为0或1;M 和N为模板字符点阵横向和纵向包含的像素个数。

    匹配的步骤为:

    (1)依次取出模板字符,将模板字符按照上、下、左、右四个方向,在周围五个像素的范围内滑动,每次分别计算出相似度S值,取其中S的最大值作为字符与模板字符之间的相似度函数。

    (2)依次从待识别的字符与模板字符的相似度中找出最大相似度所对应的模板字符,判断是否大于该字符的阈值T,如果S大于T,那么待识别的字符的匹配结果就是该模板字符,反之,如果S小于T,表示不匹配,则需要重新检测。

     

    车牌识别仿真

    采用车牌号渝F3W970的车牌照片进行仿真,仿真效果如下:

    图11 车牌原始图像

    使用车牌颜色特征的定位方法处理车辆图像,得到的车牌牌照提取图,效果如图12所示。

    图12车牌定位

    使用radon变换法处理车辆牌照,得到的车牌倾斜校正,效果如图13所示。

    图13 车牌倾斜校正

    使用最大类间方差法进行车辆图像二值化,效果如图13所示。

    图13 车牌二值化

     

    经过一系列的形态学操作,边框处理等等,效果如图14所示。

    图14 边框处理

     

    采用垂直投影法,车牌分割图像,效果如图15所示。

    图15 车牌分割

     

    经过模板匹配算法,效果如图16所示。

                                                               

    代码另上传了

    链接https://download.csdn.net/download/qq_17287777/10452721

     

     

    展开全文
  • python数据可视化之Seaborn(三):分布可视化

    千次阅读 多人点赞 2020-02-19 12:12:51
    写在开头:今天开始分享一下seaborn对于数据集分布的设计。该文章主要借鉴seaborn文档,会附在结尾链接。 前文回顾: 第一节分享了Seaborn绘图的整体颜色与风格比例调控,可点击链接查看。 python数据可视化之...
  • 数据结构(C++)有关练习题

    热门讨论 2008-01-02 11:27:18
    4、用邻接矩阵或邻接实现一个有向的存储,并实现单源最短路径算法的实现(这个类的一个成员函数),并能输出该的关键路径。 注:1、要用面向对象的方法设计代码; 2、一个是一个类的实例; 3、类...
  • 形态学操作内容简介 内容简介   本篇博客介绍的形态学图像处理操作。
  • 方法基于设计对象的能量流有向邻接矩阵,通过矩阵变换导出结构设计十分重要的强连接零件集合以及集合的先后顺序,用笔者制定的规则以及新的单位变换矩阵和单位消元矩阵与有向邻接矩阵间的矩阵演算来实现结构多...
  • OpenCV学习——形态

    2020-12-07 15:14:17
    以及部分基本形态学算法,包括边界提取、空洞填充、连通分量的提取、凸壳、细化、粗化、骨架、裁剪、形态学重建。 其实就是对冈萨雷斯的《数字图像处理》中第9章节《形态学处理》的简要理解。 如果你认为腐蚀是减小...
  • 图像形态学操作

    千次阅读 2019-02-23 09:47:42
    图像形态学操作 微信公众号:幼儿园的学霸 个人的学习笔记,关于OpenCV,关于机器学习, … 问题或建议,请公众号留言; 看到一段话,深有感触 作为软件开发者,我们曾经写过的或者正在写的每一行代码都对我们的...
  • 数学形态学之前文章解释过,不再做介绍。 图像边缘包含物体的主要特征,人眼识别物体,首先就是根据边缘来识别。图像的边缘提取也是现在数字图像处理中非常必要也是基础的一部分,在工程应用中有着极其重要的地位,...
  • 第12章 形态学图像处理 形态学是一种应用于图像处理和模式识别领域的新的方法,是一门建立在严格的数学理论基础上而又密切联系实际的科学。...它通过设计一整套运算、概念和算法,用以描述图象的..
  • 针对这些文章缺乏系统方法的问题,提出了具体的组合矩阵、形态矩阵解决方案,并给出了预测示例。 隐藏的潜力 对深度学习研究和应用的兴趣从未这么热过。几乎每天都可以在arXiv.org找到无数的新研究论文。这些...
  • 同济大学CS《高级程序语言设计1》大作业:矩阵操作同济大学CS C++作业:矩阵操作 矩阵加法 矩阵数乘 矩阵转置 矩阵乘法 矩阵哈达玛乘积 矩阵矩阵:参数参数仅包括:kernelsize和padding 图片处理: 福 OTSU...
  • 基于MATLAB的拼图游戏设计 内容摘要:MATLAB强大的运算和图形展示功能,使图像处理变得更加的简单和直观。本博文基于MATLAB编程语言,详细介绍了如何利用MATLAB及其图像处理函数进行经典拼图游戏设计,并通过...
  • 本节详细介绍了透视变换的概念、变换矩阵、作用以及OpenCV-Python相关的处理函数getPerspectiveTransform 和warpPerspective的语法及参数含义,并分析了输入图像和输出图像四对点确认透视变换矩阵的原理。...
  • 以图像的形态特征为研究对象,通过设计一套独特的数字图像处理方法和理论来描述图像的基本特征和结构通过引入集合的概念来描述图像中元素与元素、部分与部分的关系运算。因此,数学形态学的运算由基础的集合运算(并...
  • 一、图像的形态学操作(Morphological Image Processing)  形态学一般指生物学中研究动物和植物结构的一个分支。用数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具。基本思想是用具有一定...
  • 形态学(morphology)一词通常表示生物学的一个分支,该分支主要研究动植物的形态和结构。而我们图像处理中指的形态学,往往表示的是数学形态学。下面一起来了解数学形态学的概念。 数学形态学(Mathematical ...
  • 送餐机器人产品设计

    千次阅读 热门讨论 2021-04-26 22:18:03
    一、 系统设计 关键部件: 器件 选型 2 关键技术选型 2.1 基于二维码+轮子里程计的机器人定位方案 主流方案 效果 循线 根据电磁线行走存在路线固定的问题 纯视觉 室内相似场景较多,存在重...
  • 数字图像处理第九章——形态学图像处理

    万次阅读 多人点赞 2019-05-11 08:31:12
    数字图像处理第九章数字图像处理---形态学图像处理(一)预备知识1.1 预备知识1.1.1 集合理论中的基本概念1.2 二值图像、集合及逻辑算子(二)膨胀和腐蚀2.1 膨胀2.2 结构元的分解2.3 strel函数2.4 腐蚀(三) 膨胀...
  • 腐蚀与膨胀( Erosion 与 Dilation) 是OpenCV提供的两种最基本的形态学操作。 1.形态学操作 简单来讲,形态学操作就是基于形状的一系列图像处理操作。通过将 结构元素 作用于输入图像来产生输出图像。 最基本的形态学...
  • java图像处理--形态学填充处理imfill

    千次阅读 2016-07-29 17:46:40
    在网上搜了好多都没有特别使用的,java实现imfill的算法,有一些关于opencv的,但是作为一枚初学菜鸟,还是很难搞懂的,直入主题吧算法设计思路(1)输入一张二值图像(很多看似黑白的图像并不完全是黑白的,当然在...
  • 冠部形态设计是PDC钻头设计的第一步,冠部形态直接影响到PDC钻头的工作性能。目前,成功应用于石油钻井的PDC钻头剖面形状可归纳为四种,即直线-圆弧-直线形、直线-圆弧形、直线-双圆弧形和直线-圆弧-抛物线形。 ...
  • 使用形态学滤波设计对图像的每个元素应用这个结构元素。当结构元素的原点与给定的像素对齐时,它与图像的相交部分定义了一组进行形态学运算的像素。 3. 腐蚀:每个像素与结构相交的集合替换成最小的像
  • 形态学滤波

    2019-07-23 09:01:21
    形态学的本质就是把结构元当作一个模板矩阵对数字图像矩阵进行数学运算得到新的图形(最常用的就是形态学滤波,结构元就是滤波器)。 两种基本操作: 腐蚀: (B)z是B的平移后的新的结构元,B是结构元。 从定义来...
  • 形态学图像处理

    2020-10-08 21:30:18
    形态学图像处理预备知识(一) 集合论中的基本概念(二)二值图像、集合及逻辑算子膨胀和腐蚀(1)膨胀(2)结构元的分解(3)strel函数(4)腐蚀(三)膨胀与腐蚀的结合 预备知识 (一) 集合论中的基本概念 如果...
  • 图形是产品设计中被讨论得最多的元素之一。视觉设计师使用不同形状的图形来表达事物的多样性;交互设计师选择不同形状的图形,解决用户在某场景下的诉求问题。其中争议最大,且被更多互联网设计师使用的图形,是圆角...
  • MATLAB用户界面设计

    千次阅读 2019-08-09 20:29:54
    ColorOrder属性:用于设置多条曲线的颜色顺序,是一个n*3矩阵矩阵的每一行用RGB三元组表示一种颜色,默认n为7。 2.曲线与曲面对象 曲线对象 建立曲线对象 line函数的调用格式为: 句柄变量= line(x,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,598
精华内容 3,039
关键字:

形态矩阵图设计