? ? 現(xiàn)在,圖像類信息越來越多了,對圖像的編程需求也越來越多。圖像類項目的特點是性價比高,單行代碼的價格一般是普通的程序的10倍,每行代碼能夠賣幾塊錢。很多人把目光放在這個上面。剛才又有網友咨詢,做圖像要看些什么書?結合我的自學經驗,寫一篇博客談談這個問題。
需要先明確幾個問題:
(1)你的基礎如何?做圖形圖像的話,對數(shù)學要求比較高,至少要有大學數(shù)學的基礎——微積分、線性代數(shù)、概率統(tǒng)計和數(shù)值分析都會用到的。不然,書看不下去,沒法自學。如果要做深入的話,對英語也有一定的要求,絕大部分深入的資料都是英文的。
(2)做哪個層面的?與硬件嚴重相關的只能選C,做應用層的話可以選C++和C#,我個人推薦C#,當然,智能手機還是推薦C++。做Web層面的話,目前最佳選擇是Flash(其實Silverlight比Flash更適合做Web圖像,好歹Silverlight有byte類型,有struct,但Silverlight的普及度不夠),Html5/Canvas目前只能做簡單的應用,復雜的還不行。如果只是做算法,matlab就夠了,但一般不是科班出生,很少做純算法的。做純算法還有個缺點就是,算法轉換為收入很難。鑒于C#寫算法并不比用matlab寫算法慢,不建議摸matlab。但matlab代碼要能看懂,因為論文中很多算法是用matlab寫的。
(3)有沒有克服困難的勇氣。圖像類項目大多不大,普遍的幾千行代碼就可以搞定。就這幾千行代碼,難度越大的錢越多。關鍵詞就是困難和難度,工作量往往不是問題。也就是說,你越牛逼,越值錢。牛逼是沒有止境的,不像那些靠體力的項目,身體是個硬的限制。
下面的書籍,如果是寫的英文名字,那就是推薦閱讀英文版,如果是中文名字,那就說明,中文版寫的/翻譯的也不錯,推薦看中文版而非英文版。都是可以直接下載到的或買到的。
首先是兩本核心書籍:
(1)Image Processing,Analysis and Machine Vision 3ED。(中文名:《圖像處理、分析與機器視覺》)
(2)Computer Vision:
Algorithms and Application(中文名:《計算機視覺——算法與應用》)
第一本書偏重于基礎,但是它寫的可不基礎。寫的很簡且信息量極大,但核心概念都講了,重點算法大部分都列出來了。第二本書偏重于工程應用,概述了各個領域的有效算法,點到為止。
如果看第二本沒困難的話,可以忽略掉第一本。第一本書也不好讀,一上來就講了狄拉克分布,因此,要想從頭到尾都看懂是幾乎不可能的,但是它的內容的前后依存性不大,看不懂的直接略過去就行了,只看能看懂的即可。
沒必要看完,我也只看了30-40%感興趣的部分,其它的要么是不感興趣的,要么是看不懂的。
只需要大學數(shù)學基礎就可以開始看,能看懂部分就可以做項目了。找到和項目相關的內容,找到相應的參考文獻,直接去看論文實現(xiàn)論文的算法即可。絕大部分重要論文Google
Scholar都能搜到原文,如果英文水平不夠,也可以在幾個期刊網搜中文的論文,不是特別前沿的東西,中文的論文也有涉及到的。
看書的重點是理解,理解算法最佳方式是自己把算法寫一遍。可以參考OpenCV的代碼來寫。理解一個算法之后,這個算法就可以為你賺錢,不理解,是很難用對算法的。自己寫算法。你才對這個算法的性能有直觀的感受,知道可以通過哪些方式來改進它,知道怎么在性能和算法效果之間進行取舍,這對項目來說,是很重要的。
不建議買第二本書的中文版,它的中文版閹割了參考文獻和索引這兩個最有使用價值的部分。
把這兩本書全部看完吃透,單靠大學水平的數(shù)學是不夠的,至少得數(shù)學系本科生級別的知識儲備。如果大學數(shù)學忘了,建議先復習一遍。
自學推薦:
(1)陳天權版《數(shù)學分析(一、二、三)》。這是國內最難的一套數(shù)學分析教材,為什么推薦它呢?它自成條理,信息量豐富,把圖像分析深入所需的數(shù)學內容都包括進去了:微積分、點集拓撲、實分析、泛函、變分、復分析、流形……,重要概念都講了。學完了,看論文問題不大。缺點就是難。可是,圖像類項目的特點也是難。遇難而上是必須的。這套書雖難,但是思路極其清晰,就是看的慢一點而已。要知道,計算機所能發(fā)揮出的威力只是數(shù)學理論的一部分,隨著計算機的計算能力越來越強,越來越多的數(shù)學方法會引入到程序中來,對于圖像分析領域尤其如此。所以要未雨綢繆,別看有的數(shù)學知識現(xiàn)在用不上,說不定哪天就用到了。
(2)Lax的《線性代數(shù)及其應用》。作者是沃爾夫獎得主,寫的很簡潔明要,且不與大學學的線性代數(shù)重復。
(3)《Numerical Recipes》。數(shù)值分析有這一本書就夠了,秒殺眾書的書。這本書只看感興趣的或當前用到的即可。
鑒于圖形和圖像的關系越來越緊密,關于圖形學的書籍也是值得一讀的。推薦兩本:
(1)David F.Rogers的《計算機圖形學的算法基礎》。這本書實在是太經典了,就是有點老,比較基礎。
(2)《實時計算機圖形學》這本書講的都是比較現(xiàn)代的,正好結合上一本看。
圖像編程=算法+性能。因此,性能優(yōu)化方面也得看。比如這本:《軟件優(yōu)化技術--IA-32平臺的高性能手冊》。
會用Photoshop對圖像編程很重要。Photoshop有強大的編輯功能和特效庫,很多時候,可以用Photoshop先進行預研究,確定項目是否可行。可行的話,我們再把Photoshop的操作過程用算法來實現(xiàn),實際項目中,經常會這么操作的。Photoshop推薦一本書:李金明、李金榮的《Photoshop CS5完全自學教程》。這本書寫的非常棒,就是書名有點土,和那些垃圾書的書名很像。
如果用C/C++的話,推薦《學習OpenCV(中文版)》,翻譯的不錯。如果用C#的話,沒啥好書可以推薦,可以看看我博客中的文章。如果用Flash的話,推薦《Foundation ActionScript 3.0
Image Effects》。
如果做的是和彩圖有關的話,推薦《彩色數(shù)字圖像處理》。其它的,《圖像局部特征不變性特征與描述》寫的也不錯。
====
下面舉個例子講講工具、知識間的綜合應用。
要實現(xiàn)一個lemo特效,可以先利用現(xiàn)有工具得到像素之間的映射圖(比如我這篇文章:《解決問題的藝術:半小時編程實現(xiàn)照片的反轉負沖特效》)。但這樣一來,每種特效都需要一個像素映射圖,增大了程序的尺寸,怎么辦呢?
一種方法是用Photoshop模擬它,然后,寫圖像處理算法來重復這一過程。這是用圖像處理的方法來解決問題。
另一種方法是將lemo特效當作一多元函數(shù),特效前的圖像是輸入值,特效后的圖像是輸出值,先寫出一個自由度高點的函數(shù),再采用擬合的方法,找到合適的函數(shù)參數(shù),然后檢驗這個函數(shù)的穩(wěn)定性,靠譜的話就是它了。這是用數(shù)學的方法來解決問題。