2015-12-29 11:21:24 u013088062 阅读数 30180

  最近有人问我图像处理怎么研究,怎么入门,怎么应用,我竟一时语塞。仔细想想,自己也搞了两年图像方面的研究,做个两个创新项目,发过两篇论文,也算是有点心得,于是总结总结和大家分享,希望能对大家有所帮助。在写这篇教程之前我本想多弄点插图,让文章看起来花哨一点,后来我觉得没必要这样做,大家花时间沉下心来读读文字没什么不好,况且学术和技术本身也不是多么花哨的东西。

  一、图像处理的应用

  这个其实没什么好说的,一种技术的应用价值不是靠嘴上说,而是要看有多少人去搞,很简单的道理。其实我觉得判断一项技术有没有价值、有多大价值的最简单最有效的方法就是看有多少人在研究它。如果大家都在研究,那必然说明它很火,至少目前很火,以后的几年里依然还会火。因此,如果你不确定图像处理是不是有价值,那就查查全国图像处理工程师的数量就行了。

当然这里还是简单提一下。如果你真的只想问“图像处理有什么用?”,相信百度会给出比我更专业的答案。不过作为图像处理的行内人,我还是从几个基本的点来具体说一下。

  1、身份认证

  21世纪是刷脸的时代,这一点无可厚非。首先是银行,据说重庆的银行已经使用了人脸识别的验证系统来进行辅助的认证。其次是门禁系统,以前是指纹,虹膜,现在就是人脸。指纹、虹膜的识别虽然准确,但是有侵犯性,采集的过程中有侵犯性,验证的过程中也有侵犯性,反正让谁天天录指纹(采集指纹信息),用眼睛瞪摄像头(采集虹膜信息),谁都会觉得不舒服的,况且手还会脱皮。相比之下,人脸的识别就方便多了,拍张照片(采集人脸信息)谁都不会介意。最后是监控,一个摄像头所拍的监控能从不同的角度记录成百上千的人(比如车站等密集场所的监控),让警察去辨认将是一个浩大的工程,要是系统能够自动判别人员信息,无疑会给办案带来极大方便。

  2、监控安防

  安防监控可以说是图像处理领域最有潜力的应用领域。如今各个城市都在疯狂的安装监控摄像头,全国时刻都有无数的摄像头在录监控,但是安防监控的后端处理却没跟上。什么是后端处理,简单的说就是监控录像的视频处理。注意这里的视频处理可就不止包含人脸识别了,还有行人检测、异常检测、显著性检测、协同跟踪等。人脸识别之前说了,这里简单说说行人异常检测。图像处理中的行人异常检测在外行人眼中是一个非常有魔力的东西。毕竟让摄像头通过监控视频就能判断出当前画面中谁是好人谁是坏人(当然直接分为好人和坏人还是太武断了),在一般思维中貌似是不可能的。但是请不要忽略这样一个事实,就是目前大部分监控视频的分析处理都是由人工来完成的,警察破案时经常动不动就调出最近几天的监控视频,然后从头看到尾,其工程量之大可想而知。也正是这样才催生了人们对智能监控方面的研究,因为有这方面的实际需求。当然我们的视频分析程序不会直接给出诸如“好人or坏人”这样的武断而片面的判断结果。就当前的技术水平而言,能够统计当下监控画面中的人数(行人检测)、定位他们的人脸(人脸检测)、识别他们的身份(人脸识别)、判别他们的表情(表情识别)、检测他们的动作(异常检测),这就已经够了。这样以后人们就不会再面对长达几十甚至上百个小时的监控视频发呆,而是直接分析计算机给出的数据,当前画面中有多少人、都是谁、谁的动作可疑等。总之,接下来智能监控发展会很迅速,因为需求很迫切。

  3、深度学习(Deep Learning)

  通俗的说一句,“图像处理是深度学习应用的天堂”。深度学习这个概念可能有人不太熟悉,大家可以自行百度,我这里给出一个相对通俗的解释:“如果你不知道什么叫深度学习,就想想《终结者》中的T-800”。当然这句话不是我说的,是出自业界的一位大牛之口。当然这可能有点小片面,不过深度学习确实是公认的新一代人工智能的基础。

  这里举两个例子。一是谷歌的人工大脑项目。谷歌公司可以说是深度学习方面的牵头企业了,其在2012年公布的谷歌大脑项目,动用了1.6万个计算节点,训练数周,得到的人工智能模型能够自主识别猫脸图像,为新一代人工智能开辟了道路,之后微软深度学习研究院、百度深度学习研究院等机构都开始大量投入,各个高校也搞得风声水起,原因很简单,大家都知道它会火。

  第二就是图像识别方面的竞赛。最有权威的就是ImageNet竞赛。大家在一个拥有上千万张,上千类别的图像数据库上训练和测试自己的算法,比拼识别率。近几年来,摘得桂冠的一直都是深度学习模型,确切的说是卷积神经网络。更多有关ImageNet历年的竞赛信息大家可以自行百度。

  说道深度学习在图像处理的应用,不得不提中国的汤晓鸥教授,说他是国内深度学习的领头羊也不为过。他提出的DeepID人脸识别算法(一共分为三代),在一些大规模人脸数据库上的正确率(若LFW库)已经达到了99.75%,单纯从数字上讲的话可以说已经超越了人类的识别率,为此汤教授还开办了公司,开发FaceSDK(虽然还没有公布)。不过拿计算机和人脑相比本身就是不合理的,各有所长嘛。不过可见DeepLearning在图像识别领域的强大威力。至于深度学习与图像处理的关系这里就不用多说了,谷歌大脑识别的是图像,深度学习竞赛用的是图像,DeepID识别的还是图像人脸,虽然深度学习在其他方面诸如语音识别等也有应用,在图像处理依然是其主要的应用领域。

  二、图像处理研究工具

  图像处理的研究分为算法研究和应用两个部分。用到的主要编程语言有Matlab、C/C++、Python等,原因很简单,它们都有很多相应的第三方库,不用我们从零开始编程。

  1、Matlab

  MathWork公司的Matlab软件可以说是算法研究的利器,它的强大之处在于其方便快捷的矩阵运算能力和图形仿真能力,单从简洁性和封装性来说,确实完爆其他语言。但高度封装必然会相应的损失一部分灵活性,况且Matlab严格的讲更像是一个工具,而非一门编程语言。顺便提一句,它在2015年编程语言排行榜中位于第20名,仅次于IOS开发的Objective-C。

  对于算法研究人员(尤其是高校的硕士博士),首选工具自然是matlab,因为它简便快捷,封装性好,更重要的是全世界几乎所有的算法大牛、精英教授都会首先公布对应的Matlab源码,然后在逐步改写成其他语言进行实际应用。所以,如果你想做图像处理方面的研究,Matlab是必须掌握的,而且是熟练掌握。当你有一些想法需要验证时,最好明智的先用matlab编写出来测试。如果你上来就用看似高大上的C++来实验,不仅错误BUG一大堆,到头来可能效果还不佳,就算效果好,时间也会耽搁不少,毕竟算法开发还是要快的,这样才能赶在别人之前发论文。总之,只要是接触图像算法,终究逃不过Matlab,就算你是软件开发的,不研发算法,但总得能看懂别人的Matlab算法吧。

  对于之前没怎么接触过Matlab与图像处理的人,在这里推荐一本相关的书籍《MATLAB图像处理实例详解(附光盘)》。这本书对于Matlab图像处理入门还是很有帮助的。记得我当时刚上研究生时就靠两本书入门的,一是冈萨雷斯的《数字图像处理》,二是这本《MATLAB图像处理实例详解》。不过这里友情提示,在看这类教程(不仅仅是Matlab)时千万不要试图去记忆所有的工具函数,这种做法是十分愚蠢的。正确的做法是根据自己的情况快速翻阅这类工具书,可以找出里面的有实际意义的源码来敲一敲练练手感,至于具体的工具函数,只需要知道Matlab提供了这方面的功能就行了,以后用到了再回来查,或者谷歌百度。我觉得在入门阶段,最重要的不是看了多少书,听了多少课,而是尽快自己敲出一段代码,运行出结果,来建立自信和成就感,这才是支持我们走下去的最实在的动力。记得我当时看了没多久就自己敲了一个蹩脚的车牌检测的Matlab程序,现在看来真是漏洞百出,不过当时我真的很兴奋,很有成就感,觉得自己能干这行,对于初学者来说,这种感受弥足珍贵。

  2、OpenCv

  Opencv是Intel公司开发的C++图像处理工具包,形象的理解为就是C++版的Matlab。当初Intel公司开发这个工具包的初衷也是方便大家共享,希望大家能够在一个共同架构的基础上共同建造摩天大楼,而不是各自在自己的地基上盖平房。与Matlab不同,Opencv是面向开发的,稳定性好,异常处理机制周全,但有一点需要注意,由于Opencv是开源的,那么如果你在项目中直接调用了它的API,那就意味着你的项目也必须开源。因此在真正的产品开发过程中,往往需要从Opencv库里面挖代码,而不是直接调用,幸好Intel公司允许我们看源码,自己编译一把就可以了。

  说道C++和Opencv,有一个问题不得不提,那就是深度学习领域大名鼎鼎的Caffe框架。这是一个典型的基于C++和OpenCv的深度学习框架,由谷歌深度学习团队、“谷歌大脑”负责人之一贾扬清学者编写,并公布了源码。如今各个深度学习机构都在大量使用这个框架进行研究。

  这里同样对推荐两本关于Opencv方面的教程。一本是CSDN博客大牛毛星云写的《OpenCV3编程入门》,这是它根据自己多年的博客整理成的书,很详细,很典型的一本教程,介绍了OpenCv中相对前沿的知识。我翻看过这本教程,中规中矩,里面的代码通俗易懂,尤其适合初学者。当然大家同样要注意不要犯了死读书的毛病,只看它的功能,敲代码练手感即可,不要试图记忆API函数。重要的工具用多了自然会记住,不重要的工具记住了也没用。

  这里推荐的第二本书是《图像识别与项目实践――VC++、MATLAB技术实现》,这本书是一本偏向于工程应用的书,我之所以推荐它是因为它给出了很多有新意、能运行的代码。其中里面有一个项目让我印象很深,是一个车牌检测的实例。简单描述一下:由于车牌中的字符数是固定的,因此它通过判断横向区域笔画的跳变数以及笔画宽度来定位车牌区域。这个想法让人耳目一新,并且它还给出了详细代码,我也亲身试验过,效果还不错。

  这里同样再强调一下,就是一定要尽早入手写程序,建立自信和成就感。我当时学OpenCv正好用它开发了一个人脸性别识别的系统,是一个本科大学生创新计划的需求,效果还可以。

  3、Python

  Python在今年12月份的编程语言排行榜中名列第5,增长迅速。可以说Python已经逐渐成为当下脚本语言的新标准。Python在图像处理算法方面除了其自身简洁的编程优势外,还得益于两个重要的Python类库——Numpy和Theano。

  Numpy是Python的线性代数库,对于矩阵运算能提供很好的支持,并且能够在此基础上进行很多机器学习相关算法的开发仿真,这里推荐一本受到大家广泛认可的书《机器学习实战》,我最近也正在看这本书,里面对好多机器学习领域的经典算法,小到KNN,大到SVM,都给出了详细的介绍以及代码实现(Python版)。Theano是Python的机器学习库,能够方便的实现深度学习(例如卷积神经网络CNN)算法,网上很多对于DeepID算法的复现都是用的这个库。

  人觉得单从图像处理的角度评价的话,Python并没有前面两个工具(Matlab和OpenCv)应用广泛,不过作为通用的脚本语言,我觉得每个程序员都应该去了解了解它,毕竟俗话说没有烂的编程语言,只有烂程序员。我在学Python时第一个自己写的程序就是微信打飞机的小程序,在我的博客中有详细的教程,虽然是参照小甲鱼的《零基础入门学习Python》视频教程写的,但还是蛮有成就感的。

  三、图像处理研究方法

  我觉得,图像处理研究主要可以分为三个部分:基础概念、基本思想、算法研究。

  1、基础概念

  所谓基础概念,就是图像处理里最基本的知识,比如什么是图像?什么是像素?什么是彩色图像等等。没有一个明确的界限来划定什么是基础概念什么是高级知识,因人而异。了解图像处理的基础知识,有一本书是必读的,就是冈萨雷斯编写的、阮秋琦翻译的《数字图像处理》。这本书已经作为图像处理领域的经典教材使用了三十多年,我自己也把这本书看了好几遍,每一遍都会有新的体会。我觉得每一个搞图像的都应该熟读这本书。书中除了有几章内容在讲小波变换、模式识别等相对抽象的内容外,其他内容相对都是很基础的,本科生水平就能看懂。而且我建议要尽早看这本书,如果是研究生尽量在进入课题之前就看一遍,因为这样一本经典的书在进入课题之后可能就没时间看了,以后也顶多是查阅而已。我当初就是在大四的寒假看完了这本书,以后在图像入门的过程中就显得轻松很多。看完这本书,哪怕是只看前几章,明白了什么是图像(二维或者三维矩阵)、什么是像素、彩色图和灰度图、颜色空间、图像滤波、图像噪声、图像频域变换等概念,将来在进行更深一步的研究的话就会方便很多了。

  2、基本思想

  刚开始想把这部分内容命名为“基本算法”,意在介绍图像处理中的一些基本算法,后来仔细想想决定不这么写,因为图像处理是一个非常大的概念,图像处理不等于人脸识别,也不等于模式识别,直接介绍诸如图像处理基本算法之类的内容很容易写成空话,没有什么实际意义。读者有兴趣的话可以直接谷歌百度“图像处理十大经典算法”,上面有我想说的内容。

  万变不离其宗,算法是死的,重在思想。举个例子,我个人是主攻模式识别方向,在这个方向判断一个学生是否入门有一个非常简单的方法,就是“如果你能把图像很自然的想象成高维空间中的一个点”,那就说明在模式识别方面入门了,可以对图像进行分类了。当然标准不是唯一,在其他领域如目标检测也会有其他的判断标准,总之我们要对图像进行处理,那么图像就不再只是图像,它可能会演变成各种不同形式的概念,可能是点,可能是面,还可能是一个坐标空间。在目标跟踪的经典算法粒子滤波中,将一个个的小图像块看做一个个粒子;在子空间理论中,将一系列图像放在一起构建一个成分主空间(例如主成分分析PCA算法等等。,我不会详细介绍这些算法,说多了就显得抽象老套,但我要说的是我们一定要把图像本身理解好,它是一个图像,是一个矩阵,是一个信息的容器,是一种数据的表现形式,图像不一定都必须在视觉上有意义(比如频域的图像)。

  总之图像处理的基本思想还是要立足于图像本身,要深度到图像内部结构中,思维要灵活。我当时做本科毕设时,怎么也不知道图像和高维空间中的点之间有什么对应关系,后来总算有一天,突然就明白了,这也就是所谓的量变产生质变。总之一定要多想,多总结,主动去钻研,才能够真正领悟一些东西。最基本的东西往往蕴藏着深奥的道理,无论你现在多牛多厉害,都不能放掉最本源的东西。多想想图像是什么,有什么本质属性,你可能无法得到准确的答案,但肯定能得到一些有用的感悟(有点像哲学问题了)。

  3、算法研究

  算法研究应该是图像处理的核心工作,尤其是各大高校的博士硕士。这里我并不想谈那些高大上的算法,我更想说的是一些算法研究的一些基础的东西,比如说一些基础课程,比如说矩阵运算。

  研究图像处理的算法,离不开数学。在这里我建议图像处理方面的硕士一定要上两门课:《泛函分析》以及《最优化算法》,有的学校已经将这两门课列为了研究生阶段的必修课程。这两门可可以说是图像处理(至少是模式识别)的基础。我当初没上过最优化算法,但后来也自己补上了,不然真的是寸步难行。至于泛函我当时听课的时候也不是很懂,但是在之后的研究过程中发现很多图像处理的基本知识基本理论都和泛函分析中枯燥的定理如出一辙,没办法,有的东西本身就是枯燥的干货,学着费力,缺它不行。

  其次我想说的是矩阵运算。图像就是矩阵,图像处理就是矩阵运算。大家为什么都喜欢用Matlab,就是因为它的矩阵运算能力实在是太强大,在Matlab的世界中任何变量都是矩阵。同样OpenCv之所以能流行,不仅仅是因为它良好的封装性,也是因为它的矩阵格式,它定义了Mat基础类,允许你对矩阵进行各种操作。Python也不例外,它的Numpy就是一个专门的线性代数库。

  真正在图像编程过程中,那些看着高大上的API函数归根到底都是工具,查查手册就能找到,真正核心还是在算法,算法是由公式编写的,公式的单元是变量,而图像届的变量就是矩阵。所以,熟练去操作矩阵,求秩、求逆、最小二乘,求协方差,都是家常便饭。所以,如果你有幸能上《矩阵分析》这门课,一定要把它看懂,那里面都是干货。

  四、小结

  总之,图像处理就是一个典型的门槛低、厅堂深的领域。不需要太多基础,学过线性代数,会一点编程就够了;但是那些算法却深不可测,是个消耗功夫的活儿。在写这篇教程时我说的很直白,就像和大家对话一样,想到什么说什么。在最后我想说两句题外话,就是不仅仅针对图像处理,对于其他新技术的入门学习也是一样,尽快迈出第一步,尽快去建立自信和成就感,让自己有勇气走下去,然后缺什么补什么就行了。我觉得真正让人望而却步的往往不是技术本身,而是我们对自身的不自信。唯有果断开工,才能战胜心魔。


如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢。


2016-09-20 18:34:30 heyuchang666 阅读数 3590
数字图像处理是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。在计算机中,按照颜色和灰度的多少可以将图像争为二值图像、灰度图像、索引图像和真彩色RGB图像四种基本类型。目前,大多数图像处理软件都支持这四种类型的图像。

(1) 二值图像:

        一幅二值图像的二维矩阵仅由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(矩阵中每一元素)取值仅有0、1两种可能,所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。

(2) 灰度图像:

        灰度图像矩阵元素的取值范围通常为[0,255]。因此其数据类型一般为8位无符号整数的(int8),这就是人们经常提到的256灰度图像。“0”表示纯黑色,“255”表示纯白色,中间的数字从小到大表示由黑到白的过渡色。在某些软件中,灰度图像也可以用双精度数据类型(double)表示,像素的值域为[0,1],0代表黑色,1代表白色,0到1之间的小数表示不同的灰度等级。二值图像可以看成是灰度图像的一个特例。

(3) 索引图像:

        索引图像的文件结构比较复杂,除了存放图像的二维矩阵外,还包括一个称之为颜色索引矩阵MAP的二维数组。MAP的大小由存放图像的矩阵元素值域决定,如矩阵元素值域为[0,255],则MAP矩阵的大小为256ⅹ3,用MAP=[RGB]表示。MAP中每一行的三个元素分别指定该行对应颜色的红、绿、蓝单色值,MAP中每一行对应图像矩阵像素的一个灰度值,如某一像素的灰度值为64,则该像素就与MAP中的第64行建立了映射关系,该像素在屏幕上的实际颜色由第64行的[RGB]组合决定。也就是说,图像在屏幕上显示时,每一像素的颜色由存放在矩阵中该像素的灰度值作为索引通过检索颜色索引矩阵MAP得到。索引图像的数据类型一般为8位无符号整形(int8),相应索引矩阵MAP的大小为256ⅹ3,因此一般索引图像只能同时显示256种颜色,但通过改变索引矩阵,颜色的类型可以调整。索引图像的数据类型也可采用双精度浮点型(double)。索引图像一般用于存放色彩要求比较简单的图像,如Windows中色彩构成比较简单的壁纸多采用索引图像存放,如果图像的色彩比较复杂,就要用到RGB真彩色图像。

(4) RGB彩色图像:

        RGB图像与索引图像一样都可以用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。但与索引图像不同的是,RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形,通常用于表示和存放真彩色图像,当然也可以存放灰度图像。
2019-02-16 20:33:12 gaohanggaolegao 阅读数 635

写在最前面,突然发现一个网站https://biii.eu/,已经对生物图像处理的软件做了系统性地归档,这篇博客似乎有点鸡肋了。。。

前言

成像(imaging)是生物学研究的常用手段之一。然而,对于生物学研究者,如何分析成像后的图像数据是一个普遍的难题。对此,前人已经开发了许多生物图像处理软件。本文试图总结它们的特点,方便研究人员根据自己的研究目的、图像类型和系统配置,选择合适的生物图像处理软件。


1. 胞体分割(cell segmentation)

胞体识别是生物图像分析中很重要的一步。通常,用于胞体分割的图像是2D或者3D的。胞体分割是胞体追踪的必要条件,分割结果的好坏直接决定了胞体追踪的准确度。

图片来自https://www.mathworks.com/matlabcentral/fileexchange/67313-cell-segmentation-seg-self-method
在这里插入图片描述

1.1 目的

(1)统计细胞的数目
(2)分析细胞的荧光亮度分布
(3)分析细胞的体积分布(distribution of volume)
(4)分析细胞的圆滑程度

1.2 软件

名称 主页 适用图像类型 系统要求
Modular Interactive Nuclear Segmentation (MINS) https://github.com/therealkatlab/MINS 2D,3D Matlab, 64-bit Windows OS
interactive learning and segmentation toolkit (ilastik) https://www.ilastik.org/index.html 2D,3D Windows, Linux, Mac, 64-bit

2. 胞体追踪(cell tracking)

通常情况下,成像的图像数据是静态的,也就是说是在某一个时间点的图像。但是,根据研究目的的不同,有时会产生不同时间点的图像,也就是动态图像(2D+T和3D+T)。例如,在双光子成像中,在同一层面,拍摄10分钟后得到的图像数据,就是2D+T的数据格式。同样的,如果每个4小时,对某一个脑区的神经元进行3D成像,那么得到的图像就是3D+T的数据格式。

这里列出的软件主要针对3D+T数据格式的图像,因为2D+T的图像一般是在段时间内获取的,另外,镜头和样品位置相对不变,不存在胞体追踪的问题。对于2D+T的图像

GIF动图来自https://imagej.net/TrackMate
在这里插入图片描述

2.1 目的

(1)分析不同时间点下,胞体的荧光亮度的变化规律
(2)分析胞体位置随着时间的变化规律

2.2 软件

名称 主页 适用图像类型 系统要求
TrackMate https://imagej.net/TrackMate 3D+T 无,Fiji插件

3. 图像配准(image registration)

3.1 目的

确定图像空间之间的映射关系,将同一样本不同时间,或者不同样本采集的图像对齐。

3.2 软件

名称 主页 适用图像类型 是否自动 变换类型 系统要求
BigWarp https://imagej.net/BigWarp 2D 否,landmark-based thin plate spline;affine 无,Fiji插件
CMTK https://www.nitrc.org/projects/cmtk 3D 是,intensity-based B-spline; affine

2015-05-29 13:47:46 u011177305 阅读数 4708

图像分割是图像处理中的一项关键技术,自20世纪70年代起一直受到人们的高度重视,至今已提出了上千种各种类型的分割算法,现提出的分割算法大都是针对具体问题的,并没有一种适合于所有图像的通用分割算法,而且近年来每年都有上百篇相关研究报道发表。然而,还没有制定出选择合适分割算法的标准,这给图像分割技术的应用带来许多实际问题。因此,对图像分割的研究还在不断深入之中,是目前图像处理中研究的热点之一。

图像分割在图像工程中的位置它起着承上启下的作用,可以认为是介于低层次处理和高层次处理的中间层间。最近几年又出现了许多新思路、新方法、或改进算法。下面对一些经典传统方法作简要的概述。

多年来人们对图像分割提出了不同的解释和表述,借助集合概念对图像分割可给出如下定义:令集合R代表整个图像区域,对R的图像分割可以看做是将R分成N个满足以下条件的非空子集R1,R2,R3,…,RN

(1)在分割结果中,每个区域的像素有着相同的特性;

(2)在分割结果中,不同子区域具有不同的特性,并且它们没有公共特性;

(3)分割的所有子区域的并集就是原来的图像;

(4)各个子集是连通的区域;

图像分割是把图像分割成若干个特定的、具有独特性质的区域并提取出感兴趣目标的技术和过程,这些特性可以是像素的灰度、颜色、纹理等提取的目标可以是对应的单个区域,也可以是对应的多个区域。图像分割方法有许多种分类方式,在这里将分割方法概括为四类:(1)边缘检测方法(2)区域提取方法(3)阈值分割方法(4)结合特定理论工具的分割方法。下面就这些方法展开介绍。

1 边缘检测法

图像分析和理解的第一步常常是边缘检测。边缘检测方法是人们研究得比较多的一种方法,它通过检测图像中不同区域的边缘来达到分割图像的目的。边缘检测的实质是采用某种算法来提取出图像中对象与背景问的交界线。我们将边缘定义为图像中灰度发生急剧变化的区域边界。图像灰度的变化情况可以用图像灰度分布的梯度来反映,因此我们可以用局部图像微分技术来获得边缘检测算子。经典的边缘检测方法,是通过对原始图像中像素的某小邻域构造边缘检测算子来达到检测边缘这一目的。

2 区域提取法

区域提取法有两种基本形式:一种是从单个像素出发,逐渐合并以形成所需的分割区域;另一种是从全图出发,逐渐分裂切割至所需的分割区域。在实际中使用的通常是这两种基本形式的结合。根据以上两种基本形式,区域提取法可以分为区域生长法和分裂合并法。区域生长法的基本思想是将具有相似性质的像素合起来构成区域,具体做法是先给定图像中要分割的目标物体内的一个小块或者说种子区域,再在种子区域的基础上不断将其周围的像素点以一定的规则加入其中,达到最终将代表该物体的所有像素点结合成一个区域的目的。该方法的关键是要选择合适的生长或相似准则。生长准则一般可分为三种:基于区域灰度差准则、基于区域内灰度分布统计性质准则和基于区域形状准则。分裂合并法是先将图像分割成很多的一致性较强的小区域,再按一定的规则将小区域融合成大区域,达到分割图像的目的。区域提取法的缺点是往往会造成过度分割,即将图像分割成过多的区域,因此近年来针对这种方法的研究较少。

3 阈值分割法


对灰度图像的取阈值分割就是先确定一个处于图像灰度取值范围之中的灰度阈值,然后将图像中各个像素的灰度值都与这个阈值相比较,并根据比较结果将对应的像素分为两类。这两类像素一般分属图像的两类区域,从而达到分割的目的。阈值分割算法主要有两个步骤:

(1)确定需要的阈值;

(2)将分割阈值与像素值比较以划分像素。

可以看出,确定一个最优阈值是分割的关键。现有的大部分算法都是集中在阈值确定的研究上。阈值分割方法根据图像本身的特点,可分为单阈值分割方法和多阈值分割方法:也可分为基于像素值的阈值分割方法、基于区域性质的阈值分割方法和基于坐标位置的阈值分割方法.若考虑分割算法所用的特征或准则的特点,还可以分为直方图与直方图变换法、最大类空间方差法、最小误差法与均匀化误差法、共生矩阵法、最大熵法、简单统计法与局部特性法、概率松弛法、模糊集法等。

4 结合特定理论工具的分割方法

近年来,随着各学科许多新理论和方法的提出,人们也提出了许多结合特定理论工具的分割方法,例如基于数学形态学的分割方法,基于神经网络的分割方法,基于信息论的分割方法,基于模糊集合和逻辑的分割方法,基于小波分析和变换的分割方法,基于遗传算法的分割方法等。基于小波分析和变换的分割方法是借助新出现的数学工具小波变换来分割图像的一种方法,也是现在非常新的一种方法。小波变换是一种多尺度多通道分析工具,比较适合对图像进行多尺度的边缘检测,例如可利用高斯函数的一阶和二阶导数作为小波函数,利用Mallat算法分解小波,然后基于马尔算子进行多尺度边缘检测,这里小波分解的级数可以控制观察距离的“调焦”。而改变高斯函数的标准差可选择所检测边缘的细节程度。小波变换的计算复杂度较低,抗噪声能力较强。理论证明以零点为对称点的对称二进小波适合检测屋顶状边缘,而以零点为反对称点的反对称二进小波适合检测阶跃状边缘。近年来多通道小波也开始用于边缘检测。另外,利用正交小波基的小波变换也可提取多尺度边缘,并可通过对图像奇异度的计算和估计来区分一些边缘的类型。

2016-10-20 17:31:38 David_Han008 阅读数 2541

数字图像的分类

根据特性分为:
- 位图
通常用数字阵列来表示,常见的格式有BMP,JPG,GIF
- 矢量图
是由矢量数据库来表示,常见的格式有PNG图像
根据每个像素所代表的信息不同分为:
- 二值图像
0来表示黑色,1来表示白色—-越大越亮
- 灰度图像
所有的取值在0-255,然后值越大越白
- RGB图像
RGB颜色代码可以用16进制来书写
这里写图片描述

//两个16进制组成排列有256中可能
0XFF0000//表示红色R
0X00FF00//表示绿色G
0X0000FF//表示蓝色B
0X000000//表示黑色
0XFFFFFF//表示白色
0X808080//表示灰色
  • 索引图像
    他的诞生完全是为了省空间,但是怎么省去空间,我还是不知道(感觉相当于增量调制,用增加的量来表示代码)

像素

像素就是包含有图像的信息的一个最小的集合。

图像的空间分辨率

图像的空间分辨率(spatial Resolution)是指的图像中单位长度包含像素和点的数目,通常用像素/英寸(ppi)为单位来表示。例如72ppi就表示图像中每英寸包含72个像素或点

图像的灰度级/辐射计量分辨率

灰度级分辨率又叫做色阶,色阶是指的图像中可分辨的灰度级数目,色阶越少,可以颜色数目也越少。

邻域

这里写图片描述
数字图像中一些基本的性质:
- 邻接性
- 连通性
- 区域与边界

基本图像操作

  • 点运算和邻域运算
    点运算是对图像中每个像素点进行同样的灰度变换
    邻域运算(邻域变换)对图像中每个小范围(邻域内)像素进行灰度变换
  • 线性和非线性操作

细胞数组

在MATLAB中细胞数组就是可以在一个数组内部定义

>>cell={'a',12};
>>cell{1}='a'%用花括号进行索引

结构体

结构体就是一种聚合类型

struct.Name='David_Han';
struct.Age=23;
struct = 
    Name: 'David_Han'
     Age: 23

meshgrid()函数

meshgrid函数是拥有绘制三维曲面
绘制中心在原点的二维高斯函数的图像

u=[-10:0.1:10];
v=[-10:0.1:10];%取200个点
[U,V]=meshgrid(u,v);
H=exp(-(U.^2+V.^2)./2/3^2);
mesh(u,v,H)%用于出图

这里写图片描述

MATLAB中图像的读写

A=imread('C:\Users\Administrator\Desktop\1.jpg');
imshow(A)

这里写图片描述

imfinfo('C:\Users\Administrator\Desktop\1.jpg')
ans = 
           Filename: 'C:\Users\Administrator\Desktop\1.jpg'
        FileModDate: '23-十月-2016 15:11:09'
           FileSize: 92558
             Format: 'jpg'
      FormatVersion: ''
              Width: 811
             Height: 695
           BitDepth: 24
          ColorType: 'truecolor'
    FormatSignature: ''
    NumberOfSamples: 3
       CodingMethod: 'Huffman'
      CodingProcess: 'Progressive'
            Comment: {}

多帧图像的显示

>> load mri%载入matlab中自带图像
>> imshow(D(:,:,7),map)

这里写图片描述

load mri
imshow(D(:,:,7),map);
figure,montage(D,map);
figure
mov=immovie(D,map);
colormap(map);%设定颜色表
movie(mov);%播放电影

这里写图片描述

像素查看工具

输入impixellinfo命令后,对着光标的移动就会显示出指针位置的像素值
这里写图片描述
还可以通过输入imdistline命令后查看两点之间的距离
这里写图片描述

灰度直方图

灰度直方图用于图像分割和图像灰度变等过程
图像的直方图描述的是图像中各个灰度等级出现个概率,横坐标表示的是各个像素点的灰度级别,纵坐标是各个灰度级别的像素在图像中出现的次数或者概率。
在这个地方一直报错,目前知道的原因是因为图片的格式不是tif,我用示例照片是可以做的
这里写图片描述
注意:现在看来是因为不是灰度图像,所以要将彩色图像转化成灰度图像。

 I = imread('pout.tif');
 imhist(I)

这里写图片描述

灰度的线性变换

对灰度图像乘以线性变换用来改变图像的灰度值

灰度对数变换

灰度的对数变换可以增强一副图像中较暗部分的细节

clear all
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
figure;
imshow(A);
title('傅里叶变换前')
%显示出这幅图像的频谱
F=fft2(im2double(A));
F=fftshift(F);%也就是说用fft和fftshift两个函数,才完成了傅里叶变换
F=abs(F);%求出他的实部
figure
imshow(F,[]);
title('傅里叶变换后')

解释部分:

1、im2double(A)%这个函数将图像转化成double类型
%转化成double类型后再对这个图像进行二维的傅里叶变换,并且将这个值赋值给F

2、fftshift函数:
fftshift的作用正是让正半轴部分和负半轴部分的图像分别关于各自的中心对称。因为直接用fft得出的数据与频率不是对应的,fftshift可以纠正过来

这里写图片描述
哈哈,我把女神的照片便道频域上了
离散傅里叶的核心就是:反折,移位,相乘,相加

在频域上进行对数变换前后对比:
代码:

clear all
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
%figure;
%imshow(A);
%title('傅里叶变换前')
%显示出这幅图像的频谱
F=fft2(im2double(A));
F=fftshift(F);%也就是说用fft和fftshift两个函数,才完成了傅里叶变换
F=abs(F);%求出他的实部
figure
imshow(F,[]);
title('对数变换前')
%经过对数变换后
T=0.1*log(F+1.5);
figure
imshow(T);
title('频域经过对数变换后')

这里写图片描述
好漂亮啊!!
反正规律就是前面的系数越小就越黑,系数越大,就越白

伽玛变换

伽玛变换也叫做指数变换或者幂次变换
是一种常用的灰度非线性变换
MATLAB中实现伽玛变换的是imadjust函数

clear all
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
subplot(1,3,1);
imshow(A);
title('伽玛变换前')
%Gamma0.5
subplot(1,3,2)
imshow(imadjust(A,[],[],0.5));
title('Gamma取0.5')
%Gamma1.5
subplot(1,3,3)
imshow(imadjust(A,[],[],1.5));
title('Gamma取1.5')
J=imadjust(I,[low_in,high_in],[low_out,high_out],gamma);
%该函数将输入图像I中的low_in,high_in之间的值映射到输出图像J中,low_out 和 high_out之间的值,其他区域将会被裁减掉

Gamma>1,图像的高灰度区域对比度得到增强,也就是说区分度更大,图像变暗
Gamma=1,灰度变换是线性的
Gamma<1,图像的低灰度区域得到增强,图像变亮了,区分度更小

这里写图片描述

clear all
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
subplot(2,3,1);
imshow(A);
title('伽玛变换前')
%Gamma0.5
subplot(2,3,2)
imshow(imadjust(A,[],[],0.5));
title('Gamma取0.5')
%Gamma1.5
subplot(2,3,3)
imshow(imadjust(A,[],[],1.5));
title('Gamma取1.5')
subplot(2,3,4)
I=rgb2gray(A);%只有把原始的彩色图像转化成灰度图,才可以产生灰度的直方图
imhist(I);
subplot(2,3,5)
imhist(imadjust(I,[],[],0.5));
subplot(2,3,6)
imhist(imadjust(I,[],[],1.5));

这里写图片描述

%这个函数可以将彩色图像转换成灰度图像
I=rgb2gray(A);%只有把原始的彩色图像转化成灰度图,才可以产生灰度的直方图

灰度的阈值变换

灰度的阈值判断可以将一副灰度图像转变黑白的二值图像,用户给定一个分界线,高于这个分界线灰度值设成1,低于分界线的灰度值设成0。灰度的阈值变换经常用于图像分割
MATLAB中和图像的阈值变换相关的函数

Bw=im2bw(I,level)%I是输入图像,level是一个在0~1之间的双精度浮点数,例如166/255
thresh=graythresh(I) %graythesh函数自动为这个变换找到最优解
clear all
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
thresh=graythresh(A);
Bw1=im2bw(A,thresh);
subplot(1,3,1)
imshow(Bw1)
title('graythresh最优化的解')
Bw2=im2bw(A,50/255);
subplot(1,3,2)
imshow(Bw2)
title('阈值取50/255')
Bw3=im2bw(A,200/250);
subplot(1,3,3)
imshow(Bw3)阈值越小,白的部分越多,阈值越大,黑的部分越多
title('阈值取200/255')

这里写图片描述

分段线性变换

分段线性变换:对用户感兴趣的部分进行增强,对用户不感兴趣的部分进行减弱

直方图均衡化

直方图均衡化也叫灰度均衡化,是指的通过某种灰度映射使得,在整个直方图灰度的概率近似相等
matlab中提供的直方图均衡化的函数

[J,T]=histeq(I)%I是输入原始图像,J是经过直方图均值化输出的图像,T是变换矩阵
clear all
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
I=rgb2gray(A);%只有把原始的彩色图像转化成灰度图,才可以产生灰度的直方图
subplot(2,2,1)
imshow(I);
title('初始图像');
subplot(2,2,3)
imhist(I);
title('初始图像的直方图')
subplot(2,2,2)
imshow(histeq(I));
title('均值化');
subplot(2,2,4)
imhist(histeq(I));
title('均值化的直方图');

这里写图片描述
可以看出均衡化将直方图的灰度更加的平均

直方图规定化

直方图规定化是在直方图均衡化的基础上建立的,我们希望得到人们预期的直方图的形状,而直方图图均衡化做不到,所以就有了直方图规定化

[J,T]=histeq(I),hgram)%hgram叫做直方图的收集箱数目,
对于double类型的图像,hgram的范围是[0,1],
对于unit8类型的图像而言,是[0,255],
对于unit16型的图像取值范围[0,65535]
65535是计算机16位二进制最大数
clear all
%导入预期图像的灰度值
Idea=imread('D:\MATLAB\matlab编写的程序\原材料\2.png');
Idea=rgb2gray(Idea);%并且把他转化成灰度图像
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
I=rgb2gray(A);%只有把原始的彩色图像转化成灰度图,才可以产生灰度的直方图
subplot(2,3,1)
imshow(I);
title('初始图像');
subplot(2,3,4)
imhist(I);
title('初始图像的直方图');
subplot(2,3,2)
imshow(Idea);
title('预期图像');
subplot(2,3,5)
imhist(Idea);
title('预期图像的直方图');
[x,hgram1]=imhist(Idea);%从目标函数中提取hgarm
J=histeq(I,hgram1);
subplot(2,3,3)
imshow(J);
title('标定化后');
subplot(2,3,6)
imhist(J);
title('标定化后');

这里写图片描述
例如


图像分割

图像分割是指将图像中具有特殊意义的不同区域划分开来。
图像分割算法是基于图像灰度值的不连续性或其相似性。
图像的边缘是图像的最基本的特征,边缘点是指图像中周围像素灰度有了阶跃变化的那些像素点

常用的边缘检测算子

1、梯度算子
sobel算子,prewitt算子,roberts算子
2、基于高斯-拉普拉斯算子边缘检测

MATLAB实现:

BW=edge(I,type,thresh,direction,'nothinning');
%I是输入灰度图像
type是梯度算子的种类:sobel\prewitt\roberts
thresh是敏感度阈值函数,任何灰度值低于此阈值函数的都不会被检测到
direction指定的是操作者感兴趣的边缘方向:horizontal/vertical/both
nothinning是可选参数,是指可以跳过边缘细化算法来加快算法的运行速度,在默认的条件下,"thinning"就是边缘细化
bw是返回的二值图像,1白色为边缘部分
BW=edge(I,'log',thresh,sigma)
参数:
I:输入图像
"log"表示高斯-拉普拉斯算子
thresh也是敏感度阈值参数
sigma指定生成高斯滤波所使用的标准差,默认的标准差值为2,滤镜
clear all
%导入预期图像的灰度值
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
I=rgb2gray(A);
B1=edge(I,'sobel');
subplot(1,3,1)
imshow(B1);
B2=edge(I,'prewitt');
subplot(1,3,2)
imshow(B2);
B3=edge(I,'roberts');
subplot(1,3,3)
imshow(B3);

这里写图片描述
基于高斯-拉普拉斯算子的边缘检测

clear all
%导入预期图像的灰度值
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
I=rgb2gray(A);
B4=edge(I,'log');
imshow(B4);

这里写图片描述

canny算子的边缘检测
clear all
%导入预期图像的灰度值
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
I=rgb2gray(A);
B4=edge(I,'canny');
imshow(B4);

这里写图片描述
总之一句话,canny最好

霍夫曼变换

1、[H,theta,rho]=hough(BW,param1,val1,param2,val2);
BW是边缘检测后额二值图像
param1,val1param2,val2是一一配对的
H是变换得到的hough矩阵
thetarhoHough对应于矩阵的每一列和每一行的角度和半径组成的向量
2Houghpeaks()函数用于寻找hough矩阵中寻找指定数目的峰值点
Pesks=houghpeaks(H,numpeaks,param1,val1,param2,val2)
H是由于hough()函数得到的hough矩阵
numpeaks是指需要找到的峰值数目,默认值为1
param1,val1param2,val2是一一配对的
3houghlines()根据hough矩阵的峰值检测结果提取直线的线段
lines=houghlines(BW,theta,rho.peaks.param1,val1,param2,val2)
BW是边缘检测后的二值图像
theatrho是由hough函数返回得到
param1,val1param2,val2是一一配对的
clear all
%导入预期图像的灰度值
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
I=rgb2gray(A);
B4=edge(I,'canny');
figure;
imshow(B4);
[H,T,R]=hough(B4);%Hough矩阵图像中标出峰值位置,经过边缘检测后的图像进行拆分
figure;
imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit');
%在hough矩阵中寻找前5个大于hough矩阵中最大值的0.3倍峰值
P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
x=T(P(:,2));
y=R(P(:,1));
plot(x,y,'s','color','red');%标出峰值的位置
lines=houghlines(B4,T,R,P,'FillGap',5,'Minlength',7);%合并小于5的线段,丢弃所有长度小于7的线段
figure,imshow(A),hold on 
max_len=0;
for k=1:length(lines)
    xy=[lines(k).point1;lines(k).point2];
    plot(xy(:,1),xy(:,2),'lineWidth',2,'color','green');

    %绘制线段的端点
     plot(xy(1,1),xy(1,2),'x','LineWidth',2,'color','red');
     plot(xy(2,1),xy(2,2),'x','LineWidth',2,'color','green');
    len = norm(lines(k).point1-lines(k).point2);
    if(len>max_len)
    max_len=len;
    xy_long=xy;
    end  
end

原理方面真的不是很懂啊,就事找出特征点,然后进行画图
这里写图片描述
红色的就是特征点,然后绿色的就是连接的线

特征提取

11111

SVM

用函数SVMtrain()来训练一个SVM分类器
SVMStruct=svmtrain(Trainning,Group)
Training是一个包含训练数据的m行和n列的2维矩阵,每行表示的1个训练样本,m表示训练样本数目,n表示样本维数

这里写图片描述

Group是一个代表训练样本类标签的1维向量,其中每个元素只能为0或者1;1表示正例,0表示反例
Group的维数(也就是列数),必须和Training和行数相等
SVMStruct是训练所得到的代表SVM分类器的结构体,其中包含

设定核函数

SVMStruct=svmtrain(...,'Kernel_Function','Kernel_FunctionValue');
Kernel_FunctionValue的取值:
没有更多推荐了,返回首页