Opencv是Intel公司開發的C++圖像處理工具包,形象的理解為就是C++版的Matlab。 當初Intel公司開發這個工具包的初衷也是方便大家共用,希望大家能夠在一個共同架構的基礎上共同建造摩天大樓,而不是各自在自己的地基上蓋平房。 與Matlab不同,Opencv是面向開發的,穩定性好,異常處理機制周全,但有一點需要注意,由於Opencv是開源的,那麼如果你在專案中直接調用了它的API,那就意味著你的專案也必須開源。 因此在真正的產品開發過程中,往往需要從Opencv庫里面挖代碼,而不是直接調用,幸好Intel公司允許我們看原始碼,自己編譯一把就可以了。
說道C++和Opencv,有一個問題不得不提,那就是深度學習領域大名鼎鼎的Caffe框架。 這是一個典型的基於C++和OpenCv的深度學習框架,由谷歌深度學習團隊、"谷歌大腦"負責人之一賈揚清學者編寫,並公佈了源碼。 如今各個深度學習機構都在大量使用這個框架進行研究。tadarise tadarise-5 tadarise5mg tadarise20mg Supertadarise
這裏同樣對推薦兩本關於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函數歸根到底都是工具,查查手冊就能找到,真正核心還是在演算法,演算法是由公式編寫的,公式的單元是變數,而圖像屆的變數就是矩陣。 所以,熟練去操作矩陣,求秩、求逆、最小二乘,求協方差,都是家常便飯。 所以,如果你有幸能上《矩陣分析》這門課,一定要把它看懂,那裡面都是乾貨。
四、小結
總之,圖像處理就是一個典型的門檻低、廳堂深的領域。 不需要太多基礎,學過線性代數,會一點程式設計就夠了;但是那些演算法卻深不可測,是個消耗功夫的活兒。 在寫這篇教程時我說的很直白,就像和大家對話一樣,想到什麼說什麼。 在最後我想說兩句題外話,就是不僅僅針對圖像處理,對於其他新技術的入門學習也是一樣,儘快邁出第一步,儘快去建立自信和成就感,讓自己有勇氣走下去,然後缺什麼補什麼就行了。 我覺得真正讓人望而卻步的往往不是技術本身,而是我們對自身的不自信。 唯有果斷開工,才能戰勝心魔。