c++图像处理⼊门教程
 最近有⼈问我图像处理怎么研究,怎么⼊门,怎么应⽤,我竟⼀时语塞。仔细想想,⾃⼰也搞了两年图像⽅⾯的研究,做个两个创新项⽬,发过两篇论⽂,也算是有点⼼得,于是总结总结和⼤家分享,希望能对⼤家有所帮助。在写这篇教程之前我本想多弄点插图,让⽂章看起来花哨⼀点,后来我觉得没必要这样做,⼤家花时间沉下⼼来读读⽂字没什么不好,况且学术和技术本⾝也不是多么花哨的东西。
  ⼀、图像处理的应⽤
  这个其实没什么好说的,⼀种技术的应⽤价值不是靠嘴上说,⽽是要看有多少⼈去搞,很简单的道理。其实我觉得判断⼀项技术有没有价值、有多⼤价值的最简单最有效的⽅法就是看有多少⼈在研究它。如果⼤家都在研究,那必然说明它很⽕,⾄少⽬前很⽕,以后的⼏年⾥依然还会⽕。因此,如果你不确定图像处理是不是有价值,那就查查全国图像处理⼯程师的数量就⾏了。
php单链表当然这⾥还是简单提⼀下。如果你真的只想问“图像处理有什么⽤?”,相信百度会给出⽐我更专业的答案。不过作为图像处理的⾏内⼈,我还是从⼏个基本的点来具体说⼀下。
  1、⾝份认证
  21世纪是刷脸的时代,这⼀点⽆可厚⾮。⾸先是银⾏,据说重庆的银⾏已经使⽤了⼈脸识别的验证系
统来进⾏辅助的认证。其次是门禁系统,以前是指纹,虹膜,现在就是⼈脸。指纹、虹膜的识别虽然准确,但是有侵犯性,采集的过程中有侵犯性,验证的过程中也有侵犯性,反正让谁天天录指纹(采集指纹信息),⽤眼睛瞪摄像头(采集虹膜信息),谁都会觉得不舒服的,况且⼿还会脱⽪。相⽐之下,⼈脸的识别就⽅便多了,拍张照⽚(采集⼈脸信息)谁都不会介意。最后是监控,⼀个摄像头所拍的监控能从不同的⾓度记录成百上千的⼈(⽐如车站等密集场所的监控),让警察去辨认将是⼀个浩⼤的⼯程,要是系统能够⾃动判别⼈员信息,⽆疑会给办案带来极⼤⽅便。
  2、监控安防
  安防监控可以说是图像处理领域最有潜⼒的应⽤领域。如今各个城市都在疯狂的安装监控摄像头,全国时刻都有⽆数的摄像头在录监控,但是安防监控的后端处理却没跟上。什么是后端处理,简单的说就是监控录像的视频处理。注意这⾥的视频处理可就不⽌包含⼈脸识别了,还有⾏⼈检测、异常检测、显著性检测、协同跟踪等。⼈脸识别之前说了,这⾥简单说说⾏⼈异常检测。图像处理中的⾏⼈异常检测在外⾏⼈眼中是⼀个⾮常有魔⼒的东西。毕竟让摄像头通过监控视频就能判断出当前画⾯中谁是好⼈谁是坏⼈(当然直接分为好⼈和坏⼈还是太武断了),在⼀般思维中貌似是不可能的。但是请不要忽略这样⼀个事实,就是⽬前⼤部分监控视频的分析处理都是由⼈⼯来完成的,警察破案时经常动不动就调出最近⼏天的监控视频,然后从头看到尾,其⼯程量之⼤可想⽽知。也正是这样才催⽣了⼈们对智能监控⽅⾯的研究,因为有这⽅⾯的实际需求。当然我们的视频分析程序不会直接给出诸
如“好⼈or坏⼈”这样的武断⽽⽚⾯的判断结果。就当前的技术⽔平⽽⾔,能够统计当下监控画⾯中的⼈数(⾏⼈检测)、定位他们的⼈脸(⼈脸检测)、识别他们的⾝份(⼈脸识别)、判别他们的表情(表情识别)、检测他们的动作(异常检测),这就已经够了。这样以后⼈们就不会再⾯对长达⼏⼗甚⾄上百个⼩时的监控视频发呆,⽽是直接分析计算机给出的数据,当前画⾯中有多少⼈、都是谁、谁的动作可疑等。总之,接下来智能监控发展会很迅速,因为需求很迫切。input是什么属性
  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提供了这⽅⾯的功能就⾏了,以后⽤
大学python入门教程到了再回来查,或者⾕歌百度。我觉得在⼊门阶段,最重要的不是看了多少书,听了多少课,⽽是尽快⾃⼰敲出⼀段代码,运⾏出结果,来建⽴⾃信和成就感,这才是⽀持我们⾛下去的最实在的动⼒。记得我当时看了没多久就⾃⼰敲了⼀个蹩脚的车牌检测的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。
shell脚本多个if
  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函数归根到底都是⼯具,查查⼿册就能到,真正核⼼还是在算法,算法是由公式编写的,公式的单元是变量,⽽图像届的变量就是矩阵。所以,熟练去操作矩阵,求秩、求逆、最⼩⼆乘,求协⽅差,都是家常便饭。所以,如果你有幸能上《矩阵分析》这门课,⼀定要把它看懂,那⾥⾯都是⼲货。
帝国cms付费下载模板  四、⼩结
  总之,图像处理就是⼀个典型的门槛低、厅堂深的领域。不需要太多基础,学过线性代数,会⼀点编程就够了;但是那些算法却深不可测,是个消耗功夫的活⼉。在写这篇教程时我说的很直⽩,就像和⼤家对话⼀样,想到什么说什么。在最后我想说两句题外话,就是不仅仅针对图像处理,对于其他新技术的⼊门学习也是⼀样,尽快迈出第⼀步,尽快去建⽴⾃信和成就感,让⾃⼰有勇⽓⾛下去,然后缺什么补什么就⾏了。我觉得真正让⼈望⽽却步的往往不是技术本⾝,⽽是我们对⾃⾝的不⾃信。唯有果断开⼯,才能战胜⼼魔。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。