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


图像处理研究的一个非常大特点就在于。它是一种和实际应用紧密联系的有用型学科。全部的算法都是针对实际中遇到的问题而存在的。

不管是我们新提出了一个算法,还是我们新学习了一个算法,都能够直接写一个程序来检验它的处理效果。

并且这样的“效果”往往还是一目了然的。

由于图像处理的输入和输出都是图像,图像就是用来给人看的。这样的直观性是其他研究领域所非常难具备的。比如。当年何恺明博士向CVPR提交其关于图像去雾算法的论文时。审稿人就非常吃惊于这么简单的方法竟然有这么意外的效果。于是当中就有好奇的审稿人直接动手编程实现了他的算法。正所谓,是骡子是马,拉出来溜溜。他算法的效果终于征服了审稿人,也征服了大会的评委会。终于那届的最佳论文奖就首次颁给了来自亚洲的研究者。


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

虽然你可能遇到的问题跟我不一样,但遇到这样或那样的问题总是肯定的。我总结了自己锻炼编写图像处理代码的几个原因:


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

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

3)我不得不告诉你,非常多paper是会骗人的!

中国有学术腐败,国外也有学术造假。洛必达把他老师伯努利教给他的方法写进了自己的书里。于是便有了今天你所学到的洛必达法则。从这个角度来看。18世纪的欧洲就已经有学术腐败了。

有些作者paper里的效果非常可能是PS过的,所以你依照他的方法,不管怎么做也不可能得到他的效果,这一点假设你不试试,就非常可能被骗。

4)写代码本身就是一项本领或者基本功。

你将来还非常有可能要靠他生存。

曲不离口、拳不离手。你如今不好好练,将来非常可能作茧自缚。


讲到这里我就不禁要提一句。懒惰既是推动人类创新的两大动力之中的一个,但也可能是害得你“啥都不会。仅仅会坐等靠要”、终于一事无成的毒草就像中国过去搞扶贫仅仅会一味的输血,本来还有二亩薄田能够耕种,如今政府有救济款,索性连田也懒得种了,结果导致某些地方越扶越贫。如今非常多人在网上一张嘴就是“有没有源码下载”?或者买书看书也是挑那种“带光盘的”或者满篇满篇就仅仅有代码的。

抄来的过程当然轻松,可是知识、技术学会了是自己的,抄来的东西始终是别人的。不是说网上的代码、资源不能够參考。可是你绝对不应该对此产生依赖心理。人还是应该靠自己。假设你写不出来。仅仅能说明你还没真正学会,学懂。何况真正有技术含量的东西,你永远也抄不来。两弹一星我们也曾想让苏联帮忙,但人家凭啥给你?结果怎么样,还不得靠中国人自己吗?要知道,这个技术积累的过程本身也非常重要。


说道实践编程。你要么用C/C++,要么用Matlab。可能还有其他小众的(比方我有时也用R做图像处理)。但大体上总逃只是这两大阵营。有人说他用Java或者Python。 Anyway这事实上并不重要。

我的讨论还是以C/C++和Matlab为主体来讲。

Matlab当然比較好用,什么卷积、直方图、高斯滤波。一个函数搞定!C/C++假设结合OpenCV基本能够达到相同的效果。

当这绝对是后话。假设你是初学。最好踏踏实实一点一滴把最主要的图像处理算法实现一下。千里之行。始于足下。九层之台。起于累土。由于建立一个完整的体系思维和拥有一个扎实的基础特别重要。一些看似高大上的算法都是在这些不起眼的算法的堆砌组合下实现的。比方SIFT特征构建时,你会遇到直方图、高斯滤波和图像金字塔这些非常基础的原件。

当你看到这些东西的时候,你就应该有立即觉悟到它们的各种特性和作用的能力。这对于你理解SIFT非常有帮助。假设你具备了这样的素养,具体我。你再在matlab里调那些函数来写SIFT就非常easy。假设说你学了一遍SIFT,可是还是写不出来,结论就是由于最主要的高斯、金字塔、直方图你也没自己写过。

跳过了锻炼基础的阶段。直接来高大上的东西,比方会无福消受。

就像《天龙八部》里的番僧鸠摩智为了速成,不惜用道教的小无相功来催动少林72绝技,结果走后入魔,前功尽废。前两天有网友给我博客留言:“假设仅仅是把现成的算法实现一遍那也没什么意思,原创算法的话就有技术含量了。”我当时认为可能这位网友水平比較高。看我这些雕虫小技自然不能入法眼。但我这两天又在想抛开大家水平高低不谈,这句话究竟对不正确?我发现。这个说法还是有漏洞。你小学时候每天语文课上学了十个新汉字。老师就让你在方格本上每一个抄10遍。这样的事当然没意思了,可是大家不都是这么没意思过来的吗?假设不这样。你怎么能在高考的时候40分钟写一篇800字命题作文呢?可见没意思的事情未必没意义。


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