最近有人問我圖像處理怎麼研究,怎麼入門,怎麼應用,我竟一時語塞。仔細想一想,本身也搞了兩年圖像方面的研究,作個兩個創新項目,發過兩篇論文,也算是有點心得,因而總結總結和你們分享,但願能對你們有所幫助。程序員
在寫這篇教程以前我本想多弄點插圖,讓文章看起來花哨一點,後來我以爲不必這樣作,你們花時間沉下心來讀讀文字沒什麼很差,何況學術和技術自己也不是多麼花哨的東西。
1、圖像處理的應用
這個其實沒什麼好說的,一種技術的應用價值不是靠嘴上說,而是要看有多少人去搞,很簡單的道理。其實我以爲判斷一項技術有沒有價值、有多大價值的最簡單最有效的方法就是看有多少人在研究它。若是你們都在研究,那必然說明它很火,至少目前很火,之後的幾年裏依然還會火。所以,若是你不肯定圖像處理是否是有價值,那就查查全國圖像處理工程師的數量就好了。算法
固然這裏仍是簡單提一下。若是你真的只想問「圖像處理有什麼用?」,相信百度會給出比我更專業的答案。不過做爲圖像處理的行內人,我仍是從幾個基本的點來具體說一下。
1) 身份認證
21世紀是刷臉的時代,這一點無可厚非。首先是銀行,聽說重慶的銀行已經使用了人臉識別的驗證系統來進行輔助的認證。數據庫
其次是門禁系統,之前是指紋,虹膜,如今就是人臉。指紋、虹膜的識別雖然準確,可是有侵犯性,採集的過程當中有侵犯性,驗證的過程當中也有侵犯性,反正讓誰每天錄指紋(採集指紋信息),用眼睛瞪攝像頭(採集虹膜信息),誰都會以爲不舒服的,何況手還會脫皮。編程
相比之下,人臉的識別就方便多了,拍張照片(採集人臉信息)誰都不會介意。最後是監控,一個攝像頭所拍的監控能從不一樣的角度記錄成百上千的人(好比車站等密集場所的監控),讓警察去辨認將是一個浩大的工程,要是系統可以自動判別人員信息,無疑會給辦案帶來極大方便。
2) 監控安防
安防監控能夠說是圖像處理領域最有潛力的應用領域。現在各個城市都在瘋狂的安裝監控攝像頭,全國時刻都有無數的攝像頭在錄監控,可是安防監控的後端處理卻沒跟上。小程序
什麼是後端處理,簡單的說就是監控錄像的視頻處理。注意這裏的視頻處理可就不止包含人臉識別了,還有行人檢測、異常檢測、顯著性檢測、協同跟蹤等。人臉識別以前說了,這裏簡單說說行人異常檢測。後端
圖像處理中的行人異常檢測在外行人眼中是一個很是有魔力的東西。畢竟讓攝像頭經過監控視頻就能判斷出當前畫面中誰是好人誰是壞人(固然直接分爲好人和壞人仍是太武斷了),在通常思惟中貌似是不可能的。可是請不要忽略這樣一個事實,就是目前大部分監控視頻的分析處理都是由人工來完成的,警察破案時常常動不動就調出最近幾天的監控視頻,而後從頭看到尾,其工程量之大可想而知。也正是這樣才催生了人們對智能監控方面的研究,由於有這方面的實際需求。固然咱們的視頻分析程序不會直接給出諸如「好人or壞人」這樣的武斷而片面的判斷結果。微信
就當前的技術水平而言,可以統計當下監控畫面中的人數(行人檢測)、定位他們的人臉(人臉檢測)、識別他們的身份(人臉識別)、判別他們的表情(表情識別)、檢測他們的動做(異常檢測),這就已經夠了。這樣之後人們就不會再面對長達幾十甚至上百個小時的監控視頻發呆,而是直接分析計算機給出的數據,當前畫面中有多少人、都是誰、誰的動做可疑等。總之,接下來智能監控發展會很迅速,由於需求很迫切。
3) 深度學習(Deep Learning)
通俗的說一句,「圖像處理是深度學習應用的天堂」。深度學習這個概念可能有人不太熟悉,你們能夠自行百度,我這裏給出一個相對通俗的解釋:「若是你不知道什麼叫深度學習,就想一想《終結者》中的T-800」。固然這句話不是我說的,是出自業界的一位大牛之口。固然這可能有點小片面,不過深度學習確實是公認的新一代人工智能的基礎。網絡
這裏舉兩個例子。一是谷歌的人工大腦項目。谷歌公司能夠說是深度學習方面的牽頭企業了,其在2012年公佈的谷歌大腦項目,動用了1.6萬個計算節點,訓練數週,獲得的人工智能模型可以自主識別貓臉圖像,爲新一代人工智能開闢了道路,以後微軟深度學習研究院、百度深度學習研究院等機構都開始大量投入,各個高校也搞得風聲水起,緣由很簡單,你們都知道它會火。架構
第二就是圖像識別方面的競賽。最有權威的就是ImageNet競賽。你們在一個擁有上千萬張,上千類別的圖像數據庫上訓練和測試本身的算法,比拼識別率。近幾年來,摘得桂冠的一直都是深度學習模型,確切的說是卷積神經網絡。更多有關ImageNet歷年的競賽信息你們能夠自行百度。框架
說道深度學習在圖像處理的應用,不得不提中國的湯曉鷗教授,說他是國內深度學習的領頭羊也不爲過。他提出的DeepID人臉識別算法(一共分爲三代),在一些大規模人臉數據庫上的正確率(若LFW庫)已經達到了99.75%,單純從數字上講的話能夠說已經超越了人類的識別率,爲此湯教授還開辦了公司,開發FaceSDK(雖然尚未公佈)。不過拿計算機和人腦相比自己就是不合理的,各有所長嘛。不過可見DeepLearning在圖像識別領域的強大威力。至於深度學習與圖像處理的關係這裏就不用多說了,谷歌大腦識別的是圖像,深度學習競賽用的是圖像,DeepID識別的仍是圖像人臉,雖然深度學習在其餘方面諸如語音識別等也有應用,在圖像處理依然是其主要的應用領域。
2、圖像處理研究工具
圖像處理的研究分爲算法研究和應用兩個部分。用到的主要編程語言有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》視頻教程寫的,但仍是蠻有成就感的。
3、圖像處理研究方法
我以爲,圖像處理研究主要能夠分爲三個部分:基礎概念、基本思想、算法研究。
1) 基礎概念
所謂基礎概念,就是圖像處理裏最基本的知識,好比什麼是圖像?什麼是像素?什麼是彩色圖像等等。沒有一個明確的界限來劃定什麼是基礎概念什麼是高級知識,因人而異。瞭解圖像處理的基礎知識,有一本書是必讀的,就是岡薩雷斯編寫的、阮秋琦翻譯的《數字圖像處理》。這本書已經做爲圖像處理領域的經典教材使用了三十多年,我本身也把這本書看了好幾遍,每一遍都會有新的體會。我以爲每個搞圖像的都應該熟讀這本書。書中除了有幾章內容在講小波變換、模式識別等相對抽象的內容外,其餘內容相對都是很基礎的,本科生水平就能看懂。並且我建議要儘早看這本書,若是是研究生儘可能在進入課題以前就看一遍,由於這樣一本經典的書在進入課題以後可能就沒時間看了,之後也頂可能是查閱而已。我當初就是在大四的寒假看完了這本書,之後在圖像入門的過程當中就顯得輕鬆不少。看完這本書,哪怕是隻看前幾章,明白了什麼是圖像(二維或者三維矩陣)、什麼是像素、彩色圖和灰度圖、顏色空間、圖像濾波、圖像噪聲、圖像頻域變換等概念,未來在進行更深一步的研究的話就會方便不少了。
2) 基本思想
剛開始想把這部份內容命名爲「基本算法」,意在介紹圖像處理中的一些基本算法,後來仔細想一想決定不這麼寫,由於圖像處理是一個很是大的概念,圖像處理不等於人臉識別,也不等於模式識別,直接介紹諸如圖像處理基本算法之類的內容很容易寫成空話,沒有什麼實際意義。讀者有興趣的話能夠直接谷歌百度「圖像處理十大經典算法」,上面有我想說的內容。
萬變不離其宗,算法是死的,重在思想。舉個例子,我我的是主攻模式識別方向,在這個方向判斷一個學生是否入門有一個很是簡單的方法,就是「若是你能把圖像很天然的想象成高維空間中的一個點」,那就說明在模式識別方面入門了,能夠對圖像進行分類了。固然標準不是惟一,在其餘領域如目標檢測也會有其餘的判斷標準,總之咱們要對圖像進行處理,那麼圖像就再也不只是圖像,它可能會演變成各類不一樣形式的概念,多是點,多是面,還多是一個座標空間。在目標跟蹤的經典算法粒子濾波中,將一個個的小圖像塊看作一個個粒子;在子空間理論中,將一系列圖像放在一塊兒構建一個成分主空間(例如主成分分析PCA算法等等。,我不會詳細介紹這些算法,說多了就顯得抽象老套,但我要說的是咱們必定要把圖像自己理解好,它是一個圖像,是一個矩陣,是一個信息的容器,是一種數據的表現形式,圖像不必定都必須在視覺上有意義(好比頻域的圖像)。
總之圖像處理的基本思想仍是要立足於圖像自己,要深度到圖像內部結構中,思惟要靈活。我當時作本科畢設時,怎麼也不知道圖像和高維空間中的點之間有什麼對應關係,後來總算有一天,忽然就明白了,這也就是所謂的量變產生質變。總之必定要多想,多總結,主動去鑽研,纔可以真正領悟一些東西。最基本的東西每每蘊藏着深奧的道理,不管你如今多牛多厲害,都不能放掉最本源的東西。多想一想圖像是什麼,有什麼本質屬性,你可能沒法獲得準確的答案,但確定能獲得一些有用的感悟(有點像哲學問題了)。
3) 算法研究
算法研究應該是圖像處理的核心工做,尤爲是各大高校的博士碩士。這裏我並不想談那些高大上的算法,我更想說的是一些算法研究的一些基礎的東西,好比說一些基礎課程,好比說矩陣運算。
研究圖像處理的算法,離不開數學。在這裏我建議圖像處理方面的碩士必定要上兩門課:《泛函分析》以及《最優化算法》,有的學校已經將這兩門課列爲了研究生階段的必修課程。這兩門可能夠說是圖像處理(至少是模式識別)的基礎。我當初沒上過最優化算法,但後來也本身補上了,否則真的是步履維艱。至於泛函我當時聽課的時候也不是很懂,可是在以後的研究過程當中發現不少圖像處理的基本知識基本理論都和泛函分析中枯燥的定理一模一樣,沒辦法,有的東西自己就是枯燥的乾貨,學着費力,缺它不行。
其次我想說的是矩陣運算。圖像就是矩陣,圖像處理就是矩陣運算。你們爲何都喜歡用Matlab,就是由於它的矩陣運算能力實在是太強大,在Matlab的世界中任何變量都是矩陣。一樣OpenCv之因此能流行,不只僅是由於它良好的封裝性,也是由於它的矩陣格式,它定義了Mat基礎類,容許你對矩陣進行各類操做。Python也不例外,它的Numpy就是一個專門的線性代數庫。
真正在圖像編程過程當中,那些看着高大上的API函數歸根到底都是工具,查查手冊就能找到,真正核心仍是在算法,算法是由公式編寫的,公式的單元是變量,而圖像屆的變量就是矩陣。因此,熟練去操做矩陣,求秩、求逆、最小二乘,求協方差,都是屢見不鮮。因此,若是你有幸能上《矩陣分析》這門課,必定要把它看懂,那裏面都是乾貨。4、小結總之,圖像處理就是一個典型的門檻低、廳堂深的領域。不須要太多基礎,學過線性代數,會一點編程就夠了;可是那些算法卻深不可測,是個消耗功夫的活兒。在寫這篇教程時我說的很直白,就像和你們對話同樣,想到什麼說什麼。在最後我想說兩句題外話,就是不只僅針對圖像處理,對於其餘新技術的入門學習也是同樣,儘快邁出第一步,儘快去創建自信和成就感,讓本身有勇氣走下去,而後缺什麼補什麼就好了。我以爲真正讓人望而卻步的每每不是技術自己,而是咱們對自身的不自信。惟有果斷開工,才能打敗心魔。