5.34. 總結¶
image 模組是相機所提供的最龐大的 API,而本章剛剛涵蓋了它的概要:影像在記憶體中如何表示、相機如何讀寫個別像素、它如何繪製到擷取下來的影格中、它如何對這些影格進行算術與幾何轉換、它如何對它們進行閾值分類與濾波、它如何從中擷取量測值與偵測結果、它如何從中解碼印刷符號、它如何將一張影像與另一張比對,以及它如何在相機上取得結果並將其傳出。
這套工具刻意設計得很廣泛。在小型嵌入式相機上執行的傳統電腦視覺管線,在任何資料抵達機器學習模型之前(如果有的話),就完成了大部分工作——閾值化清理輸入,濾波器去除雜訊,區域縮小搜尋範圍,色塊與線條偵測器定位候選對象,相似度評分決定候選對象是否值得關注,而 I/O 層則將結果交給執行下一階段的任何程式。本章的每一頁都涵蓋了這些操作之一;對於任何特定應用而言,正確的管線就是依問題所要求的順序將它們組合而成的一連串操作。
5.34.1. 管線模式¶
大多數非瑣碎的相機應用都遵循相同的概要。從感測器擷取一個影格。預處理它:轉換格式、均衡化直方圖、模糊掉雜訊。定位感興趣的區域或特徵:色塊偵測、線條偵測、樣板匹配、代碼解碼。分析找到的內容:幾何量測、相似度評分、統計量。根據分析決定要做什麼:觸發 GPIO、回報酬載、擷取並記錄、將影格交給 ML 模型。輸出決策或擷取下來的成品:儲存、編碼、傳送、繪製回影格中供 IDE 預覽。
本章沒有任何單獨一頁涵蓋每一個步驟;本章涵蓋的是管線所組合的那些建構區塊。選擇要使用哪些區塊以及以何種順序使用,是應用程式指令碼的工作。
5.34.2. 本章的去向¶
image 模組將影像當作影像來處理——像素、區域、繪製、偵測。對擷取資料所做的許多工作並不符合這個框架。對任意數值陣列計算統計量、對原始感測器資料執行向量化算術、套用一個背後沒有 image 模組方法支援的自訂矩陣轉換、為一個需要特定張量佈局的機器學習模型準備資料——這些全都是數值陣列函式庫的工作,而非影像處理函式庫的工作。
下一章正是涵蓋這一點。相機上隨 MicroPython 提供的 ulab.numpy 模組是 NumPy 的一個子集,而有兩座橋樑將它與 image 模組連接起來:to_ndarray() 將影格的像素複製到一個 ndarray 以供數值運算,而 Image 建構式則接受一個 ndarray 以從結果建構出一張新影像,準備好顯示、儲存或回饋給 image 函式庫。這兩個模組相輔相成——各自做對方所不做的事,而兩者共同涵蓋了嵌入式視覺應用所需的數值與影像工作。