
在沒有學習程式設計前,對程式設計的了解是這樣的...
這樣的...
但一次偶然的機會看了喬布斯生前采訪的視訊,真是醍醐灌頂...!
然後,程式設計在我眼裡就變成這樣!
這不僅改變了我對程式設計的了解,也讓我對學習有了全新的認知,從此學習永遠被提上了日程!(心虛中…)
啥是程式設計?兩張圖搞定!
就像是一個套環,一環套一環,每步都互相聯系。
或者把它比做一個執行動作的過濾器,無論主體是誰,隻要通過程式一樣要執行動作。
Matlab作為編寫程式的軟體,基本資訊在此不多贅述。
以下為我們本次主要分享的三部分内容:
通俗來講,我們是可以将圖像處理了解成用程式設計代碼P圖。其優點就是可以進行批量等複雜操作,是p圖軟體所不具備的,但p圖軟體因具有較強的互動性體驗,而更為普及化。
利用程式設計進行圖像處理的
實質就是将圖像轉換成數字信号,并用計算機進行處理的過程。
顧名思義,我們可以應用計算機系統語言來進行操作達到和p圖軟體同樣的功能,例如:剪裁、旋轉和顔色調整等等,我們會在執行個體示範部分進行具體的應用。
1.1Matlab圖像處理基礎正所謂條條大路通羅馬,想對其圖像進行操作的方式有很多種,這取決于我們要解決問題的不同而不同。例如,前幾節課我們一直學習如何利用Matlab畫國旗,若想對國旗進行圖像處理,我們可以利用矩陣的方式畫一個國旗,也可以利用函數讀取我們事先下載下傳好的國旗圖檔。
說到利用矩陣畫國旗我們就先來回顧一下吧。
若要實作在視窗進行畫圖,我們先複習一下圖形視窗原理。
我們是一層一層去建立嵌套式的去建構矩陣,後利用ones/zeros函數調整RGB值的混合顔色就大功告成啦。
而讀取的方式是則是利用imread函數進行讀取事先下載下傳好的圖檔。
提到RGB我們在這裡要做一個
延伸補充。
Matlab可處理的圖檔類型分為索引圖、灰階圖、二值圖和RGB圖四種。類型的差別就在于矩陣類型和對應的處理方式的不同。上文所提到的RGB就源起此。
RGB是采用顔色的三原色模式顯示的。R G B分别對應紅色、綠色和藍色。
還記得我們前面數字處理的圖檔嗎?
RGB圖像是三維矩陣,次元為m
n
3。m
n為每格像素,也就是每個方格塊;3則是代表三個顔色(紅綠藍)通道,也就是說我們每個方格塊中的顔色都是由三種顔色的不同比例混合而呈現的。
是以這也是為什麼我們用矩陣畫圖時有三列,因為我們需要用不同的RGB值來混合成我們預定的顔色。(我們就以下文要提到的芬蘭國旗為例)
芬蘭國旗矩陣參數代碼
矩陣利用ones函數,我們設定400的列和600的行的3則表示的是RGB值,而接下來則是具體位置的顔色比例的設定,數字1 2 3則分别對應三原色紅綠藍。
2.資料類型的區分進行了以上的複習,那麼問題來了,在我們利用矩陣進行畫圖的時候RGB值一直設定為0-1間,而讀取圖像時顯示的圖像RGB資訊卻是0-255間。
這二者究竟有怎樣的聯系呢?原來是我們利用矩陣畫圖和讀取圖像時所涉及的
資料類型的不同導緻的!
畫圖時所涉及的資料類型為Matlab所預設的雙精度double,數值在0-1之間;而讀取圖像所涉及的資料類型為整形中的無符号uint8,數值在0-255之間。具體可以總結為下表。
為了我們友善了解,我們将矩陣畫圖劃分在GUI(圖形使用者界面)體系下,将讀取圖像劃分在圖像處理子產品下,然後我們可以把資料類型了解為兩個架構所聯結的點。(這樣的劃分并不意味着兩個部分沒有聯系,它們是有互相交叉部分的,原因僅為希望可以用相對廣闊的視角來更好理清其上位概念和互相關系。)
GUI 即人機互動界面,更多涉及互動體驗的設計,多數情況需要我們進行設計,遵循我們之前提到過的root-figure-axes-matrix的邏輯線;而圖像處理更多涉及對已有圖檔的處理,更多用到的是imread()/ imshow()/ imwrite()等函數。
另對于資料類型的資訊我們可以在工作區檢視。(以下文執行個體示範部分的代碼工作區為例)
執行個體示範例子的工作區
以上的區分對我們應用的價值就在于:對不同架構下的資料所對應的RGB值進行有效的輸入。
在我們進行運算前需将資料确認/轉換為double類型,若不轉換會出現運算溢出而被迫運作終止等問題。
而無論采用哪種圖像處理方式,在用matlab處理圖像矩陣後,我們都會用函數imshow()顯示或imwrite()寫入圖檔。如果資料類型是double型,輸出圖像很可能會出現某些異樣,因為函數imshow()在顯示圖像時,會預設為double資料取值範圍為0-1之間,那麼就會将數組中大于1的元素歸為1,顯示為白色。故在顯示圖檔前,我們需将資料轉換為uint8類型。
3.執行個體應用有了以上的區分我們就可以在其基礎上進行應用啦!
3.1單個圖像處理我們目标是對圖一進行取反、剪裁、縮放、旋轉、對比度和亮度的對比操作示範。
圖一(原圖)
代碼如下,我們每一步的操作都基于原圖,便于我們進行對比,并且使用subplot平鋪建立坐标軸函數做一個整體的展示。其中顔色反轉的部分便與我們上文所進行的資料區分有很大的關聯,代碼因imread讀取的資料為uint8類型,是以我們使用的參數值為255,同樣的數字1 2 3分别代表三原色。
執行個體示範代碼
運作!結果就是下圖所示啦!
示範運作結果
3.2批量化圖像處理我們通過設定一個循環來實作批量化處理。上代碼!
批量化圖像處理代碼
本次教程我更願意說成是一個總結筆記的分享,我們回顧了矩陣畫圖和圖檔讀取、對資料類型進行了區分并對圖像處理進行了執行個體示範。代碼真是取之不盡用之不竭,我們更應該做的不是浮于表面,而是了解程式設計本質的思想,以解決具體問題為導向來切入學習,最終達到融會貫通。才疏學淺,也許不能帶給各位宏觀的視野,但希望這次分享可以在大家心裡種下一顆思考的種子,一顆随時都會發芽的種子。