[转载] 图像处理入门教程

文章来源https://blog.csdn.net/u013088062/article/details/50425018
  图像处理研究工具

图像处理的研究分为算法研究和应用两个部分。用到的主要编程语言有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函数归根到底都是工具,查查手册就能找到,真正核心还是在算法,算法是由公式编写的,公式的单元是变量,而图像届的变量就是矩阵。所以,熟练去操作矩阵,求秩、求逆、最小二乘,求协方差,都是家常便饭。所以,如果你有幸能上《矩阵分析》这门课,一定要把它看懂,那里面都是干货。

小结

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

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值