实践的意义——写给图像处理算法爱好者的建议

陆放翁诗云:“纸上得来终觉浅,绝知此事要躬行”,此乃亘古不变之真理也。


图像处理研究的一个很大特点就在于,它是一种和实际应用紧密联系的实用型学科。所有的算法都是针对实际中遇到的问题而存在的。无论是我们新提出了一个算法,还是我们新学习了一个算法,都可以直接写一个程序来检验它的处理效果。而且这种“效果”往往还是一目了然的。因为图像处理的输入和输出都是图像,图像就是用来给人看的。这种直观性是其它研究领域所很难具备的。例如,当年何恺明博士向CVPR提交其关于图像去雾算法的论文时,审稿人就很惊讶于这么简单的方法居然有这么意外的效果。于是其中就有好奇的审稿人直接动手编程实现了他的算法。正所谓,是骡子是马,拉出来溜溜。他算法的效果最终征服了审稿人,也征服了大会的评委会,最终那届的最佳论文奖就首次颁给了来自亚洲的研究者。


而之于正在学习或研究图像算法的同学而言,动手实践的意义就更大了。不要以为你听老师或别人讲了一些算法,或者自己看看冈萨雷斯书上的描述,就觉得自己好像已经get了什么。除非你真的自己能把程序写出了,否则其实你什么都没懂,最多也就是似懂非懂。这一点我最有发言权。很多算法我感觉我也学得不错,但其实我在写Magic House的时候仍然花了很多时间去调试,因为在写的过程中,其实问题是层出不穷的。例如,我在写图像傅立叶逆变换的时候,我感觉这个算法我已经理解的很到位了,但是做逆变换的时候就是得不到原图,而是一篇黑。问题到底出在哪里我其实断断续续想了挺长时间。有一天突然开窍了,因为傅立叶变换的结果存在文件里,其实只是保存了实数的部分,虚数部分根本就没存。因为你在屏幕上看傅立叶变换结果图的时候,看到的也只是实数部分。尽管你可能遇到的问题跟我不一样,但遇到这样或那样的问题总是肯定的。我总结了自己锻炼编写图像处理代码的几个原因:


1)一方面你会发现过去你的理解可能是有偏差的,因为按照你那个想法去实现的代码效果可能并不理想,那问题出在哪里就很值得你思索;

2)另一方面,你自己在实现的过程中很可能发现原作者算法的不足(比如我在实现暗通道算法时就发现这个算法处理大面积的天空时会有问题),然后你进一步研究的方向就来了!这在我看来似乎是发paper最容易的方法。

3)我不得不告诉你,很多paper是会骗人的!中国有学术腐败,国外也有学术造假。洛必达把他老师伯努利教给他的方法写进了自己的书里,于是便有了今天你所学到的洛必达法则。从这个角度来看,18世纪的欧洲就已经有学术腐败了。有些作者paper里的效果很可能是PS过的,所以你按照他的方法,无论怎么做也不可能得到他的效果,这一点如果你不试试,就很可能被骗。

4)写代码本身就是一项本领或者基本功。你将来还很有可能要靠他生存。曲不离口、拳不离手。你现在不好好练,将来很可能作茧自缚。


说到这里我就不禁要提一句。懒惰既是推动人类创新的两大动力之一,但也可能是害得你“啥都不会,只会坐等靠要”、最终一事无成的毒草就像中国过去搞扶贫只会一味的输血,本来还有二亩薄田可以耕种,现在政府有救济款,索性连田也懒得种了,结果导致某些地方越扶越贫。现在很多人在网上一张嘴就是“有没有源代码下载”?或者买书看书也是挑那种“带光盘的”或者满篇满篇就只有代码的。抄来的过程当然轻松,但是知识、技术学会了是自己的,抄来的东西始终是别人的。不是说网上的代码、资源不可以参考,但是你绝对不应该对此产生依赖心理,人还是应该靠自己。如果你写不出来,只能说明你还没真正学会,学懂。何况真正有技术含量的东西,你永远也抄不来。两弹一星我们也曾想让苏联帮忙,但人家凭啥给你?结果怎么样,还不得靠中国人自己吗?要知道,这个技术积累的过程本身也很重要。


说道实践编程,你要么用C/C++,要么用Matlab,可能还有其他小众的(比如我有时也用R做图像处理),但大体上总逃不过这两大阵营。有人说他用Java或者Python, Anyway这其实并不重要。我的讨论还是以C/C++和Matlab为主体来讲。Matlab当然比较好用,什么卷积、直方图、高斯滤波,一个函数搞定!C/C++如果结合OpenCV基本可以达到同样的效果。当这绝对是后话。如果你是初学,最好踏踏实实一点一滴把最基本的图像处理算法实现一下。千里之行,始于足下。九层之台,起于累土。因为建立一个完整的体系思维和拥有一个扎实的基础特别重要。一些看似高大上的算法都是在这些不起眼的算法的堆砌组合下实现的。比如SIFT特征构建时,你会遇到直方图、高斯滤波和图像金字塔这些非常基础的原件。当你看到这些东西的时候,你就应该有马上觉悟到它们的各种特性和作用的能力。这对于你理解SIFT很有帮助。如果你具备了这种素质,详细我,你再在matlab里调那些函数来写SIFT就非常容易。如果说你学了一遍SIFT,但是还是写不出来,结论就是因为最基本的高斯、金字塔、直方图你也没自己写过。跳过了锻炼基础的阶段,直接来高大上的东西,比如会无福消受。就像《天龙八部》里的番僧鸠摩智为了速成,不惜用道教的小无相功来催动少林72绝技,结果走后入魔,前功尽废。前两天有网友给我博客留言:“如果只是把现成的算法实现一遍那也没什么意思,原创算法的话就有技术含量了。”我当时觉得可能这位网友水平比较高,看我这些雕虫小技自然不能入法眼。但我这两天又在想抛开大家水平高低不谈,这句话到底对不对?我发现,这个说法还是有漏洞。你小学时候每天语文课上学了十个新汉字,老师就让你在方格本上每个抄10遍,这种事当然没意思了,但是大家不都是这么没意思过来的吗?如果不这样,你怎么能在高考的时候40分钟写一篇800字命题作文呢?可见没意思的事情未必没意义!


最后,用荀老夫子的一句话同大家共勉:无冥冥之志者,无昭昭之明,无昏昏之事者,无赫赫之功

你可能感兴趣的:(学习方法,图像处理)