標籤:

圖像處理學習者應該了解的三個問題

本文所討論的圖像處理與Photoshop應用或者婚紗影樓中常用的那種P圖之類的話題無關,如果你是屬於Photoshop使用方面的圖像處理學習者,請你移步,本文所論之話題不屬於你所在的世界。

從學術研究上來說,數字圖像處理可能是很多高等院校中相關專業開設的一門課程,也可能是相關領域研究生、博士生的一個主要研究方向。所謂相關專業或者相關領域,其實很廣,主要可能包括(但不限於):計算機科學與技術、電子信息工程、應用數學、自動化、生物醫學工程……

從產業應用上來說,數字圖像處理可能出現在任何技術領域,例如:航空航天、資源勘探、森林防火、金屬冶煉、醫學診斷、機械製造、電影特效……如果說的離普通人再近一點,那麼具體的應用可能包括智能手機中的美顏功能、Photoshop軟體中的修圖功能等等,這些功能的背後隱藏的就是圖像處理中的各種演算法。

可見,圖像處理技術離我們非常近,應用非常廣。所以,很多人在學習它或者準備學習它。但是,很多人(特別是初學者)又會感到很困惑,因為它似乎並不太容易學習和掌握。他們最常糾結的問題,也是我最常被問到的關於圖像處理的問題,大大小小,我總結了一下,可能應該不外乎如下這三個。

下面,我們就來逐個解答。本文純屬個人觀點,VIEWER DISCRETION IS ADVISED !!!

第一、我應該選擇(或者使用、或者學習)什麼工具(或者編程語言、或者環境)呢?

很多人都糾結於此,但其實是一個偽命題。Anyway,為了幫助某些有選擇恐懼症的人做出抉擇,我還是把它列為第一個問題,來啰嗦幾句。

  1. 你的導師、你的老闆直接告訴你、命令你使用什麼工具來開發,要不然你所在團隊按照慣例,或者正在進行的項目已經確定採用什麼工具來開發,那麼你不要困惑、也沒必要掙扎,只要follow就行了。
  2. 假設上面一種情況不存在,你有完全的選擇權,那麼你可以選擇你擅長、你會的、甚至你覺得自己比較容易上手的工具或編程語言來做。
  3. 原則上來說,任何語言都能用來做圖像編程開發,java, vb, python, r, c++, matlab 等等等等。但是,學習圖像處理,你應該關心的是演算法,是原理。任何語言都是工具(類似武功裡面的招式),演算法才是靈魂(類似內功心法)。內功修為到了一定層次,折根樹枝也能當劍使。如果你總是把重點放在工具上,而不是原理上,那麼你可能最終也就只會個函數調用而已。如果這樣,那你不如直接去學習使用Photoshop好了,那個也叫圖像處理。
  4. 既然演算法和原理這麼重要,你可能會問那我只會演算法,不懂實現行不行?很不幸,這也不行。就像天龍八部里的王語嫣,雖然心裡裝著無數武功秘籍,但是自己一招也沒練過,實戰能力等於零。這個在圖像處理中是一個絕對的反面教材。圖像處理是與實際應用聯繫緊密的領域,光說不練假把式!何況如果你不能編程實現演算法,這種程度的理解恐怕也不能說真正懂得演算法吧。
  5. 最後,具體選擇什麼語言、什麼工具,其實跟你的具體需求、方向和目標有關。現在說語言或者工具,其實主要就是指MATLAB和C++(或者也可以帶上OpenCV),具體怎麼選擇,請參見我在另外一篇帖子里的回答:【白馬負金羈:做圖像處理的研究生除了要學習MATLAB外,還要學習什麼編程語言,利用什麼編程軟體?】

第二、學習數字圖像處理,是否需要有信號與系統、數字信號處理方面的基礎?

現在學校里上圖像處理課,往往會選擇岡薩雷斯的《數字圖像處理》來作為教材。岡薩雷斯的教材在國外是專門為EE專業的學生寫的,而且要求學生上圖像處理課之前已經修過信號與系統、數字信號處理這兩門課程。前面提到國內,電子信息專業的專業也會上圖像處理課,而信號與系統、數字信號處理恰恰是電子信息專業的基礎課。

如果你剛剛好是電子信息專業的人,或者學過信號與系統、數字信號處理,那麼讀岡薩雷斯的《數字圖像處理》時,應該對於傅里葉變換、小波變換、子帶編碼這些地方都覺得很容易。如果很不幸,你不是電子信息專業的人, 也沒學過學過信號與系統、數字信號處理,那麼這類人仍然分成了兩類。一類就是讀岡薩雷斯的《數字圖像處理》覺得很好,很簡單,很容易懂,或許這就是所謂的天賦異稟,或者冥冥中註定你和岡老先生有過神交。但是,如果很不幸,你不是這一類,也就是說對於頻域變換(傅里葉、離散餘弦、小波等等)這些信號處理的話題你感覺還是很吃力,那麼你才是真正要考慮自己是不是需要信號方面基礎的人。

我的意見是,有則更好,沒有也無不可。

有則更好,意味著,你確實可以自學一下信號處理,現在網上很多公開課都很不錯,跟一遍下來應該能學個七七八八。

沒有也無不可,意味著,不系統的完整的學習信號處理其實也無不可。理由有三:

  1. 信號與系統,數字信號處理,這個在學校里的安排一般是每學期學習一門,你不一定有那個時間。而且並不是所有這些基礎課里的東西在圖像處理中都能直接用到,例如信號中必學的Z變換在圖像中其實並不多見。所以如果你真的把這些所謂的基礎課全部重新補一遍,有可能其中的部分是無用功。
  2. 傅里葉老先生當年提出傅里葉級數等等概念的時候,信號處理這個東西還沒有誕生。也就是說不學信號的人要理解傅里葉變換也不是不可能。因為傅里葉就沒學過,難道傅里葉自己還不懂傅里葉變換嗎?就像我們上面講的,很多其他專業的人都在學習圖像處理,難道他們都要去重修信號課程嗎?要理解這些東西,你完全可以從純數學角度來解釋。就像微積分里的格林公式,你當然可以從電磁學的角度來理解,但是如果你沒學過電磁學(就像你大一學高數的時候那樣),你不是也學會格林公式了嗎?因為你完全可以從純數學的角度來解釋它、甚至證明它。
  3. 如果你沒有信號基礎,那麼在教程選擇時,要注意避免選擇」專門為EE專業或者電子信息專業「設計的教材或者課程。否則,就會總是感覺不得其法,最終導致自己疲於奔命卻事倍功半。

第三、學習圖像處理,但是看不懂數學公式怎麼辦?或者,圖像處理需要很深的數學背景嗎?

通常,我們說的理工科專業大學中必然學過微積分(也稱高數)、概率論(有時含數理統計)和線性代數。但是問題可能是:

  1. 你當初學的就比較糟糕,現在已經基本都還給老師了;
  2. 當初學得不錯(或許都能考到80+),但是工作了幾年,因為平常不用,現在也基本清零了。

通常,非特定領域的碼農、軟開,確實都不需要用到什麼真正的數學。如果你只是學習怎麼使用Photoshop進行P圖,或者只是調用OpenCV里的函數,也可以不需要數學。

但是,如果你需要學習圖像處理的演算法原理,那麼無論你屬於上述哪種情況,可能你都需要去補充一點數學。

你可以做一個自我測試,下面這些數學概念在基本的圖像處理演算法中都會頻繁涉及,你看一下這些名詞,然後回想自己是不是還能記得它們的數學意義?

梯度 散度 黑塞矩陣 泊松分布 傅里葉級數 貝葉斯公式 邊緣概率 泰勒公式

對於最初的學習者來說,上面三門基礎課(微積分、概率論、線性代數)已經足夠。但是如果你想更進一步地做深入學習和研究,就有可能需要learn more。因為現在圖像處理技術發展非常之快,所用之數學知識也愈發艱深。

你可以再來做一個自我測試,同樣說出你看到下面這些名詞時的第一印象,回想自己是不是還能記得它們的數學意義?這些名詞也確實地出現在當前一些比較流行的圖像處理演算法中,它們涉及到了泛函分析、偏微分方程、數值計算、最優化等領域。

拉格朗日乘數 泊松方程 有界變差函數空間 範數 SVD 高斯-賽德爾迭代法 加性運算元分裂

當然,要不要學習一些數學主要還是取決於你的目標。如果你的目標是函數調用(例如OpenCV)而不太關心原理,那麼你可以完全不需要數學;如果你需要學習基本的、經典的(也即是比較古老的)、教科書級別的圖像處理演算法,基本的數學知識(微積分、概率論、線性代數)已經足夠。如果你想做更深入的學習和研究,那麼你就需要再補充一些額外的數學。

你可能會覺得自己是不是要學的太多,已經前路茫茫了。其實,你也不用悲觀。舉個例子,大學裡高數教材一般分上下冊,因為根據課程安排,需要講授1年。但是,其實你並不需要用到那本書里全部知識!高數書上下冊加起來可能有800頁-1000頁,而我在《圖像處理中的數學修鍊》里提煉、篩選之後,只有46頁!何況你之前還學過,就算全忘了,再拾起來總是還要比完全沒學過的要容易些吧。

那麼,具體來說,你到底需要哪些數學知識呢?是的,每個人時間都是有限的,誰也不想找10本數學書來,全部看完。我根據我自己的經驗,總結、提煉了你最可能需要、也是圖像處理中最常被用到的數學知識——你可以理解為考試前畫重點的過程。於是便有了我的書籍《圖像處理中的數學修鍊》。當然,這不一定有統一的答案,作為一個參考,你可以參看:【圖像處理中的數學原理詳解(Part1 總綱)】

如果以後再遇到什麼有共性的問題時,這個問題列表可能還會增補,不過目前就寫到這裡吧。

(全文完)


推薦閱讀:

去霧演算法 顏色衰減先驗 《A Fast Image Haze Removal Algorithm Using Attenuation Prior》
MATLAB圖像處理:把照片變成素描風格
如果你的內存比較小
魔幻光影濾鏡(3):美女人像「劃重點」

TAG:圖像處理 |