圖像處理與計算機視覺基礎,經典以及最近發展
By xdyang(楊曉冬)
一、 緒論 1. 為什么要寫這篇文章 從2002年到現在,接觸圖像快十年了。雖然沒有做出什么很出色的工作,不過在這個領域摸爬滾打了十年之后,發現自己對圖像處理和計算機視覺的感情越來越深厚。下班之后看看相關的書籍和文獻是一件很愜意的事情。平常的一大業余愛好就是收集一些相關的文章,尤其是經典的文章,到現在我的電腦里面已經有了幾十G的文章。寫這個文檔的想法源于我前一段時間整理文獻時的一個突發奇想,既然有這個多文獻,何不整理出其中的經典,抓住重點來閱讀,同時也可以共享給大家。于是當時即興寫了一個《圖像處理與計算機視覺中的經典論文》。現在來看,那個文檔寫得很一般,所共享的論文也非常之有限。就算如此,還是得到了一些網友的夸獎,心里感激不盡。因此,一直想下定決心把這個工作給完善,力求做到盡量全面。
本文是對現有的圖像處理和計算機視覺的經典書籍(后面會有推薦)的一個補充。一般的圖像處理書籍都是介紹性的介紹某個方法,在每個領域內都會引用幾十上百篇參考文獻。有時候想深入研究這個領域的時候卻發現文獻太多,不知如何選擇。但實際上在每個領域都有那么三五篇抑或更多是非讀不可的經典文獻。這些文獻除了提出了很經典的算法,同時他們的Introduction和Related work也是對所在的領域很好的總結。讀通了這幾篇文獻也就等于深入了解了這個領域,比單純的看書收獲要多很多。寫本文的目的就是想把自己所了解到的各個領域的經典文章整理出來,不用迷失在參考文獻的汪洋大海里。
2. 圖像處理和計算機視覺的分類 按照當前流行的分類方法,可以分為以下三部分:
A.圖像處理:對輸入的圖像做某種變換,輸出仍然是圖像,基本不涉及或者很少涉及圖像內容的分析。比較典型的有圖像變換,圖像增強,圖像去噪,圖像壓縮,圖像恢復,二值圖像處理等等。基于閾值的圖像分割也屬于圖像處理的范疇。一般處理的是單幅圖像。
B.圖像分析:對圖像的內容進行分析,提取有意義的特征,以便于后續的處理。處理的仍然是單幅圖像。
C.計算機視覺:對圖像分析得到的特征進行分析,提取場景的語義表示,讓計算機具有人眼和人腦的能力。這時處理的是多幅圖像或者序列圖像,當然也包括部分單幅圖像。
關于圖像處理,圖像分析和計算機視覺的劃分并沒有一個很統一的標準。一般的來說,圖像處理的書籍總會或多或少的介紹一些圖像分析和計算機視覺的知識,比如岡薩雷斯的數字圖像處理。而計算機視覺的書籍基本上都會包括圖像處理和圖像分析,只是不會介紹的太詳細。其實圖像處理,圖像分析和計算機視覺都可以納入到計算機視覺的范疇:圖像處理->低層視覺(low level vision),圖像分析->中間層視覺(middle levelvision),計算機視覺->高層視覺(high level vision)。這是一般的計算機視覺或者機器視覺的劃分方法。在本文中,仍然按照傳統的方法把這個領域劃分為圖像處理,圖像分析和計算機視覺。
3. 圖像處理和計算機視覺開源庫以及編程語言選擇 目前在圖像處理中有兩種最重要的語言:c/c++和matlab。它們各有優點:c/c++比較適合大型的工程,效率較高,而且容易轉成硬件語言,是工業界的默認語言之一。而matlab實現起來比較方便,適用于算法的快速驗證,而且matlab有成熟的工具箱可以使用,比如圖像處理工具箱,信號處理工具箱。它們有一個共同的特點:開源的資源非常多。在學術界matlab使用的非常多,很多作者給出的源代碼都是matlab版本。最近由于OpenCV的興起和不斷完善,c/c++在圖像處理中的作用越來越大。總的來說,c/c++和matlab都必須掌握,最好是精通,當然側重在c/c++上對找工作會有很大幫助。
計算機視覺/圖像算法/模式識別 工程師們使用的主流編程語言
1) 重中之重:編程語言之C/C++
公司面試除了考查應聘者的圖像處理基礎知識、思維邏輯和個人品性之外,在個人能力之中最重要的一條就是C/C 的功底,很多學生朋友們在學校求學階段并不重視C/C++的學習,導致找工作時處處碰壁(不過對于來參加面試的朋友,如果有較強的邏輯思維或圖像理論功底,即使C/C++ 功底弱些,企業還是會偏愛的,畢竟C/C++ 只是一個工具,只要給些時間去鉆研還是可以調高的,但是邏輯思維能力和圖像理論功底卻不是短時期就能提高的。不過一般邏輯思維和圖像理論比較強的人,其C/C 水平也是不錯的)。
為啥要這么重視C/C++ 呢?答案很簡單,與絕大多數其它開發語言相比:C/C++ 的應用領域無法被超越、程序運行效率無法匹敵(當然匯編語言除外),是使用人數最多、跨平臺最廣的語言工具(適用于windows/linux/dsp/arm/單片機,當然還有其它一些平臺)。簡單的說,對于多數應用,其它語言能做的事情C/C++ 幾乎都能做,其它語言不能做的事情C/C++ 也可以做。
2) 輔助工具之:MATLAB
百度百科中是這么說的:“MATLAB是美國MathWorks公司出品的商業數學軟件,用于算法開發、數據可視化、數據分析以及數值計算的高級技術計算語言和交互式環境,主要包括MATLAB和Simulink兩大部分。”
MATLAB本身是一個不錯的仿真、建模工具,但不適用于應用級項目的開發,原因很簡單:效率與C/C++ 無法匹敵、不夸平臺。(雖然后來出來了codegen可以將MATLAB部分代碼轉換為C++,但自動生成的還是無法與我們自己寫的并優化的C++代碼相比;還有MATLAB 的mex接口能夠將C++與MABLAB接口對接,既然使用了MATLAB編程,那在應用級的領域還是無法與純C++相比)
簡短說說多年前做學生時的部分學習經歷:
記得多年前上大學階段大嘴起初只跟著學校的課程學習了MATLAB的圖像處理相關模塊(后來才學的C/C++ ),一開始覺得很興奮,因為只需要編寫很少量的代碼就可以實現很強大的效果。后來大嘴進一家計算機視覺類的公司實習,發現公司主要用的是C/C++ ,因為MATLAB效率比起C/C++ 相差幾倍、十幾倍、甚至幾十倍,而且要命的是不跨平臺,只能用于windows上,后來逼的自己去學了C/C++ ,也正因如此那以后一直到現在特別是當初找工作的時候讓我受益匪淺。
對于企業,特別是私企,公司除非給你充足的時間先使用MATLAB做完算法功能,然后再用C/C++ 慢慢改寫,而且了解的朋友們都知道,MATLAB的精度與封裝的函數標準與C/C++ 有很多不一樣,改寫起來相對麻煩一些,這樣太慢太慢太慢了,項目不等人啊。試問人家成手能夠用短時間寫出C/C++ 做圖像算法并馬上可以投入應用,而自己卻在那邊慢慢磨MATLAB,然后再費老大勁改成純C(比如需要警覺MATLAB與C++精度不一樣的問題、圖像處理基礎函數標準不一樣的問題),那么老板會比較喜歡誰呢?
如果大家從最初就使用C/C++ ,雖然一開始不數量會寫的很慢,但是隨著知識量和自各種庫(比如圖像處理庫)的積累,那么總有一天開發速度會快起來的,量的積累,質的飛躍。
說了不少,本人并不否認MATLAB,MATLAB做為建模、仿真以及一些驗證的工作(比如圖形分析和處理、圖表顯示、圖像仿真、語音仿真等)還是不錯的,這方面大嘴絕對力挺MATLAB,目前本人也還在使用中。
一句話:對于多數普通人來講,如果你的目標是想進企業做為一個實力派工程師,那么大嘴建議您以C/C++ 為主、MATLAB為輔助工具做開發。
3) 輔助工具之:OPENCV
隨著opencv的問世,圖像算法/計算機視覺/模式識別行業的門檻兒變低了,原因有以下幾點:(1)opencv是以C/C ++為基礎開發出來的,適用性強,windows下適用opencv開發的圖像算法應用效率足夠快(2)封裝了很多基礎圖像處理函數和視覺算法,可謂“拿來即可用”。 (3)與嵌入式接口的統一趨勢,如前幾年大牛們人物搞出來的EMCV(基于C/C++ ),其基礎架構和接口與opencv基本一致,但個人認為EMCV很多函數功能尚不完善,目前暫時無法與opencv相比。今后很多人在windows下基于opencv開發后,可以較為輕松的移植到DSP上,這種開發模式會是一種趨勢。
說了opencv幾條優點,但本人并不贊同只依賴opencv做開發,無論是圖像算法行業還是其它很多行業,最重要的不是用什么工具,而是自己的基礎知識和邏輯思維方式,opencv封裝了很多基礎函數,如果朋友們未搞懂其基礎原理便加以使用,這種方式并不利于鍛煉自己,抽空自己實現一下opencv和MATLAB的封裝好的那些基礎函數吧,久而久之,你會發現自己站的高度會越來越高的。
說到這里,改寫一下評述MATLAB時的一句話:”對于多數普通人來講,如果你的目標是想進企業做為一個實力派工程師,那么大嘴建議您以C/C ++為主、OPENCV和MATLAB為輔助工具做開發。”
4) 簡單說說其它語言
其它開發語言,比如:C#,JAVA等(還有很多很多語言,不一一舉例了)都是不錯的開發語言,各自有各自的主應用領域和優勢,也有很多很多牛人在使用,不過做圖像處理嘛,如果不偏向企業級應用(如嵌入式中),雖然也可以用,但是了解的朋友做出來的算法效率實在不敢恭維…,又無法夸平臺,在一些不要求效率的場合還是可以用的,所以請學生朋友們慎重選擇開發語言,因為這與自己以后的擇業以及職位方向有很大關系。
4. 本文的特點和結構,以及適合的對象 在本文面向的對象是即將進入或者剛剛進入圖像處理和計算機視覺領域的童鞋
完整的word格式文檔51黑下載地址(共21頁):
截至2012年-圖像處理與計算機視覺基礎總結.docx
(65.22 KB, 下載次數: 17)
2017-8-20 21:41 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|