1. 程式人生 > >影象處理入門教程

影象處理入門教程

轉載自:blog.csdn.net/u013088062/article/details/50425018

最近有人問我影象處理怎麼研究,怎麼入門,怎麼應用,我竟一時語塞。仔細想想,自己也搞了兩年影象方面的研究,做個兩個創新專案,發過兩篇論文,也算是有點心得,於是總結總結和大家分享,希望能對大家有所幫助。在寫這篇教程之前我本想多弄點插圖,讓文章看起來花哨一點,後來我覺得沒必要這樣做,大家花時間沉下心來讀讀文字沒什麼不好,況且學術和技術本身也不是多麼花哨的東西。

  一、影象處理的應用

  這個其實沒什麼好說的,一種技術的應用價值不是靠嘴上說,而是要看有多少人去搞,很簡單的道理。其實我覺得判斷一項技術有沒有價值、有多大價值的最簡單最有效的方法就是看有多少人在研究它。如果大家都在研究,那必然說明它很火,至少目前很火,以後的幾年裡依然還會火。因此,如果你不確定影象處理是不是有價值,那就查查全國影象處理工程師的數量就行了。

當然這裡還是簡單提一下。如果你真的只想問“影象處理有什麼用?”,相信百度會給出比我更專業的答案。不過作為影象處理的行內人,我還是從幾個基本的點來具體說一下。

  1、身份認證

  21世紀是刷臉的時代,這一點無可厚非。首先是銀行,據說重慶的銀行已經使用了人臉識別的驗證系統來進行輔助的認證。其次是門禁系統,以前是指紋,虹膜,現在就是人臉。指紋、虹膜的識別雖然準確,但是有侵犯性,採集的過程中有侵犯性,驗證的過程中也有侵犯性,反正讓誰天天錄指紋(採集指紋資訊),用眼睛瞪攝像頭(採集虹膜資訊),誰都會覺得不舒服的,況且手還會脫皮。相比之下,人臉的識別就方便多了,拍張照片(採集人臉資訊)誰都不會介意。最後是監控,一個攝像頭所拍的監控能從不同的角度記錄成百上千的人(比如車站等密集場所的監控),讓警察去辨認將是一個浩大的工程,要是系統能夠自動判別人員資訊,無疑會給辦案帶來極大方便。

  2、監控安防

  安防監控可以說是影象處理領域最有潛力的應用領域。如今各個城市都在瘋狂的安裝監控攝像頭,全國時刻都有無數的攝像頭在錄監控,但是安防監控的後端處理卻沒跟上。什麼是後端處理,簡單的說就是監控錄影的視訊處理。注意這裡的視訊處理可就不止包含人臉識別了,還有行人檢測、異常檢測、顯著性檢測、協同跟蹤等。人臉識別之前說了,這裡簡單說說行人異常檢測。影象處理中的行人異常檢測在外行人眼中是一個非常有魔力的東西。畢竟讓攝像頭通過監控視訊就能判斷出當前畫面中誰是好人誰是壞人(當然直接分為好人和壞人還是太武斷了),在一般思維中貌似是不可能的。但是請不要忽略這樣一個事實,就是目前大部分監控視訊的分析處理都是由人工來完成的,警察破案時經常動不動就調出最近幾天的監控視訊,然後從頭看到尾,其工程量之大可想而知。也正是這樣才催生了人們對智慧監控方面的研究,因為有這方面的實際需求。當然我們的視訊分析程式不會直接給出諸如“好人or壞人”這樣的武斷而片面的判斷結果。就當前的技術水平而言,能夠統計當下監控畫面中的人數(行人檢測)、定位他們的人臉(人臉檢測)、識別他們的身份(人臉識別)、判別他們的表情(表情識別)、檢測他們的動作(異常檢測),這就已經夠了。這樣以後人們就不會再面對長達幾十甚至上百個小時的監控視訊發呆,而是直接分析計算機給出的資料,當前畫面中有多少人、都是誰、誰的動作可疑等。總之,接下來智慧監控發展會很迅速,因為需求很迫切。

  3、深度學習(Deep Learning)

  通俗的說一句,“影象處理是深度學習應用的天堂”。深度學習這個概念可能有人不太熟悉,大家可以自行百度,我這裡給出一個相對通俗的解釋:“如果你不知道什麼叫深度學習,就想想《終結者》中的T-800”。當然這句話不是我說的,是出自業界的一位大牛之口。當然這可能有點小片面,不過深度學習確實是公認的新一代人工智慧的基礎。

  這裡舉兩個例子。一是谷歌的人工大腦專案。谷歌公司可以說是深度學習方面的牽頭企業了,其在2012年公佈的谷歌大腦專案,動用了1.6萬個計算節點,訓練數週,得到的人工智慧模型能夠自主識別貓臉影象,為新一代人工智慧開闢了道路,之後微軟深度學習研究院、百度深度學習研究院等機構都開始大量投入,各個高校也搞得風聲水起,原因很簡單,大家都知道它會火。

  第二就是影象識別方面的競賽。最有權威的就是ImageNet競賽。大家在一個擁有上千萬張,上千類別的影象資料庫上訓練和測試自己的演算法,比拼識別率。近幾年來,摘得桂冠的一直都是深度學習模型,確切的說是卷積神經網路。更多有關ImageNet歷年的競賽資訊大家可以自行百度。

  說道深度學習在影象處理的應用,不得不提中國的湯曉鷗教授,說他是國內深度學習的領頭羊也不為過。他提出的DeepID人臉識別演算法(一共分為三代),在一些大規模人臉資料庫上的正確率(若LFW庫)已經達到了99.75%,單純從數字上講的話可以說已經超越了人類的識別率,為此湯教授還開辦了公司,開發FaceSDK(雖然還沒有公佈)。不過拿計算機和人腦相比本身就是不合理的,各有所長嘛。不過可見DeepLearning在影象識別領域的強大威力。至於深度學習與影象處理的關係這裡就不用多說了,谷歌大腦識別的是影象,深度學習競賽用的是影象,DeepID識別的還是影象人臉,雖然深度學習在其他方面諸如語音識別等也有應用,在影象處理依然是其主要的應用領域。

  二、影象處理研究工具

  影象處理的研究分為演算法研究和應用兩個部分。用到的主要程式語言有Matlab、C/C++、Python等,原因很簡單,它們都有很多相應的第三方庫,不用我們從零開始程式設計。

  1、Matlab

  MathWork公司的Matlab軟體可以說是演算法研究的利器,它的強大之處在於其方便快捷的矩陣運算能力和圖形模擬能力,單從簡潔性和封裝性來說,確實完爆其他語言。但高度封裝必然會相應的損失一部分靈活性,況且Matlab嚴格的講更像是一個工具,而非一門程式語言。順便提一句,它在2015年程式語言排行榜中位於第20名,僅次於IOS開發的Objective-C。

  對於演算法研究人員(尤其是高校的碩士博士),首選工具自然是matlab,因為它簡便快捷,封裝性好,更重要的是全世界幾乎所有的演算法大牛、精英教授都會首先公佈對應的Matlab原始碼,然後在逐步改寫成其他語言進行實際應用。所以,如果你想做影象處理方面的研究,Matlab是必須掌握的,而且是熟練掌握。當你有一些想法需要驗證時,最好明智的先用matlab編寫出來測試。如果你上來就用看似高大上的C++來實驗,不僅錯誤BUG一大堆,到頭來可能效果還不佳,就算效果好,時間也會耽擱不少,畢竟演算法開發還是要快的,這樣才能趕在別人之前發論文。總之,只要是接觸影象演算法,終究逃不過Matlab,就算你是軟體開發的,不研發演算法,但總得能看懂別人的Matlab演算法吧。

  對於之前沒怎麼接觸過Matlab與影象處理的人,在這裡推薦一本相關的書籍《MATLAB影象處理例項詳解(附光碟)》。這本書對於Matlab影象處理入門還是很有幫助的。記得我當時剛上研究生時就靠兩本書入門的,一是岡薩雷斯的《數字影象處理》,二是這本《MATLAB影象處理例項詳解》。不過這裡友情提示,在看這類教程(不僅僅是Matlab)時千萬不要試圖去記憶所有的工具函式,這種做法是十分愚蠢的。正確的做法是根據自己的情況快速翻閱這類工具書,可以找出裡面的有實際意義的原始碼來敲一敲練練手感,至於具體的工具函式,只需要知道Matlab提供了這方面的功能就行了,以後用到了再回來查,或者谷歌百度。我覺得在入門階段,最重要的不是看了多少書,聽了多少課,而是儘快自己敲出一段程式碼,執行出結果,來建立自信和成就感,這才是支援我們走下去的最實在的動力。記得我當時看了沒多久就自己敲了一個蹩腳的車牌檢測的Matlab程式,現在看來真是漏洞百出,不過當時我真的很興奮,很有成就感,覺得自己能幹這行,對於初學者來說,這種感受彌足珍貴。

  2、OpenCv

  Opencv是Intel公司開發的C++影象處理工具包,形象的理解為就是C++版的Matlab。當初Intel公司開發這個工具包的初衷也是方便大家共享,希望大家能夠在一個共同架構的基礎上共同建造摩天大樓,而不是各自在自己的地基上蓋平房。與Matlab不同,Opencv是面向開發的,穩定性好,異常處理機制周全,但有一點需要注意,由於Opencv是開源的,那麼如果你在專案中直接呼叫了它的API,那就意味著你的專案也必須開源。因此在真正的產品開發過程中,往往需要從Opencv庫裡面挖程式碼,而不是直接呼叫,幸好Intel公司允許我們看原始碼,自己編譯一把就可以了。

  說道C++和Opencv,有一個問題不得不提,那就是深度學習領域大名鼎鼎的Caffe框架。這是一個典型的基於C++和OpenCv的深度學習框架,由谷歌深度學習團隊、“谷歌大腦”負責人之一賈揚清學者編寫,並公佈了原始碼。如今各個深度學習機構都在大量使用這個框架進行研究。

  這裡同樣對推薦兩本關於Opencv方面的教程。一本是CSDN部落格大牛毛星雲寫的《OpenCV3程式設計入門》,這是它根據自己多年的部落格整理成的書,很詳細,很典型的一本教程,介紹了OpenCv中相對前沿的知識。我翻看過這本教程,中規中矩,裡面的程式碼通俗易懂,尤其適合初學者。當然大家同樣要注意不要犯了死讀書的毛病,只看它的功能,敲程式碼練手感即可,不要試圖記憶API函式。重要的工具用多了自然會記住,不重要的工具記住了也沒用。

  這裡推薦的第二本書是《影象識別與專案實踐――VC++、MATLAB技術實現》,這本書是一本偏向於工程應用的書,我之所以推薦它是因為它給出了很多有新意、能執行的程式碼。其中裡面有一個專案讓我印象很深,是一個車牌檢測的例項。簡單描述一下:由於車牌中的字元數是固定的,因此它通過判斷橫向區域筆畫的跳變數以及筆畫寬度來定位車牌區域。這個想法讓人耳目一新,並且它還給出了詳細程式碼,我也親身試驗過,效果還不錯。

  這裡同樣再強調一下,就是一定要儘早入手寫程式,建立自信和成就感。我當時學OpenCv正好用它開發了一個人臉性別識別的系統,是一個本科大學生創新計劃的需求,效果還可以。

  3、Python

  Python在今年12月份的程式語言排行榜中名列第5,增長迅速。可以說Python已經逐漸成為當下指令碼語言的新標準。Python在影象處理演算法方面除了其自身簡潔的程式設計優勢外,還得益於兩個重要的Python類庫——Numpy和Theano。

  Numpy是Python的線性代數庫,對於矩陣運算能提供很好的支援,並且能夠在此基礎上進行很多機器學習相關演算法的開發模擬,這裡推薦一本受到大家廣泛認可的書《機器學習實戰》,我最近也正在看這本書,裡面對好多機器學習領域的經典演算法,小到KNN,大到SVM,都給出了詳細的介紹以及程式碼實現(Python版)。Theano是Python的機器學習庫,能夠方便的實現深度學習(例如卷積神經網路CNN)演算法,網上很多對於DeepID演算法的復現都是用的這個庫。

  人覺得單從影象處理的角度評價的話,Python並沒有前面兩個工具(Matlab和OpenCv)應用廣泛,不過作為通用的指令碼語言,我覺得每個程式設計師都應該去了解了解它,畢竟俗話說沒有爛的程式語言,只有爛程式設計師。我在學Python時第一個自己寫的程式就是微信打飛機的小程式,在我的部落格中有詳細的教程,雖然是參照小甲魚的《零基礎入門學習Python》視訊教程寫的,但還是蠻有成就感的。

  三、影象處理研究方法

  我覺得,影象處理研究主要可以分為三個部分:基礎概念、基本思想、演算法研究。

  1、基礎概念

  所謂基礎概念,就是影象處理裡最基本的知識,比如什麼是影象?什麼是畫素?什麼是彩色影象等等。沒有一個明確的界限來劃定什麼是基礎概念什麼是高階知識,因人而異。瞭解影象處理的基礎知識,有一本書是必讀的,就是岡薩雷斯編寫的、阮秋琦翻譯的《數字影象處理》。這本書已經作為影象處理領域的經典教材使用了三十多年,我自己也把這本書看了好幾遍,每一遍都會有新的體會。我覺得每一個搞影象的都應該熟讀這本書。書中除了有幾章內容在講小波變換、模式識別等相對抽象的內容外,其他內容相對都是很基礎的,本科生水平就能看懂。而且我建議要儘早看這本書,如果是研究生儘量在進入課題之前就看一遍,因為這樣一本經典的書在進入課題之後可能就沒時間看了,以後也頂多是查閱而已。我當初就是在大四的寒假看完了這本書,以後在影象入門的過程中就顯得輕鬆很多。看完這本書,哪怕是隻看前幾章,明白了什麼是影象(二維或者三維矩陣)、什麼是畫素、彩色圖和灰度圖、顏色空間、影象濾波、影象噪聲、影象頻域變換等概念,將來在進行更深一步的研究的話就會方便很多了。

  2、基本思想

  剛開始想把這部分內容命名為“基本演算法”,意在介紹影象處理中的一些基本演算法,後來仔細想想決定不這麼寫,因為影象處理是一個非常大的概念,影象處理不等於人臉識別,也不等於模式識別,直接介紹諸如影象處理基本演算法之類的內容很容易寫成空話,沒有什麼實際意義。讀者有興趣的話可以直接谷歌百度“影象處理十大經典演算法”,上面有我想說的內容。

  萬變不離其宗,演算法是死的,重在思想。舉個例子,我個人是主攻模式識別方向,在這個方向判斷一個學生是否入門有一個非常簡單的方法,就是“如果你能把影象很自然的想象成高維空間中的一個點”,那就說明在模式識別方面入門了,可以對影象進行分類了。當然標準不是唯一,在其他領域如目標檢測也會有其他的判斷標準,總之我們要對影象進行處理,那麼影象就不再只是影象,它可能會演變成各種不同形式的概念,可能是點,可能是面,還可能是一個座標空間。在目標跟蹤的經典演算法粒子濾波中,將一個個的小影象塊看做一個個粒子;在子空間理論中,將一系列影象放在一起構建一個成分主空間(例如主成分分析PCA演算法等等。,我不會詳細介紹這些演算法,說多了就顯得抽象老套,但我要說的是我們一定要把影象本身理解好,它是一個影象,是一個矩陣,是一個資訊的容器,是一種資料的表現形式,影象不一定都必須在視覺上有意義(比如頻域的影象)。

  總之影象處理的基本思想還是要立足於影象本身,要深度到影象內部結構中,思維要靈活。我當時做本科畢設時,怎麼也不知道影象和高維空間中的點之間有什麼對應關係,後來總算有一天,突然就明白了,這也就是所謂的量變產生質變。總之一定要多想,多總結,主動去鑽研,才能夠真正領悟一些東西。最基本的東西往往蘊藏著深奧的道理,無論你現在多牛多厲害,都不能放掉最本源的東西。多想想影象是什麼,有什麼本質屬性,你可能無法得到準確的答案,但肯定能得到一些有用的感悟(有點像哲學問題了)。

  3、演算法研究

  演算法研究應該是影象處理的核心工作,尤其是各大高校的博士碩士。這裡我並不想談那些高大上的演算法,我更想說的是一些演算法研究的一些基礎的東西,比如說一些基礎課程,比如說矩陣運算。

  研究影象處理的演算法,離不開數學。在這裡我建議影象處理方面的碩士一定要上兩門課:《泛函分析》以及《最優化演算法》,有的學校已經將這兩門課列為了研究生階段的必修課程。這兩門可可以說是影象處理(至少是模式識別)的基礎。我當初沒上過最優化演算法,但後來也自己補上了,不然真的是寸步難行。至於泛函我當時聽課的時候也不是很懂,但是在之後的研究過程中發現很多影象處理的基本知識基本理論都和泛函分析中枯燥的定理如出一轍,沒辦法,有的東西本身就是枯燥的乾貨,學著費力,缺它不行。

  其次我想說的是矩陣運算。影象就是矩陣,影象處理就是矩陣運算。大家為什麼都喜歡用Matlab,就是因為它的矩陣運算能力實在是太強大,在Matlab的世界中任何變數都是矩陣。同樣OpenCv之所以能流行,不僅僅是因為它良好的封裝性,也是因為它的矩陣格式,它定義了Mat基礎類,允許你對矩陣進行各種操作。Python也不例外,它的Numpy就是一個專門的線性代數庫。

  真正在影象程式設計過程中,那些看著高大上的API函式歸根到底都是工具,查查手冊就能找到,真正核心還是在演算法,演算法是由公式編寫的,公式的單元是變數,而影象屆的變數就是矩陣。所以,熟練去操作矩陣,求秩、求逆、最小二乘,求協方差,都是家常便飯。所以,如果你有幸能上《矩陣分析》這門課,一定要把它看懂,那裡面都是乾貨。

  四、小結

  總之,影象處理就是一個典型的門檻低、廳堂深的領域。不需要太多基礎,學過線性代數,會一點程式設計就夠了;但是那些演算法卻深不可測,是個消耗功夫的活兒。在寫這篇教程時我說的很直白,就像和大家對話一樣,想到什麼說什麼。在最後我想說兩句題外話,就是不僅僅針對影象處理,對於其他新技術的入門學習也是一樣,儘快邁出第一步,儘快去建立自信和成就感,讓自己有勇氣走下去,然後缺什麼補什麼就行了。我覺得真正讓人望而卻步的往往不是技術本身,而是我們對自身的不自信。唯有果斷開工,才能戰勝心魔。