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