文章转自:By xdyang(杨晓冬[email protected])
图像处理与计算机视觉基础,经典以及最近发展By xdyang(杨晓冬[email protected]) 一、 绪论1. 为什么要写这篇文章 从2002年到现在,接触图像快十年了。虽然没有做出什么很出色的工作,不过在这个领域摸爬滚打了十年之后,发现自己对图像处理和计算机视觉的感情越来越深厚。下班之后看看相关的书籍和文献是一件很惬意的事情。平常的一大业余爱好就是收集一些相关的文章,尤其是经典的文章,到现在我的电脑里面已经有了几十G的文章。写这个文档的想法源于我前一段时间整理文献时的一个突发奇想,既然有这个多文献,何不整理出其中的经典,抓住重点来阅读,同时也可以共享给大家。于是当时即兴写了一个《图像处理与计算机视觉中的经典论文》。现在来看,那个文档写得很一般,所共享的论文也非常之有限。就算如此,还是得到了一些网友的夸奖,心里感激不尽。因此,一直想下定决心把这个工作给完善,力求做到尽量全面。
本文是对现有的图像处理和计算机视觉的经典书籍(后面会有推荐)的一个补充。一般的图像处理书籍都是介绍性的介绍某个方法,在每个领域内都会引用几十上百篇参考文献。有时候想深入研究这个领域的时候却发现文献太多,不知如何选择。但实际上在每个领域都有那么三五篇抑或更多是非读不可的经典文献。这些文献除了提出了很经典的算法,同时他们的Introduction和Related work也是对所在的领域很好的总结。读通了这几篇文献也就等于深入了解了这个领域,比单纯的看书收获要多很多。写本文的目的就是想把自己所了解到的各个领域的经典文章整理出来,不用迷失在参考文献的汪洋大海里。2. 图像处理和计算机视觉的分类按照当前流行的分类方法,可以分为以下三部分:
A.图像处理:对输入的图像做某种变换,输出仍然是图像,基本不涉及或者很少涉及图像内容的分析。比较典型的有图像变换,图像增强,图像去噪,图像压缩,图像恢复,二值图像处理等等。基于阈值的图像分割也属于图像处理的范畴。一般处理的是单幅图像。
B.图像分析:对图像的内容进行分析,提取有意义的特征,以便于后续的处理。处理的仍然是单幅图像。
C.计算机视觉:对图像分析得到的特征进行分析,提取场景的语义表示,让计算机具有人眼和人脑的能力。这时处理的是多幅图像或者序列图像,当然也包括部分单幅图像。
关于图像处理,图像分析和计算机视觉的划分并没有一个很统一的标准。一般的来说,图像处理的书籍总会或多或少的介绍一些图像分析和计算机视觉的知识,比如冈萨雷斯的数字图像处理。而计算机视觉的书籍基本上都会包括图像处理和图像分析,只是不会介绍的太详细。其实图像处理,图像分析和计算机视觉都可以纳入到计算机视觉的范畴:图像处理->低层视觉(low level vision),图像分析->中间层视觉(middle level vision),计算机视觉->高层视觉(high level vision)。这是一般的计算机视觉或者机器视觉的划分方法。在本文中,仍然按照传统的方法把这个领域划分为图像处理,图像分析和计算机视觉。3. 图像处理和计算机视觉开源库以及编程语言选择 目前在图像处理中有两种最重要的语言:c/c++和matlab。它们各有优点:c/c++比较适合大型的工程,效率较高,而且容易转成硬件语言,是工业界的默认语言之一。而matlab实现起来比较方便,适用于算法的快速验证,而且matlab有成熟的工具箱可以使用,比如图像处理工具箱,信号处理工具箱。它们有一个共同的特点:开源的资源非常多。在学术界matlab使用的非常多,很多作者给出的源代码都是matlab版本。最近由于OpenCV的兴起和不断完善,c/c++在图像处理中的作用越来越大。总的来说,c/c++和matlab都必须掌握,最好是精通,当然侧重在c/c++上对找工作会有很大帮助。计算机视觉/图像算法/模式识别 工程师们使用的主流编程语言 1) 重中之重:编程语言之C/C++公司面试除了考查应聘者的图像处理基础知识、思维逻辑和个人品性之外,在个人能力之中最重要的一条就是C/C 的功底,很多学生朋友们在学校求学阶段并不重视C/C++的学习,导致找工作时处处碰壁(不过对于来参加面试的朋友,如果有较强的逻辑思维或图像理论功底,即使C/C++ 功底弱些,企业还是会偏爱的,毕竟C/C++ 只是一个工具,只要给些时间去钻研还是可以调高的,但是逻辑思维能力和图像理论功底却不是短时期就能提高的。不过一般逻辑思维和图像理论比较强的人,其C/C 水平也是不错的)。 为啥要这么重视C/C++ 呢?答案很简单,与绝大多数其它开发语言相比:C/C++ 的应用领域无法被超越、程序运行效率无法匹敌(当然汇编语言除外),是使用人数最多、跨平台最广的语言工具(适用于windows/linux/dsp/arm/单片机,当然还有其它一些平台)。简单的说,对于多数应用,其它语言能做的事情C/C++ 几乎都能做,其它语言不能做的事情C/C++ 也可以做。 2) 辅助工具之:MATLAB百度百科中是这么说的:“MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。” MATLAB本身是一个不错的仿真、建模工具,但不适用于应用级项目的开发,原因很简单:效率与C/C++ 无法匹敌、不夸平台。(虽然后来出来了codegen可以将MATLAB部分代码转换为C++,但自动生成的还是无法与我们自己写的并优化的C++代码相比;还有MATLAB 的mex接口能够将C++与MABLAB接口对接,既然使用了MATLAB编程,那在应用级的领域还是无法与纯C++相比) 简短说说多年前做学生时的部分学习经历:记得多年前上大学阶段大嘴起初只跟着学校的课程学习了MATLAB的图像处理相关模块(后来才学的C/C++ ),一开始觉得很兴奋,因为只需要编写很少量的代码就可以实现很强大的效果。后来大嘴进一家计算机视觉类的公司实习,发现公司主要用的是C/C++ ,因为MATLAB效率比起C/C++ 相差几倍、十几倍、甚至几十倍,而且要命的是不跨平台,只能用于windows上,后来逼的自己去学了C/C++ ,也正因如此那以后一直到现在特别是当初找工作的时候让我受益匪浅。 对于企业,特别是私企,公司除非给你充足的时间先使用MATLAB做完算法功能,然后再用C/C++ 慢慢改写,而且了解的朋友们都知道,MATLAB的精度与封装的函数标准与C/C++ 有很多不一样,改写起来相对麻烦一些,这样太慢太慢太慢了,项目不等人啊。试问人家成手能够用短时间写出C/C++ 做图像算法并马上可以投入应用,而自己却在那边慢慢磨MATLAB,然后再费老大劲改成纯C(比如需要警觉MATLAB与C++精度不一样的问题、图像处理基础函数标准不一样的问题),那么老板会比较喜欢谁呢? 如果大家从最初就使用C/C++ ,虽然一开始不数量会写的很慢,但是随着知识量和自各种库(比如图像处理库)的积累,那么总有一天开发速度会快起来的,量的积累,质的飞跃。 说了不少,本人并不否认MATLAB,MATLAB做为建模、仿真以及一些验证的工作(比如图形分析和处理、图表显示、图像仿真、语音仿真等)还是不错的,这方面大嘴绝对力挺MATLAB,目前本人也还在使用中。 一句话:对于多数普通人来讲,如果你的目标是想进企业做为一个实力派工程师,那么大嘴建议您以C/C++ 为主、MATLAB为辅助工具做开发。 3) 辅助工具之:OPENCV随着opencv的问世,图像算法/计算机视觉/模式识别行业的门槛儿变低了,原因有以下几点:(1)opencv是以C/C ++为基础开发出来的,适用性强,windows下适用opencv开发的图像算法应用效率足够快(2)封装了很多基础图像处理函数和视觉算法,可谓“拿来即可用”。 (3)与嵌入式接口的统一趋势,如前几年大牛们人物搞出来的EMCV(基于C/C++ ),其基础架构和接口与opencv基本一致,但个人认为EMCV很多函数功能尚不完善,目前暂时无法与opencv相比。今后很多人在windows下基于opencv开发后,可以较为轻松的移植到DSP上,这种开发模式会是一种趋势。 说了opencv几条优点,但本人并不赞同只依赖opencv做开发,无论是图像算法行业还是其它很多行业,最重要的不是用什么工具,而是自己的基础知识和逻辑思维方式,opencv封装了很多基础函数,如果朋友们未搞懂其基础原理便加以使用,这种方式并不利于锻炼自己,抽空自己实现一下opencv和MATLAB的封装好的那些基础函数吧,久而久之,你会发现自己站的高度会越来越高的。说到这里,改写一下评述MATLAB时的一句话:”对于多数普通人来讲,如果你的目标是想进企业做为一个实力派工程师,那么大嘴建议您以C/C ++为主、OPENCV和MATLAB为辅助工具做开发。” 4) 简单说说其它语言其它开发语言,比如:C#,JAVA等(还有很多很多语言,不一一举例了)都是不错的开发语言,各自有各自的主应用领域和优势,也有很多很多牛人在使用,不过做图像处理嘛,如果不偏向企业级应用(如嵌入式中),虽然也可以用,但是了解的朋友做出来的算法效率实在不敢恭维…,又无法夸平台,在一些不要求效率的场合还是可以用的,所以请学生朋友们慎重选择开发语言,因为这与自己以后的择业以及职位方向有很大关系。 4. 本文的特点和结构,以及适合的对象 在本文面向的对象是即将进入或者刚刚进入图像处理和计算机视觉领域的童鞋,可以在阅读书籍的同时参阅这些文献,能对书中提到的算法有比较深刻的理解。由于本文涉及到的范围比较广,如果能对计算机视觉的资深从业者也有一定的帮助,我将倍感欣慰。为了不至太误人子弟,每一篇文章都或多或少的看了一下,最不济也看了摘要(这句话实在整理之前写的,实际上由于精力有限,好多文献都只是大概扫了一眼,然后看了看google的引用数,一般在1000以上就放上来了,把这些文章细细品味一遍也是我近一两年之内的目标)。在成文的过程中,我本人也受益匪浅,希望能对大家也有所帮助。 由于个人精力和视野的关系,有一些我未涉足过的领域不敢斗胆推荐,只是列出了一些引用率比较高的文章,比如摄像机标定和立体视觉。不过将来,由于工作或者其他原因,这些领域也会接触到,我会逐步增减这些领域的文章。尽管如此,仍然会有疏漏,忘见谅。同时文章的挑选也夹带了一些个人的喜好,比如我个人比较喜欢low level方向的,尤其是IJCV和PAMI上面的文章,因此这方面也稍微多点,希望不要引起您的反感。如果有什么意见或者建议,欢迎mail我。文章和资源我都会在我的csdn blog和sina ishare同步更新。 本文的安排如下。第一部分是绪论。第二部分是图像处理中所需要用到的理论基础,主要是这个领域所涉及到的一些比较好的参考书籍。第三部分是计算机视觉中所涉及到的信号处理和模式识别文章。由于图像处理与图像分析太难区分了,第四部分集中讨论了它们。第五部分是计算机视觉部分。最后是小结。 二、 图像处理与计算机视觉相关的书籍1. 数学 我们所说的图像处理实际上就是数字图像处理,是把真实世界中的连续三维随机信号投影到传感器的二维平面上,采样并量化后得到二维矩阵。数字图像处理就是二维矩阵的处理,而从二维图像中恢复出三维场景就是计算机视觉的主要任务之一。这里面就涉及到了图像处理所涉及到的三个重要属性:连续性,二维矩阵,随机性。所对应的数学知识是高等数学(微积分),线性代数(矩阵论),概率论和随机过程。这三门课也是考研数学的三个组成部分,构成了图像处理和计算机视觉最基础的数学基础。如果想要更进一步,就要到网上搜搜林达华推荐的数学书目了。
2. 信号处理 图像处理其实就是二维和三维信号处理,而处理的信号又有一定的随机性,因此经典信号处理和随机信号处理都是图像处理和计算机视觉中必备的理论基础。
2.1经典信号处理信号与系统(第2版) Alan V.Oppenheim等著 刘树棠译离散时间信号处理(第2版) A.V.奥本海姆等著 刘树棠译数字信号处理:理论算法与实现 胡广书 (编者)2.2随机信号处理现代信号处理 张贤达著统计信号处理基础:估计与检测理论 Steven M.Kay等著 罗鹏飞等译自适应滤波器原理(第4版) Simon Haykin著 郑宝玉等译2.3 小波变换信号处理的小波导引:稀疏方法(原书第3版) tephane Malla著, 戴道清等译2.4 信息论信息论基础(原书第2版) Thomas M.Cover等著 阮吉寿等译3. 模式识别Pattern Recognition and Machine Learning Bishop, Christopher M. Springer模式识别(英文版)(第4版) 西奥多里德斯著Pattern Classification (2nd Edition) Richard O. Duda等著Statistical Pattern Recognition, 3rd Edition Andrew R. Webb等著模式识别(第3版) 张学工著4. 图像处理与计算机视觉的书籍推荐图像处理,分析与机器视觉 第三版 Sonka等著 艾海舟等译Image Processing, Analysis and Machine Vision (附:这本书是图像处理与计算机视觉里面比较全的一本书了,几乎涵盖了图像视觉领域的各个方面。中文版的个人感觉也还可以,值得一看。) 数字图像处理 第三版 冈萨雷斯等著Digital Image Processing(附:数字图像处理永远的经典,现在已经出到了第三版,相当给力。我的导师曾经说过,这本书写的很优美,对写英文论文也很有帮助,建议购买英文版的。) 计算机视觉:理论与算法 Richard Szeliski著Computer Vision: Theory and Algorithm (附:微软的Szeliski写的一本最新的计算机视觉著作。内容非常丰富,尤其包括了作者的研究兴趣,比如一般的书里面都没有的Image Stitching和 Image Matting等。这也从另一个侧面说明这本书的通用性不如Sonka的那本。不过作者开放了这本书的电子版,可以有选择性的阅读。
计算机视觉:一种现代方法 DA Forsyth等著Computer Vision: A Modern ApproachMIT的经典教材。虽然已经过去十年了,还是值得一读。期待第二版 Machine vision: theory, algorithms, practicalities 第三版 Davies著(附:为数不多的英国人写的书,偏向于工业应用。)数字图像处理 第四版 Pratt著Digital Image Processing(附:写作风格独树一帜,也是图像处理领域很不错的一本书。网上也可以找到非常清晰的电子版。) 5. 小结罗嗦了这么多,实际上就是几个建议:
(1)基础书千万不可以扔,也不能低价处理给同学或者师弟师妹。不然到时候还得一本本从书店再买回来的。钱是一方面的问题,对着全新的书看完全没有看自己当年上过的课本有感觉。
(2)遇到有相关的课,果断选修或者蹭之,比如随机过程,小波分析,模式识别,机器学习,数据挖掘,现代信号处理甚至泛函。多一些理论积累对将来科研和工作都有好处。
(3)资金允许的话可以多囤一些经典的书,有的时候从牙缝里面省一点都可以买一本好书。不过千万不要像我一样只囤不看。 三、 计算机视觉中的信号处理与模式识别 从本章开始,进入本文的核心章节。一共分三章,分别讲述信号处理与模式识别,图像处理与分析以及计算机视觉。与其说是讲述,不如说是一些经典文章的罗列以及自己的简单点评。与前一个版本不同的是,这次把所有的文章按类别归了类,并且增加了很多文献。分类的时候并没有按照传统的分类方法,而是划分成了一个个小的门类,比如SIFT,Harris都作为了单独的一类,虽然它们都可以划分到特征提取里面去。这样做的目的是希望能突出这些比较实用且比较流行的方法。为了以后维护的方便,按照字母顺序排的序。