實踐的意義——寫給圖像處理算法愛好者的建議
陸放翁詩云:“紙上得來終覺淺,絕知此事要躬行”,此乃亙古不變之真理也。
本文引用地址:http://2s4d.com/article/201702/344240.htm圖像處理研究的一個很大特點就在于,它是一種和實際應用緊密聯(lián)系的實用型學科。所有的算法都是針對實際中遇到的問題而存在的。無論是我們新提出了一個算法,還是我們新學習了一個算法,都可以直接寫一個程序來檢驗它的處理效果。而且這種“效果”往往還是一目了然的。因為圖像處理的輸入和輸出都是圖像,圖像就是用來給人看的。這種直觀性是其它研究領域所很難具備的。例如,當年何愷明博士向CVPR提交其關于圖像去霧算法的論文時,審稿人就很驚訝于這么簡單的方法居然有這么意外的效果。于是其中就有好奇的審稿人直接動手編程實現(xiàn)了他的算法。正所謂,是騾子是馬,拉出來溜溜。他算法的效果最終征服了審稿人,也征服了大會的評委會,最終那屆的最佳論文獎就首次頒給了來自亞洲的研究者。
而之于正在學習或研究圖像算法的同學而言,動手實踐的意義就更大了。不要以為你聽老師或別人講了一些算法,或者自己看看岡薩雷斯書上的描述,就覺得自己好像已經get了什么。除非你真的自己能把程序寫出了,否則其實你什么都沒懂,最多也就是似懂非懂。這一點我最有發(fā)言權。很多算法我感覺我也學得不錯,但其實我在寫Magic House的時候仍然花了很多時間去調試,因為在寫的過程中,其實問題是層出不窮的。例如,我在寫圖像傅立葉逆變換的時候,我感覺這個算法我已經理解的很到位了,但是做逆變換的時候就是得不到原圖,而是一片黑。問題到底出在哪里我其實斷斷續(xù)續(xù)想了挺長時間。有一天突然開竅了,因為傅立葉變換的結果存在文件里,其實只是保存了實數(shù)的部分,虛數(shù)部分根本就沒存。因為你在屏幕上看傅立葉變換結果圖的時候,看到的也只是實數(shù)部分。盡管你可能遇到的問題跟我不一樣,但遇到這樣或那樣的問題總是肯定的。我總結了自己鍛煉編寫圖像處理代碼的幾個原因:
1)一方面你會發(fā)現(xiàn)過去你的理解可能是有偏差的,因為按照你那個想法去實現(xiàn)的代碼效果可能并不理想,那問題出在哪里就很值得你思索;
2)另一方面,你自己在實現(xiàn)的過程中很可能發(fā)現(xiàn)原作者算法的不足(比如我在實現(xiàn)暗通道算法時就發(fā)現(xiàn)這個算法處理大面積的天空時會有問題),然后你進一步研究的方向就來了!這在我看來似乎是發(fā)paper最容易的方法。
3)我不得不告訴你,很多paper是會騙人的!中國有學術腐敗,國外也有學術造假。洛必達把他老師伯努利教給他的方法寫進了自己的書里,于是便有了今天你所學到的洛必達法則。從這個角度來看,18世紀的歐洲就已經有學術腐敗了。有些作者paper里的效果很可能是PS過的,所以你按照他的方法,無論怎么做也不可能得到他的效果,這一點如果你不試試,就很可能被騙。
4)寫代碼本身就是一項本領或者基本功。你將來還很有可能要靠他生存。曲不離口、拳不離手。你現(xiàn)在不好好練,將來很可能作繭自縛。
說到這里我就不禁要提一句。懶惰既是推動人類創(chuàng)新的兩大動力之一,但也可能是害得你“啥都不會,只會坐等靠要”、最終一事無成的毒草。就像中國過去搞扶貧只會一味的輸血,本來還有二畝薄田可以耕種,現(xiàn)在政府有救濟款,索性連田也懶得種了,結果導致某些地方越扶越貧。現(xiàn)在很多人在網上一張嘴就是“有沒有源代碼下載”?或者買書看書也是挑那種“帶光盤的”或者滿篇滿篇就只有代碼的。抄來的過程當然輕松,但是知識、技術學會了是自己的,抄來的東西始終是別人的。不是說網上的代碼、資源不可以參考,但是你絕對不應該對此產生依賴心理,人還是應該靠自己。如果你寫不出來,只能說明你還沒真正學會,學懂。何況真正有技術含量的東西,你永遠也抄不來。兩彈一星我們也曾想讓蘇聯(lián)幫忙,但人家憑啥給你?結果怎么樣,還不得靠中國人自己嗎?要知道,這個技術積累的過程本身也很重要。
說道實踐編程,你要么用C/C++,要么用Matlab,可能還有其他小眾的(比如我有時也用R做圖像處理),但大體上總逃不過這兩大陣營。有人說他用Java或者Python, Anyway這其實并不重要。我的討論還是以C/C++和Matlab為主體來講。Matlab當然比較好用,什么卷積、直方圖、高斯濾波,一個函數(shù)搞定!C/C++如果結合OpenCV基本可以達到同樣的效果。當這絕對是后話。如果你是初學,最好能踏踏實實一點一滴把最基本的圖像處理算法實現(xiàn)一下。千里之行,始于足下。九層之臺,起于累土。因為建立一個完整的體系思維和擁有一個扎實的基礎特別重要。一些看似高大上的算法都是在這些不起眼的算法的堆砌組合下實現(xiàn)的。比如SIFT特征構建時,你會遇到直方圖、高斯濾波和圖像金字塔這些非常基礎的原件。當你看到這些東西的時候,你就應該有馬上覺悟到它們的各種特性和作用的能力。這對于你理解SIFT很有幫助。如果你具備了這種素質,詳細我,你再在matlab里調那些函數(shù)來寫SIFT就非常容易。如果說你學了一遍SIFT,但是還是寫不出來,結論就是因為最基本的高斯、金字塔、直方圖你也沒自己寫過。跳過了鍛煉基礎的階段,直接來高大上的東西,比如會無福消受。就像《天龍八部》里的番僧鳩摩智為了速成,不惜用道教的小無相功來催動少林72絕技,結果走后入魔,前功盡廢。前兩天有網友給我博客留言:“如果只是把現(xiàn)成的算法實現(xiàn)一遍那也沒什么意思,原創(chuàng)算法的話就有技術含量了?!蔽耶敃r覺得可能這位網友水平比較高,看我這些雕蟲小技自然不能入法眼。但我這兩天又在想拋開大家水平高低不談,這句話到底對不對?我發(fā)現(xiàn),這個說法還是有漏洞。你小學時候每天語文課上學了十個新漢字,老師就讓你在方格本上每個抄10遍,這種事當然沒意思了,但是大家不都是這么沒意思過來的嗎?如果不這樣,你怎么能在高考的時候40分鐘寫一篇800字命題作文呢?可見沒意思的事情未必沒意義!
最后,用荀老夫子的一句話同大家共勉:無冥冥之志者,無昭昭之明,無昏昏之事者,無赫赫之功。
評論