从2002年到现在,接触图像快十年了。虽然没有做出什么很出色的工作,不过在这个领域摸爬滚打了十年之后,发现自己对图像处理和计算机视觉的感情越来越深厚。下班之后看看相关的书籍和文献是一件很惬意的事情。平常的一大业余爱好就是收集一些相关的文章,尤其是经典的文章,到现在我的电脑里面已经有了几十G的文章。写这个文档的想法源于我前一段时间整理文献时的一个突发奇想,既然有这个多文献,何不整理出其中的经典,共享给大家呢。于是当时即兴写了一个《图像处理与计算机视觉中的经典论文》。现在来看,那个文档写得及其拙劣,所共享的论文也非常之有限。就算如此,还是得到了一些网友的夸奖,心里感激不尽。因此,一直想下定决心把这个文章给完善,力求做到尽量全面。
本文是对现有的图像处理和计算机视觉的经典书籍(后面会有推荐)的一个补充。一般的图像处理书籍都是介绍性的介绍某个方法,在每个领域内都会引用几十上百篇参考文献。有时候想深入研究这个领域的时候却发现文献太多,不知如何选择。但实际上在每个领域都有那么三五篇抑或更多是非读不可的经典文献。这些文献除了提出了很经典的算法,同时他们的Introduction和Related work也是对所在的领域很好的总结。读通了这几篇文献也就等于深入了解了这个领域,比单纯的看书收获要多很多。写本文的目的就是想把自己所了解到的各个领域的经典文章整理出来,不用迷失在文献的汪洋大海里。
按照当前流行的分类方法,可以分为以下三部分:
图像处理:对输入的图像做某种变换,输出仍然是图像,基本不涉及或者很少涉及图像内容的分析。比较典型的有图像变换,图像增强,图像去噪,图像压缩,图像恢复,二值图像处理等等。基于阈值的图像分割也属于图像处理的范畴。一般处理的是单幅图像。
图像分析:对图像的内容进行分析,提取有意义的特征,以便于后续的处理。处理的仍然是单幅图像。
计算机视觉:对图像分析得到的特征进行分析,提取场景的语义表示,让计算机具有人眼和人脑的能力。这时处理的是多幅图像或者序列图像,当然也包括部分单幅图像。
关于图像处理,图像分析和计算机视觉的划分并没有一个很统一的标准。一般的来说,图像处理的书籍总会或多或少的介绍一些图像分析和计算机视觉的知识,比如冈萨雷斯的数字图像处理。而计算机视觉的书籍基本上都会包括图像处理和图像分析,只是不会介绍的太详细。其实图像处理,图像分析和计算机视觉都可以纳入到计算机视觉的范畴:图像处理->低层视觉(low level vision),图像分析->中间层视觉(middle level vision),计算机视觉->高层视觉(high level vision)。这是一般的计算机视觉或者机器视觉的划分方法。在本文中,仍然按照传统的方法把这个领域划分为图像处理,图像分析和计算机视觉。
目前在图像处理中有两种最重要的语言:c/c++和matlab。它们各有优点:c/c++比较适合大型的工程,效率较高,而且容易转成硬件语言,是工业界的默认语言之一。而matlab实现起来比较方便,适用于算法的快速验证,而且matlab有成熟的工具箱可以使用,比如图像处理工具箱,信号处理工具箱。它们有一个共同的特点:开源的资源非常多。在学术界matlab使用的非常多,很多作者给出的源代码都是matlab版本。最近由于OpenCV的兴起和不断完善,c/c++在图像处理中的作用越来越大。总的来说,c/c++和matlab都必须掌握,最好是精通,当然侧重在c/c++上对找工作会有很大帮助。
至于开源库,个人非常推荐OpenCV,主要有以下原因:
(1)简单易入手。opencv进入opencv2.x的时代后,使用起来越来越简单,接口越来越傻瓜化,越来越matlab化。只要会imread,imwrite,imshow和了解Mat的基本操作就可以开始入手了。
(2)Opencv有一堆图像处理和计算机视觉的大牛在维护,bug在逐步减少,每个新的版本都会带来不同的惊喜。而且它已经或者逐步在移植到不同的平台,并提供了对Python的很好的支持。
(3)在Opencv上可以尝试各种最新以及成熟的技术,而不需要自己从头去写,比如人脸检测(Harr,LBP),DPM(Latent SVM),高斯背景模型,特征检测,聚类,hough变换等等。而且它还支持各种机器学习方法(SVM,NN,KNN,决策树,Boosting等),使用起来很简单。
(4)文档内容丰富,并且给出了很多示例程序。当然也有一些地方文档描述不清楚,不过看看代码就很清楚了。
(5)完全开源。可以从中间抠出任何需要的算法。
(6)从学校出来后,除极少数会继续在学术圈里,大部分还是要进入工业界。现在在工业界,c/c++仍是主流,很多公司都会优先考虑熟悉或者精通opencv的。事实上,在学术界,现在opencv也大有取代matlab之势。以前的demo或者source code,很多作者都愿意给出matlab版本的,然后别人再呼哧呼哧改成c版本的。现在作者干脆给出c/c++版本,或者自己集成到opencv中去,这样能快速提升自己的影响力。
如果想在图像处理和计算机视觉界有比较深入的研究,并且以后打算进入这个领域工作的话,建议把OpenCV作为自己的主攻方向。如果找工作的时候敢号称自己精通OpenCV的话,肯定可以找到一份满意的工作。
本文面向的对象是即将进入或者刚刚进入图像处理和计算机视觉领域的童鞋,可以在阅读书籍的同时参阅这些文献,能对书中提到的算法有比较深刻的理解。由于本文涉及到的范围比较广,如果能对计算机视觉的资深从业者也有一定的帮助,我将倍感欣慰。为了不至太误人子弟,每一篇文章都或多或少的看了一下,最不济也看了摘要(这句话实在整理之前写的,实际上由于精力有限,好多文献都只是大概扫了一眼,然后看了看google的引用数,一般在1000以上就放上来了,把这些文章细细品味一遍也是我近一两年之内的目标)。在成文的过程中,我本人也受益匪浅,希望能对大家也有所帮助。
由于个人精力和视野的关系,有一些我未涉足过的领域不敢斗胆推荐,只是列出了一些引用率比较高的文章,比如摄像机标定和立体视觉。不过将来,由于工作或者其他原因,这些领域也会接触到,我会逐步增减这些领域的文章。同时文章的挑选也夹带了一些个人的喜好,比如我个人比较喜欢low level方向的,尤其是IJCV和PAMI上面的文章,因此这方面也稍微多点,希望不要引起您的反感。如果有什么意见或者建议,欢迎mail我。文章和资源我都会在我的csdn blog和sina ishare同步更新。在此申明:这些论文的版权归作者及其出版社所有,请勿用于商业目的。
个人blog:
http://blog.csdn.net/dcraw
新浪iask地址:
http://iask.sina.com.cn/u/2252291285/ish?folderid=868438
本文的安排如下。第一部分是绪论。第二部分是图像处理中所需要用到的理论基础,主要是这个领域所涉及到的一些比较好的参考书籍。第三部分是计算机视觉中所涉及到的信号处理和模式识别文章。由于图像处理与图像分析太难区分了,第四部分集中讨论了它们。第五部分是计算机视觉部分。最后是小结。