精华内容
下载资源
问答
  • HHU图像去鱼算法 示例源码SSD WHUNws应用程序HHU图像去鱼算法 示例源码SSD WHUNws应用程序HHU图像去鱼算法 示例源码SSD WHUNws应用程序HHU图像去鱼算法 示例源码SSD WHUNws应用程序
  • 提出一种基于深度学习(卷积神经网络)的图像去雨框架,取得的效果优于已经存在的绝大多数方法
  • 目标和背景色差小、对比度不强,鱼卵颜色深浅不均,卵间有粘连现象,为减少干扰,图像灰度化处理可以去掉一些无用的信息,再使用二值化处理将目标从背景中分离出来,最后用形态学处理中的腐蚀运算来解决卵之间有粘连...
  • 深度学习在鱼类图像识别与分类中的应用.pdf
  • 针对人工计数方法的存在的缺陷,提出了一种基于数字图像处理的鱼卵计数方法的研究,对采集的鱼卵图片进行了平滑,灰度化,二值化,形态学的膨胀腐蚀,空洞填充的预处理,根据自适应阈值调整来获取鱼卵分割的最佳阈值...
  • 自定义采集的图像数据集,浣熊、、猫,用于尝试用自己的数据进行神经网络的训练,提供给大家,虽然质量一般,但是不需要自己一张张弄了。
  • 一个很多鱼类的数据集
  • 鱼类图片用于进行图像分类研究, 本数据集是为了研究那种深度学习图像分类方法创建的,已经进行分类好,打好了标签,可以直接进行使用了
  • 分割斑马 3D 图像的半自动 MATLAB 程序 获取斑马的显微 CT 图像:1.1。 MicroCT 扫描使用 vivaCT40(Scanco Medical,瑞士)进行。 使用以下设置获取中等分辨率扫描(21 µm 体素分辨率):55kVp、145μA、1024 ...
  • (主题:使用图像处理的鱼类信息验证系统) 2021江原国立大学顶点设计团队项目,第1组 <工作文件说明> /资源:一个目录,用于存储要在应用程序中使用的图像或其他资源文件。 .gitignore:指定上传到Github时不...
  • 受散射和吸收的影响,水下图像出现颜色失真、可视性低、细节丢失的问题。为了有效解决上述问题,提出了基于颜色校正和细节保持的水下图像增强方法。首先,采用基于Retinex启发的方法,通过调整每个颜色通道的直方图分布...
  • 【目的】鱼类识别对渔业资源的开发利用...【方法】本文提出了一种基于百度EasyDL定制化图像识别平台的海底鱼类识别方法。首先使用伽马校正法和暗通道先验算法对图片数据进行预处理,提高图片亮度和清晰度,接着利用...

    【目的】鱼类识别对渔业资源的开发利用有着重要的意义。针对海底环境恶劣、拍摄环境亮度低、场景模糊的实际情况导致海底观测视频品质差,视频中的鱼类识别难的问题以及现有鱼类识别方法存在的鱼类标注数据集过少导致训练的深度模型准确度不高的问题。

    【方法】本文提出了一种基于百度EasyDL定制化图像识别平台的海底鱼类识别方法。首先使用伽马校正法和暗通道先验算法对图片数据进行预处理,提高图片亮度和清晰度,接着利用百度EasyDL定制化图像识别平台构建初鱼类识别模型,再使用数据增强等方法对模型进行调优,提高模型识别能力。

    【结果】实验结果表明,与其他识别方法相比,该方法可以有效提高鱼类识别的准确率。

    1  引言

    鱼类不但有一定的食用价值,而且还有很高的药用价值,所以世界各国对鱼类资源的开发和利用都非常重视,在对鱼类资源开发过程中,必须对鱼类进行识别,了解其分布情况,但鱼的种类繁多,形状大小相似,识别起来较为困难。因此研究鱼类识别的方法,对我国渔业资源的开发利用具有重要的学术价值和经济价值,对于鱼类的分布情况,传统的研究方法以出海捕捞为主,使用延绳钓探捕、拖网探捕等常用捕捞技术。这种传统调研方式固然有效,但是对于相关科研人员来说,由于调研过程周期长,耗费资源太多,而且结果存在一定的延迟性,大大影响研究人员研究成果的质量。还有基于声呐系统的方法,对鱼体回波信号进行处理分析,从声学信号中提取适于分类的特征进行识别,但是由于声呐系统会对鱼类造成一定的伤害,所以也不能频繁实施,针对上述问题,国家于“十二五”期间提出将全面推动国家海底观测平台的建设,其中就包括通过部署水下摄像器材来实时监控关键海洋生物的重要务,这样就可以通过分析观测视频来代替出海调研,而且保证了获得数据的实时性,能够极大地提高科研人员的研究效率。

    传统的机器学习方法用于鱼类识别的实现过程为:获取鱼图像、提取特征、构建分类器,将特征向量输入分类器以实现种类识别。如:Phenoix等人[1]采用贝叶斯和高斯核混合模型对鱼类特征进行分层分类的方法来实现鱼的分类识别;杜伟东等人[2]提出了一种提取多方位声散射数据的小波包系数奇异值、时域质心及离散余弦变换系数特征,并进行特征融合,最后用支持向量机分类的鱼识别方法;虽然这些方法都可以实现鱼类识别,但是这些方法这类方法已不适用于当前的视频或图片数据,并且方法严重依赖于人工选择特征,而人工选择特征往往只能选择表层特征,很难挖掘出有鉴别力的特征。

    和传统机器学习方法相比,近年来崛起的深度学习方法以数据为驱动,能够从大量数据中通过卷积等操作自动学习特征表示,很好的解决了人工选择特征的问题。Abdelouahid等人[3]和顾郑平等人[4]都提出了采用深度网络模型进行鱼类识别的方法,虽然这些方法在识别性能上都取得了引人瞩目的效果,但是依然存在以下问题:模型识别性能的提高需要大量的鱼类标注数据集用于学习训练,而标注数据工作费时且昂贵,故在实际应用中难以满足。

    为此,针对以问题,本文提出了一种基于百度EasyDL定制化图像识别平台的海底鱼类识别方法。利用百度EasyDL定制化图像识别平台解决目标数据集训练数据过小和数据分布差异问题,而且通过引入伽马校正法和暗通道先验算法对数据进行预处理,使数据特征具有更好的辨别能力,同时使用数据增强方法对模型进行调优,使得训练得到的模型的泛化性更强。

    2  相关工作

    2.1 海洋鱼类识别系统

    基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法

    图 1 海底观测平台

    海底观测平台的系统结构如图1所示,位于海面以下的水下接驳器统一接收来自各个传感器的采集数据,包括水下摄像器材采集的视频数据,然后将数据传输至位于陆地上的岸基站。岸基站接收并缓存所有来自海底的数据,按约定的协议和规则转发给大数据中心。大数据中心由多个子系统构成,负责对不同类型数据的转化、存储、处理、分析,其中包括本文将要研究的海洋鱼类识别系统,负责对海底观测视频的处理分析。本文采用开源计算机视觉工具软件OpenCV来读取视频数据,将视频分解为图片帧,同时使用背景差分算法过滤无用帧后,针对每一帧进行预处理和识别分析。

    2.2  数据预处理

    由于海底图像对各种噪声和干扰是比较敏感的,在不同光照条件下,悬浮物等都对最终成像和识别有很大的影响。而且从图像的形成过程考虑,图像采集是将一个三维目标映射成为一幅二维图像,不可避免会有信息的丢失,所以本质上图像就具有一种模糊性。另一方面由于海水的能见度低, 透明度只有空气的千分之一,使得采集到的图像信噪比较低、纹理模糊。再次由于海洋中各种悬浮物的存在, 也会对光波(也就是电磁波)产生散射和吸收作用 ,导致采集到的海底图像产生严重的灰白效应。再加上海流的影响以及摄像机镜头的抖动等因素, 造成图像部分失真现象等因素都会影响最终识别的效果。

    下面是几幅比较典型的海底鱼类图像,我们可以看到,采集的图像的对比度都较低,图像较为模糊:

    基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法  基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法  基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法

    图1 海底鱼类图像图

    因此,本文先使用提高亮度、提高清晰度对数据进行预处理的方法,尽可能消除亮度低和模糊带来的影响。对于提高亮度的方法,本文选择伽马校正法[5],使用指数函数调整每个灰度单元,计算公式如下:

    基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法       (1)

    亮度的变化由参数γ来控制:当γ<1时,pi,j[k]的值会变小,亮度会提高。反之,则pi,j[k]的值会变大,亮度会降低。

    对于提高清晰度的方法,通过参考基于暗通道先验算法去雾的研究[6]。该研究认为雾天拍摄图片的模糊是由空气中的杂质对光的散射造成的。而海底拍摄图片的模糊也恰好是由水中的杂质对光的散射造成的,于是可以将其适用于海底拍摄图片,所以在该研究的基础上,针对海底环境的特点作了改进,对每个灰度单元进行优化,计算公式如下:

        基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法(2)

    综合上述提高亮度和清晰度的过程,预处理的步骤如下:

    基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法

    图3所示展示预处理方法对图片品质的提升效果:

    基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法

    基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法

                      a原始图                                     b预处理后图片

    图2 预处理效果对比图

    从图3中可以看出,本文提出的预处理方法可以比较有效地提高图片的亮度以及清晰度。但是面对品质极差的图片,预处理方法也显露出了局限性,无法将其品质提高到鱼类各项关键特征都清晰的程度。

    2.3  模型构建及训练

    本文以台湾电力公司、台湾海洋研究所和垦丁国家公园在2010年10月1日至2013年9月30日期间,在台湾南湾海峡、兰屿岛和胡比湖的水下观景台收集的鱼类图像数据集合--Fish4Knowledge(F4K)数据集[7]作为实验数据。该数据集包括23类鱼种,共27370张鱼的图像,数据集如图4所示。

    基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法

    图3 Fish4Knowledge(F4K)数据集

    将实验数据上传至百度EasyDL数据中心,如图4所示,采用百度EasyDL定制化图像识别平台构建鱼类图像识别模型,由于鱼类形状大小相似,品种差异小,可辨识性较小,故选择AutoDL Transfer算法进行模型训练,AutoDL Transfer模型是百度研发的AutoDL技术之一,结合模型网络结构搜索、迁移学习技术、并针对用户数据进行自动优化的模型,与通用算法相比,虽然训练时间较长,但更适用于细分类场景。如图5所示。

    基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法

    图4 数据上传

    基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法

    图5 模型构建

    2.3  预处理有效性实验

    为了证明本文所提预处理方法的有效性,本文在F4K数据集上做了原始的数据和基于预处理的方法的数据模型性能对比实验,实验在参数相同的条件下,使用百度EasyDL定制化图像识别平台对数据进行训练,评估对比结果如表1所示:

    表2性能对比

    基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法

    表1的结果显示,在鱼类识别上本文所提的预处理方法比使用原始数据有更好的识别性能,准确率及召回率等各项指标都要远远好于使用原始数据训练的模型。

    2.4  模型进一步调优

    为了更好的提高模型识别的准确率,本文采用数据增强的方法对数据进行扩充,增加数据的规模,提高模型的泛化性能。以前,若想对训练数据进行数据增强的操作,需要手动调整图片来对模型训练样本进行扩展,例如旋转、移动、缩放、翻转图片等方式,过程如图6所示。

    基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法

    图6 数据增强处理

    如今,EasyDL的图像分类模型训练中,可以通过平台提供的调参功能来自动执行上述增强操作,优化数据丰富度,开发者再也不用手工重复处理原始数据啦!

    表3 数据增强后数据集大小

    基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法

    表4 数据增强后性能对比

     基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法

    2.5  模型对比实验

    为了进一步证明本文模型的优势,将本文模型与其他模型,包括目前流行的深度网络模型VGGnet16、VGGnet19以及文献[3]中的PreCNN-SVM鱼类识别方法和文献[4]中Alex-FT-SVM鱼类识别方法,在F4K数据集上进行性能评估和比较,实验对比结果如表2所示。

    表5不同方法的鱼类识别性能比较

    基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法 

    表2的各种方法对比结果来看,本文的方法相对于其他方法识别准确率有较大提升,获得了99.6%的鱼类识别精度。本方法充分利用百度EasyDL定制化图像识别平台优势,可以很好地解决鱼类识别任务训练数据不足的问题,同时通过引入伽马校正法和暗通道先验算法对数据进行预处理,使数据特征具有更好的辨别能力,使用数据增强方法对模型进行调优,进一步提高了模型识别的准确率。

    3 结束语

    海底观测环境亮度低、场景模糊,导致采集的视频品质差,直接识别视频中的海洋鱼类效果不好。本文提出了预处理方法提高图片品质、百度EasyDL定制化图像识别等方法,实现对较差品质图片的准确识别。针对亮度低和场景模糊的问题,在预处理时首先使用伽马校正法提高了图片的亮度,然后参考基于暗通道先验算法的去雾研究针对海底环境的特点作了改进,提高了图片的清晰度。由于目前还没有大量标记数据,本文使用百度EasyDL定制化图像识别及AutoDL Transfer算法,解决了训练数据少导致模型效果差的问题。从实验结果可以看出,本文所提方法可以以高达99.6%的准确率识别海底鱼类的图片,验证了方法的有效性。然而,本文的方法还存在不足,其中的关键在于海底环境的特殊性,提高图片品质的预处理方法还没有完全结合海底环境的特点,提高图片品质的能力有限。下一步的研究工作将是深入分析、挖掘海底环境的特点,提出针对性更强的、更有效的预处理方法。

     

    参考文献:

    [1]Huang, Phoenix X., Bastiaan J. Boom, and Robert B. Fisher. "Hierarchical classification with reject option for live fish recognition." Machine Vision and Applications 2015,26(1): 89-102.

    [2]杜伟东, 李海森, 魏玉阔, 等. 基于 SVM 的多方位声散射数据协作融合鱼分类与识别[J]. 农业机械学报, 2015,61(3):39-43.

    [3]Tamou A B, Benzinou A, Nasreddine K, et al. Underwater Live Fish Recognition by Deep Learning[C]//International Conference on Image and Signal Processing. Springer, Cham, 2018,171(6): 275-283.

    [4]顾郑平,朱敏.基于深度学习的鱼类分类算法研究[J].计算机应用与软件,2018,35(1):200-205.

    [5]蒋明敏.基于FPGA的LCD伽马校正研究[D].南京,南京林业大学,2016:25-27.(JIANG M M.Research on LCD Gamma Correction Based on FPGA[D].Nanjing,NanjingForestryUniversity,2016:25-28.)

    [6]HE K, SUN J, TANG X. Single image haze removal using dark channel prior[J]. IEEE transactions on pattern analysis and machine intelligence, 2011, 33(12): 2341-2353.

    [7]B J, Huang P X, He J, etal. Supporting ground-truth annotation of image datasets using clustering[C]//ICPR. 2012,21(1): 1542-1545.

    作者:范伟亚

    转载于:https://www.cnblogs.com/AIBOOM/p/11196173.html

    展开全文
  • 上海联影关于CT重建图像环状伪影的去除方法申请的专利
  • 标记成千上万张图像很无聊。 (1000/6000) 由于主题的差异,缩略图的点击强度很难分配 Clickbaitiness随着时间而发展。 这里使用的数据集来自2017年,实际上与2020年不同 同样的问题,但是现在建立的模型略胜过...
  • 鱼眼图像畸变矫正

    2018-12-04 11:31:47
    在OpenCV3.41 vs2017环境下编译运行,摄像机标定,能够对鱼眼镜头进行畸变矫正,但效果感觉不是特别好,希望能改进吧
  •   本文所涉是笔者模式识别课的第一次大作业——用朴素贝叶斯来做nemo鱼图像分割。它是用贝叶斯来做二元分类的简单实践,适合用来做贝叶斯算法入门,现将简要理论和笔者所写代码放在这里,供大家参考。不知道有没有...

    前言


      本文所涉是笔者模式识别课的第一次大作业——用朴素贝叶斯来做nemo鱼图像区域分割。它是用贝叶斯来做二元分类的简单实践,适合用来做贝叶斯算法入门,现将简要理论和笔者所写代码放在这里,供大家参考。不知道有没有朋友有疑问,明明是图像区域分割,怎么又和二元分类扯上了关系,其实逐像素的图像分割,就是在做分类。当然,这里的分割不是指复杂的语义分割,只是简单的根据灰度或者颜色分布来做区域分割。

      贝叶斯理论:机器学习十大经典算法:深入浅出聊贝叶斯决策

      EM与贝叶斯:机器学习十大经典算法:另辟蹊径EM算法+高斯混合模型实战

      代码演示PPT及数据:下载


    任务与数据


    • 数据

      图像fish.bmp与掩膜mask.mat,掩膜点乘图像,即可获得待分割区域ROI。小鱼区域主要有两种类型的区域,以下就是要用朴素贝叶斯把这两个部分分出来——用不同的颜色表示不同区域。

    在这里插入图片描述
      训练数据sample.mat,它是一个二维的matlab数组,第一列为灰度值,第2-4列为RGB值,第五列为当前灰度值或者RGB值对应的类别标签(1,-1)。它蕴含着两种类型区域的灰度值或者RGB值的分布,根据它来估计两种类型区域的类概率密度函数的参数。

    在这里插入图片描述

    • 任务

      任务1:对训练数据用极大似然,估计出两类区域灰度值的概率密度函数,并用最小错误贝叶斯对fish.bmpROI灰度图像进行分割。
      任务2:对训练数据用极大似然,估计出两类区域RGB值的概率密度函数,并用最小错误贝叶斯对fish.bmpROI彩色图像进行分割。


    理论与实现

      统计模型的训练过程就是类条件概率密度函数参数的估计过程。通过参数估计方法,从训练样本中估计出参数,便完成了训练。测试或者说应用过程就是用估计出的类概率密度函数和代表类别占比的先验概率进行统计决策或者分类的过程。最大似然是常用的参数估计方法,用在高斯混合模型(GMM)中。

    • 极大似然估计

      假定我们面对的就是一个高斯混合模型(GMM),即每个类别训练样本的灰度值或者RGB值均服从正态分布,正态分布含有两个参数,均值方差或者均值协方差。

      我们知道,极大似然的目的是要找到最可能产生该样本序列的概率密度函数的参数。而在某概率密度函数参数下产生该样本序列的概率如式(1),即似然函数。

    在这里插入图片描述
      当每个样本都独立同分布(iid)时,对应的贝叶斯决策即为朴素贝叶斯。则式(1)便可以化为概率连乘的形式,如式(2),在这里插入图片描述
      两边同取自然对数后,用导数工具可以求出其极大值点,即极大似然。在高斯混合模型的情况下,某个样本序列似然函数的极值点的解析解为:

      一维情况:对应灰度值。

    在这里插入图片描述

    在这里插入图片描述

      多维情况:三维时对应RGB值
    在这里插入图片描述
    在这里插入图片描述
      由以上4个式子,我们可以看出。我们习以为然的求均值和方差的公式,其实是在默认中央极限定理的前提下,用最大似然估计的结果。

    copyright ©意疏:https://blog.csdn.net/sinat_35907936/article/details/109167111

    • 最小错误贝叶斯决策

      由机器学习十大经典算法:深入浅出聊贝叶斯决策,我们可以知道,在给类别地位均等时,采用最小错误率或者最大后验概率贝叶斯决策即可。只比较分子,即下式,便可得出决策——选两类中结果较大者为决策结果。

    在这里插入图片描述

    • 算法流程

      算法流程如下图所示,前半部分时统计模型的训练过程,即用最大似然(MLE)进行参数估计。测试过程,就是用决策的过程,图中为为Nemo鱼逐像素做灰度或者颜色决策或者分割的过程。PDF为scipy包中包含的正态分布PDF函数,只需给其参数和输入即可得到输出值。
    在这里插入图片描述

    • 算法实现

      数据加载与解析。python可以通过scipy模块读取matlab文件。matlab文件读入后是以字典的形式展现的。

    from scipy import io
    from scipy.stats import norm
    import numpy as np
    import PIL.Image as Image
    import matplotlib.pyplot as plt
    from scipy.stats import multivariate_normal
    
    # 数据加载与解析
    mask = io.loadmat('mask.mat')['Mask']                              # 数据为一个字典,根据key提取数据
    sample = io.loadmat('sample.mat')['array_sample']
    src_image = Image.open('fish.bmp')
    RGB_img = np.array(src_image)
    Gray_img = np.array(src_image.convert('L'))
    
    # 根据Mask,获取ROI区域
    Gray_ROI = (Gray_img * mask)/255
    RGB_mask = np.array([mask, mask, mask]).transpose(1, 2, 0)
    RGB_ROI = (RGB_img * RGB_mask)/255
    
    # 根据标签拆分数据
    gray1 = []
    gray2 = []
    RGB1 = []
    RGB2 = []
    
    for i in range(len(sample)):
        if(sample[i][4]) == 1.:                                           # 数据第5位为标签
            gray1.append(sample[i][0])
            RGB1.append(sample[i][1:4])
        else:
            gray2.append(sample[i][0])
            RGB2.append(sample[i][1:4])
    
    RGB1 = np.array(RGB1)
    RGB2 = np.array(RGB2)
    

      计算先验概率。先验概率可以通过样本中各类别的占比得来。也可以通过各类别在世界中的占比而来。

    # 计算两类在数据中的占比,即先验概率
    P_pre1 = len(gray1)/len(sample)
    P_pre2 = 1-P_pre1
    

      一维贝叶斯决策,计算一维输入时贝叶斯后验概率。

    # 一维时,贝叶斯
    # ------------------------------------------------------------------------------------#
    # 数据为一维时(灰度图像),用最大似然估计两个类别条件概率pdf的参数——标准差与均值
    gray1_m = np.mean(gray1)
    gray1_s = np.std(gray1)
    gray2_m = np.mean(gray2)
    gray2_s = np.std(gray2)
    # print(gray1_s, gray2_s)
    
    # 绘制最大似然估计出的类条件pdf
    x = np.arange(0, 1, 1/1000)
    gray1_pdf = norm.pdf(x, gray1_m, gray1_s)
    gray2_pdf = norm.pdf(x, gray2_m, gray2_s)
    
    plt.figure(0)
    ax = plt.subplot(2, 1, 1)
    ax.set_title('p(x|w)')
    
    ax.plot(x, gray1_pdf, 'r', x, gray2_pdf, 'b')
    ax.set_xlabel('x')
    ax.set_ylabel('f(x)')
    ax1 = plt.subplot(2, 1, 2)
    ax1.plot(x, P_pre1*gray1_pdf, 'r', x, P_pre2*gray2_pdf, 'b')
    ax1.set_title('p(w)*p(x|w)')
    ax1.set_xlabel('x')
    ax1.set_ylabel('f(x)')
    
    # 用最大后验贝叶斯对灰度图像进行分割
    gray_out = np.zeros_like(Gray_img)
    for i in range(len(Gray_ROI)):
        for j in range(len(Gray_ROI[0])):
            if Gray_ROI[i][j] == 0:
                continue
            elif P_pre1*norm.pdf(Gray_ROI[i][j], gray1_m, gray1_s) > P_pre2*norm.pdf(Gray_ROI[i][j], gray2_m, gray2_s):   # 贝叶斯公式分子比较
                gray_out[i][j] = 100
            else:
                gray_out[i][j] = 255
    
    # plt.imshow(RGB_ROI)
    plt.figure(1)
    bx = plt.subplot(1, 1, 1)
    bx.set_title('gray ROI')
    bx.imshow(Gray_ROI, cmap='gray')
    plt.figure(2)
    bx1 = plt.subplot(1, 1, 1)
    bx1.set_title('gray segment result')
    bx1.imshow(gray_out, cmap='gray')
    

      分割结果:

    在这里插入图片描述

    copyright ©意疏:https://blog.csdn.net/sinat_35907936/article/details/109167111

      三维贝叶斯决策,计算三维输入时的贝叶斯后验概率。

    # 三维时,贝叶斯
    # ------------------------------------------------------------------------------------#
    # 数据为三维时(彩色图像),用最大似然估计两个类别条件概率pdf的参数——协方差与均值
    RGB1_m = np.mean(RGB1, axis=0)
    RGB2_m = np.mean(RGB2, axis=0)
    
    cov_sum1 = np.zeros((3, 3))
    cov_sum2 = np.zeros((3, 3))
    
    for i in range(len(RGB1)):
        # print((RGB1[i]-RGB1_m).reshape(3, 1))
        cov_sum1 = cov_sum1 + np.dot((RGB1[i]-RGB1_m).reshape(3, 1), (RGB1[i]-RGB1_m).reshape(1, 3))
    
    for i in range(len(RGB2)):
        cov_sum2 = cov_sum2 + np.dot((RGB2[i]-RGB2_m).reshape(3, 1), (RGB2[i]-RGB2_m).reshape(1, 3))
    
    RGB1_cov = cov_sum1/(len(RGB1)-1)                      # 无偏估计除以N-1
    RGB2_cov = cov_sum2/(len(RGB2)-1)
    
    xx = np.array([x, x, x])
    # print(P_pre1*multivariate_normal.pdf(RGB1, RGB1_m, RGB1_cov))
    
    # 用最大后验贝叶斯对彩色图像进行分割
    RGB_out = np.zeros_like(RGB_ROI)
    for i in range(len(RGB_ROI)):
        for j in range(len(RGB_ROI[0])):
            if np.sum(RGB_ROI[i][j]) == 0:
                continue
            elif P_pre1*multivariate_normal.pdf(RGB_ROI[i][j], RGB1_m, RGB1_cov) > P_pre2*multivariate_normal.pdf(RGB_ROI[i][j], RGB2_m, RGB2_cov): # 贝叶斯公式分子比较
                RGB_out[i][j] = [255, 0, 0]
            else:
                RGB_out[i][j] = [0, 255, 0]
    # print(RGB_ROI.shape)
    
    # 显示RGB ROI,与彩色分割结果
    plt.figure(3)
    cx = plt.subplot(1, 1, 1)
    cx.set_title('RGB ROI')
    cx.imshow(RGB_ROI)
    plt.figure(4)
    cx1 = plt.subplot(1, 1, 1)
    cx1.set_title('RGB segment result')
    cx1.imshow(RGB_out)
    plt.show()
    
    

      分割结果:
    在这里插入图片描述

    copyright ©意疏:https://blog.csdn.net/sinat_35907936/article/details/109167111


    参考


      张学工.模式识别(第三版).M.清华大学出版社.2010.

    展开全文
  • 针对斑马视网膜细胞图像分割时细胞粘连比较严重的情况,采用了边界距离变换和模拟浸水原理的分水岭变换相结合的方法。首先采用距离变换的方法提取细胞区域的局部极小值作为种子点,合并距离过小的错误种子点,然后...
  • 养殖环境下,利用图像恢复算法得到的恢复后草鱼图像数据集
  • 行业分类-物理装置-一种斑马幼鱼表皮位置检测的图像处理方法及系统.zip
  • 基于支持向量机的图像分类(下篇:MATLAB实现)

    万次阅读 多人点赞 2018-04-11 00:19:20
    摘要:本文通过图文详细介绍如何利用支持向量机对图像进行分类,经过上篇文章对原理的介绍,这里介绍利用MATLAB编程实现。后续章节将介绍的主要部分有: 图片数据集整理 特征提取 SVM训练与测试 分类结果...

    摘要:本文通过图文详细介绍如何利用支持向量机对图像进行分类,经过上篇文章对原理的介绍,这里介绍利用MATLAB编程实现。更多相关资源详解也可参考博主最新博文基于支持向量机的手写数字识别详解(MATLAB GUI代码,提供手写板)。本文后续章节将介绍的主要部分有:

    • 图片数据集整理
    • 特征提取
    • SVM训练与测试
    • 分类结果评价
    • 结果显示

    点我下载:SVM图像分类的MATLAB完整程序及图片集文件


    1. 前言

    机器学习是人工智能研究发展到一定阶段的必然产物。二十世纪八十年代是机器学习成为一个独立学科的学科领域、各种机器学习技术百花绽放的时期。支持向量机于1995年正式发表[Cortes and Vapnik,1995],由于在文本分类任务中的卓越性能[Joachims,1998],很快成为机器学习的主流技术,并直接掀起了“统计学习”(statistical learning)在2000年前后的高潮。——《机器学习》 周志华

    2010年前后,随着计算能力的迅猛提升和大数据的涌现,神经网络研究在“深度学习”的名义下又重新崛起,并迎来又一次发展高潮。近年研究SVM的论文少了很多,SVM的风头很多时候确实已被强势崛起的深度学习浪潮所淹没,95年的SVM比我们年龄还大,有点仿佛英雄迟暮的感觉。不过在我看来,实现简单而且非常强大的分类算法SVM仍然有其研究价值,与神经网络相比SVM亦有过人之处,如特征维数多于样本数的情况,而小样本学习至今仍是深度学习的一大难题。

    当浅层神经网络效果不佳时,人们将目光转向支持向量机,而支持向量机亦不负众望,以不错的成绩让人们对机器学习重拾信心。感谢支持向量机,感谢在神经网络几经起落的时候,支持向量机继往开来、自成一脉,填补了机器学习的一段空窗期,让这条曲折向上的研究之路绵延至今迎来了现在人工智能百花齐放的时代!

    接下来就通过简单的图片分类问题,通过MATLAB程序理解认识一下这一简单而强大的分类算法——支持向量机.


    2. 图片数据集整理

    首先需要准备好分类的数据集,数据的整理是机器学习中的重要一环。这里我们自行整理一个用于分类的图片集,图片集有四类图片,分别为车、猫、花、鱼。从百度上下载这四种图片,并分别存放在四个文件夹中,如下图所示

    四类图片每类分别下载100张左右的图片,这四百张图片作为分类的数据集,以7:3的比例将其分为训练图片集和测试图片集,分别放到picturestestPictures两个文件夹中。这两个文件夹下同上图一样都有car、cat、flw、fsh四个文件夹,值得注意的是测试样本的图片应可能不出现在训练集图片库中。做好以上工作,用于分类的图片集就准备完毕了。

    (当然用于分类的图片集常用的是cafir10图片集,这个数据集是写论文或研究时普遍用到的,可能会在后面的文章中介绍其用法,这里就暂时不使用cafir了。)

    为了便于后面的特征提取等对每张图片进行的操作,这里在程序中有必要将图片文件的存储位置、数量、类别等信息整理到一个数据结构中,新建一个m文件,程序代码如下

    dir=('D:\pictures');
    testdir=('D:\testPictures\test');
    trainingSet = imageSet(dir,'recursive');
    testSet = imageSet(testdir,'recursive');
    

    以上代码中用到imageSet( )函数是一个图片集整理的函数(MATLAB R2016b及以上版本支持),返回的是dir文件路径下文件夹内的文件信息。例如得到的trainingSet为一个1*4的imageSet变量,每个imageSet变量由Description、ImageLocation、Count三个属性组成,分别代表对子文件的描述、文件存储位置和图片数量。如下图所示是testSet(1)内部情况


    3. 主要步骤

    和深度学习的算法相比,传统的机器学习在进行图片分类时输入的不是原始图片而是先进行一个特征提取的步骤。在上篇中已经介绍了特征提取的相关内容,这里用的是方向梯度直方图(HOG)以及灰度共生矩阵(GLCM)。

    3.1 GLCM提取

    MATLAB中灰度共生矩阵的提取可以调用graycomatrix( )函数,不过这里为了取不同方向(0、45、90、135度)的灰度共生矩阵,通过循环计算各个方向的灰度共生矩阵并进行归一化处理(计算对比度、逆差距、熵、自相关),然后取平均值和方差作为最终提取的特征。

    新建一个m文件并命名为getGLCMFeatures,输入以下代码

    function [features] = getGLCMFeatures(image)
    features_all  = [];
    for i = 1:10
        glcm = graycomatrix(image, 'Offset', [0,i]);
        stats = graycoprops(glcm);
        
        glcm45 = graycomatrix(image, 'Offset', [-i,i]);
        stats45 = graycoprops(glcm45);
        
        glcm90 = graycomatrix(image, 'Offset', [-i,0]);
        stats90 = graycoprops(glcm90);
        
        glcm135 = graycomatrix(image, 'Offset', [-i,-i]);
        stats135 = graycoprops(glcm135);
        
        stats7x4 = [stats.Contrast stats.Correlation stats.Energy stats.Homogeneity;
            stats45.Contrast stats45.Correlation stats45.Energy stats45.Homogeneity;
            stats90.Contrast stats90.Correlation stats90.Energy stats90.Homogeneity;
            stats135.Contrast stats135.Correlation stats135.Energy stats135.Homogeneity];
        features_all = [features_all mean(stats7x4,1) std(stats7x4,0,1)];
    end
    features = features_all;
    

    新建的getGLCMFeatures函数输入为彩色图像转换后的灰度图像矩阵,输出为提取后的灰度共生矩阵特征。

    3.2 合并特征

    自己编写一个提取特征的函数命名为extractFeature,这个函数输入为整理过的训练集和测试集,输出为训练集的特征、标签和测试集的特征、标签。这个函数的功能是将HOG特征和前面提取的GLCM特征合并。

    代码第2到13行是为了确定每张图片提取特征后得到的矩阵大小,以方便后面的操作同时也是为了预分配空间以提高代码效率。首先取第一张图片进行灰度化以及阈值分割,将图片大小调整在256*256的范围(统一大小)分别进行HOG和GLCM的特征提取,分别得到两种特征向量,取两个向量的长度之和就是一张图片特征提取后的总长度了。

    function [trainingFeatures,trainingLabels,testFeatures,testLabels]=extractFeature(trainingSet,testSet)
    %% 确定特征向量尺寸
    img = read(trainingSet(1), 1);
    %转化为灰度图像
    img=rgb2gray(img);
    %转化为2值图像
    lvl = graythresh(img);
    img = im2bw(img, lvl);
    img=imresize(img,[256 256]);
    cellSize = [4 4];
    [hog_feature, vis_hog] = extractHOGFeatures(img,'CellSize',cellSize);
    glcm_feature = getGLCMFeatures(img);
    SizeOfFeature = length(hog_feature)+ length(glcm_feature);
    
    %% 构建训练样本特征向量和训练样本标签
    trainingFeatures = [];
    trainingLabels   = [];
    for digit = 1:numel(trainingSet)       
        numImages = trainingSet(digit).Count;
        features  = zeros(numImages, SizeOfFeature, 'single');%初始化特征向量
        % 遍历每张图片
        for i = 1:numImages
            img = read(trainingSet(digit), i);% 取出第i张图片
            
            img=rgb2gray(img);                % 转化为灰度图像
            glcm_feature = getGLCMFeatures(img);  % 提取GLCM特征
           
            lvl = graythresh(img);            % 阈值化
            img = im2bw(img, lvl);            % 转化为2值图像
            img=imresize(img,[256 256]);
            % 提取HOG特征
            [hog_feature, vis_hog] = extractHOGFeatures(img,'CellSize',cellSize);
            % 合并两个特征
            features(i, :) = [hog_feature glcm_feature];
        end
        % 使用图像描述作为训练标签
        labels = repmat(trainingSet(digit).Description, numImages, 1);  
        % 逐个添加每张训练图片的特征和标签
        trainingFeatures = [trainingFeatures; features];
        trainingLabels   = [trainingLabels; labels];       
    end
    
    
    %% 提取测试图片集的特征向量
    testFeatures = [];
    testLabels   = [];
    for digit = 1:numel(testSet)
               
        numImages = testSet(digit).Count;
        %初始化特征向量
        features  = zeros(numImages, SizeOfFeature, 'single');
        
        for i = 1:numImages
            
            img = read(testSet(digit), i);
            %转化为灰度图像
            img=rgb2gray(img);
            glcm_feature = getGLCMFeatures(img);
            %转化为2值图像
            lvl = graythresh(img);
            img = im2bw(img, lvl);
            img=imresize(img,[256 256]);
            [hog_4x4, vis4x4] = extractHOGFeatures(img,'CellSize',cellSize);
            features(i, :) = [hog_4x4 glcm_feature];
        end
        
        % 使用图像描述作为训练标签
        labels = repmat(testSet(digit).Description, numImages, 1);
            
        testFeatures = [testFeatures; features];
        testLabels=[testLabels; labels];
            
    end
    end
    

    代码18-41行是构建训练样本特征向量和训练样本标签,与前面步骤相似,只不过现在是遍历训练集每一张图片,对其进行灰度化、阈值化、调整大小,然后进行特征提取,将HOG特征和GLCM特征合并成一个向量作为特征矩阵的一行即一张图片的特征向量。样本的标签构建则将每张图片所处的文件夹的名字作为该图片的标签,并与特征向量顺序相对应。

    第47-73行是构建测试样本特征向量和训练样本标签,这里将图片集换成了测试集,而步骤与训练集是一致的。

    3.3 SVM训练与测试

    调用前面的特征提取函数得到训练和测试用的特征向量与对应的标签,便可以进行SVM的训练和测试。MATLAB自带的训练svm函数可以用fitcecoc函数,测试可以用predict函数预测结果,训练和测试的代码如下

    % 训练一个svm分类器
    % fitcecoc 使用11的方案
    classifier = fitcecoc(trainingFeatures, trainingLabels);
    save classifier.mat classifier;
    
    % 使用测试图像的特征向量预测样本标签
    predictedLabels = predict(classifier, testFeatures);
    

    代码中classifier为训练得到的SVM分类器,利用该分类器以及测试集特征向量预测测试集的标签predictLabels。后面可以将predictLabels与实际的测试标签进行对比即可评估分类好坏。

    3.4 分类结果评价

    在上一篇文章中提到过了,为了评价分类的好坏可以通过混淆矩阵,通过计算混淆矩阵对角线上的值占每行总数的比值得出分类正确率,其实现代码如下

    %% 评估分类器
    % 使用没有标签的图像数据进行测试,生成一个混淆矩阵表明分类效果
    confMat=confusionmat(testLabels, predictedLabels)
    accuracy=(confMat(1,1)/sum(confMat(1,:))+confMat(2,2)/sum(confMat(2,:))+...
        confMat(3,3)/sum(confMat(3,:))+confMat(4,4)/sum(confMat(4,:)))/4
    

    其结果如下图所示

    3.5 结果显示

    尽管以上代码能得到分类正确率,但我们希望更直观的看到输入一张图片后SVM分类器的分类结果,这里编写一个函数通过图形窗口显示预测结果。新建一个m文件命名为Predict,输入如下代码

    function [] = Predict(imageurl)
    load classifier.mat;
    figure;
    img = imread(imageurl);
    imshow(img);
    
    %提取图像的特征向量
    %转化为灰度图像
    img=rgb2gray(img);
    glcm_feature = getGLCMFeatures(img);
    %转化为2值图像
    lvl = graythresh(img);
    img = im2bw(img, lvl);
    
    % imshow(img);
    % figure
    img=imresize(img,[256 256]);
    [hog_4x4, ~] = extractHOGFeatures(img,'CellSize',[4 4]);
    testFeature = [hog_4x4 glcm_feature];
    
    
    % 使用测试图像的特征向量预测样本标签
    predictedLabel = predict(classifier, testFeature);
    
    str = ['分类结果:' predictedLabel];
    dim = [0.25 0.0004 0.2 0.2];
    annotation('textbox', dim, 'string', str, 'fontsize', 20, 'color', 'g','edgecolor', 'none');
    

    函数输入为图片的存储路径,调用函数则会通过图形窗口显示图片及分类结果,如在命令窗口输入如下代码

    Predict('D:\testPictures\test\car\car9.jpg');
    

    输出结果如下图


    4. 完整代码

    为了方便使用这里贴出完整代码

    主函数:

    clear;
    dir=('D:\pictures');
    testdir=('D:\testPictures\test');
    trainingSet = imageSet(dir,'recursive');
    testSet = imageSet(testdir,'recursive');
    
    [trainingFeatures,trainingLabels,testFeatures,testLabels]=extractFeature(trainingSet,testSet);
    %% 
    %训练一个svm分类器
    %fitcecoc 使用11的方案
    classifier = fitcecoc(trainingFeatures, trainingLabels);
    save classifier.mat classifier;
    
    % 使用测试图像的特征向量预测样本标签
    predictedLabels = predict(classifier, testFeatures);
    
    %% 评估分类器
    %使用没有标签的图像数据进行测试,生成一个混淆矩阵表明分类效果
    confMat=confusionmat(testLabels, predictedLabels)
    accuracy=(confMat(1,1)/sum(confMat(1,:))+confMat(2,2)/sum(confMat(2,:))+...
        confMat(3,3)/sum(confMat(3,:))+confMat(4,4)/sum(confMat(4,:)))/4
    
    Predict('D:\testPictures\test\car\car9.jpg');
    

    getGLCMFeatures.m:

    function [features] = getGLCMFeatures(image)
    features_all  = [];
    for i = 1:10
        glcm = graycomatrix(image, 'Offset', [0,i]);
        stats = graycoprops(glcm);
        
        glcm45 = graycomatrix(image, 'Offset', [-i,i]);
        stats45 = graycoprops(glcm45);
        
        glcm90 = graycomatrix(image, 'Offset', [-i,0]);
        stats90 = graycoprops(glcm90);
        
        glcm135 = graycomatrix(image, 'Offset', [-i,-i]);
        stats135 = graycoprops(glcm135);
        
        stats7x4 = [stats.Contrast stats.Correlation stats.Energy stats.Homogeneity;
            stats45.Contrast stats45.Correlation stats45.Energy stats45.Homogeneity;
            stats90.Contrast stats90.Correlation stats90.Energy stats90.Homogeneity;
            stats135.Contrast stats135.Correlation stats135.Energy stats135.Homogeneity];
        features_all = [features_all mean(stats7x4,1) std(stats7x4,0,1)];
    end
    features = features_all;
    

    extractFeature.m:

    function [trainingFeatures,trainingLabels,testFeatures,testLabels]=extractFeature(trainingSet,testSet)
    %% 确定特征向量尺寸
    img = read(trainingSet(1), 1);
    %转化为灰度图像
    img=rgb2gray(img);
    %转化为2值图像
    lvl = graythresh(img);
    img = im2bw(img, lvl);
    img=imresize(img,[256 256]);
    cellSize = [4 4];
    [hog_feature, vis_hog] = extractHOGFeatures(img,'CellSize',cellSize);
    glcm_feature = getGLCMFeatures(img);
    SizeOfFeature = length(hog_feature)+ length(glcm_feature);
    
    %% 构建训练样本特征向量和训练样本标签
    trainingFeatures = [];
    trainingLabels   = [];
    for digit = 1:numel(trainingSet)       
        numImages = trainingSet(digit).Count;
        features  = zeros(numImages, SizeOfFeature, 'single');%初始化特征向量
        % 遍历每张图片
        for i = 1:numImages
            img = read(trainingSet(digit), i);% 取出第i张图片
            
            img=rgb2gray(img);                % 转化为灰度图像
            glcm_feature = getGLCMFeatures(img);  % 提取GLCM特征
           
            lvl = graythresh(img);            % 阈值化
            img = im2bw(img, lvl);            % 转化为2值图像
            img=imresize(img,[256 256]);
            % 提取HOG特征
            [hog_feature, vis_hog] = extractHOGFeatures(img,'CellSize',cellSize);
            % 合并两个特征
            features(i, :) = [hog_feature glcm_feature];
        end
        % 使用图像描述作为训练标签
        labels = repmat(trainingSet(digit).Description, numImages, 1);  
        % 逐个添加每张训练图片的特征和标签
        trainingFeatures = [trainingFeatures; features];
        trainingLabels   = [trainingLabels; labels];       
    end
    
    
    %% 提取测试图片集的特征向量
    testFeatures = [];
    testLabels   = [];
    for digit = 1:numel(testSet)
               
        numImages = testSet(digit).Count;
        %初始化特征向量
        features  = zeros(numImages, SizeOfFeature, 'single');
        
        for i = 1:numImages
            
            img = read(testSet(digit), i);
            %转化为灰度图像
            img=rgb2gray(img);
            glcm_feature = getGLCMFeatures(img);
            %转化为2值图像
            lvl = graythresh(img);
            img = im2bw(img, lvl);
            img=imresize(img,[256 256]);
            [hog_4x4, vis4x4] = extractHOGFeatures(img,'CellSize',cellSize);
            features(i, :) = [hog_4x4 glcm_feature];
        end
        
        % 使用图像描述作为训练标签
        labels = repmat(testSet(digit).Description, numImages, 1);
            
        testFeatures = [testFeatures; features];
        testLabels=[testLabels; labels];
            
    end
    end
    

    Predict.m:

    function [] = Predict(imageurl)
    load classifier.mat;
    figure;
    img = imread(imageurl);
    imshow(img);
    
    %提取图像的特征向量
    %转化为灰度图像
    img=rgb2gray(img);
    glcm_feature = getGLCMFeatures(img);
    %转化为2值图像
    lvl = graythresh(img);
    img = im2bw(img, lvl);
    
    % imshow(img);
    % figure
    img=imresize(img,[256 256]);
    [hog_4x4, ~] = extractHOGFeatures(img,'CellSize',[4 4]);
    testFeature = [hog_4x4 glcm_feature];
    
    
    % 使用测试图像的特征向量预测样本标签
    predictedLabel = predict(classifier, testFeature);
    
    str = ['分类结果:' predictedLabel];
    dim = [0.25 0.0004 0.2 0.2];
    annotation('textbox', dim, 'string', str, 'fontsize', 20, 'color', 'g','edgecolor', 'none');
    

    5. 结束语

    本博文的完整MATLAB程序文件与图片集文件已经上传,下载即可运行(注意根据实际修改程序中的图片路径哦)下载地址如下

    点我下载:SVM的图像分类MATLAB完整程序及图片集文件

    更多相关资源详解也可参考博主最新博文基于支持向量机的手写数字识别详解(MATLAB GUI代码,提供手写板)

    公众号获取
        本人微信公众号已创建,扫描以下二维码并关注公众号“AI技术研究与分享”,后台回复“SV20180411”即可获取全部资源文件信息。

    由于编者能力有限,代码即使经过了多次校对,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。

    展开全文
  • 恢复前草鱼图像“正样本”
  • 基于贝叶斯算法的图像像素分割,并可视化分割结果。matlab程序
  • 所提出的系统侧重于通过图像质量参数和阈值进行图像分析。 在在线货币交易网站中,黑客攻击或网络钓鱼攻击非常常见。 黑客可以通过检测和纠正来控制和处理。 任何相似性度量中的整数输出值范围是 0 到 1。因此,...
  • 一篇文章:主讲用于计算成像系统的基于信噪比自适应估计的图像去模糊
  • 恢复前草鱼图像“正样本”
  • 的分类和识别

    2018-05-11 19:26:44
    编写matlab程序进行的分类和识别,对相应数据集进行训练达到很高的准确率
  • 文章提出一种基于 DCNN 和迁移学习的方法,针对新图像数据集,通过选 择训练参数,对预训练模型进行再训练,实现鱼类的分类识别 . 通过实验证实,这种方法可在占用少量 的计算机资源情况下,达到 97.14% 的验证准确...
  • 包含两个图像分类的资源 1.bp算法 用matlab实现 图像分类 已调试 可以运行 2.基于神经网络的图像分类,数据资源是基于CIFAR-10,内含训练测试数据(batch),是唐宇迪深度学习入门课程的修改代码,python3版本 ...
  • 自定义图像识别

    2018-10-06 16:16:51
    安卓端实现自定义图像识别,以品种的识别为例,可以实现自定义识别
  • 个人比较赞赏的一篇文献,对深入了解侧扫很有帮助,故截图上传,方便遗忘的时候查看。

    个人比较赞赏的一篇文献,对深入了解侧扫很有帮助,故截图上传,方便遗忘的时候查看。

     

    展开全文

空空如也

空空如也

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

图像去雨