4.13. 像素格式

ISP 管線的最後一個階段會將每個像素打包成記憶體中某種特定的位元組排列方式。所選的格式會在影像品質、記憶體大小,以及下游程式碼如何將位元組讀回之間做出取捨。少數幾種格式佔據主導地位。

4.13.1. RAW(拜耳)

預設輸出是原始拜耳格式——也就是感測器所產生、每個像素僅單一通道的鑲嵌圖案。每像素一個位元組,以拜耳圖案排列:偶數列交替排列紅色與綠色,奇數列交替排列綠色與藍色。尚未套用任何去拜耳處理,因此每個單元仍只保有其色彩濾鏡所透過的那個值。

原始拜耳格式的記憶體用量僅為已完成的三通道 RGB 影像的三分之一——每像素一個位元組對上三個位元組——而且沒有耗費任何 ISP 週期去做去拜耳或轉換。代價則是使用者程式碼必須自行進行去拜耳處理,之後才能執行任何需要色彩資訊的處理。

4.13.2. RGB888

RGB888 是彩色影像最自然的完成格式:每像素三個位元組,紅、綠、藍三個通道各一個,每通道 8 位元。每像素 24 位元,可表示將近一千七百萬種不同的色彩。

RGB888 是已完成彩色影像的概念性參考標準,而且大多數板外軟體都使用它。在嵌入式硬體上,它的主要缺點在於 24 位元的像素大小——它不是處理器字組大小的倍數,對記憶體對齊而言很不便,而且比下一級的格式大上 50%。

4.13.3. RGB565

RGB565 將每個像素打包成兩個位元組:紅色 5 位元、綠色 6 位元、藍色 5 位元。多出的那個綠色位元反映了人眼對綠色較高的敏感度,也與綠色通道在拜耳圖案中所佔的雙倍權重相符。

RGB565 是 OpenMV Cam 上的預設色彩格式。每像素兩個位元組是 16 位元對齊的,這正好符合 MCU 的原生資料寬度——像素的載入、儲存與運算全都以全速執行,而且許多運算可以一次處理一對像素。RGB888 的 24 位元像素無法以那種方式對齊,因此在每次存取時都要付出代價。相較於 RGB888 節省 33% 的記憶體也會逐漸累積出可觀的差距:QVGA(320 x 240)在 RGB565 下為 150 KB,在 RGB888 下則為 225 KB,而且這個差距會隨解析度增大而擴大。

其取捨在於只能表示六萬五千種不同的色彩,而非一千七百萬種。對於大多數機器視覺任務而言,這個差異是看不出來的,因為這些演算法會把影格化約為經閾值處理或經邊緣偵測的表示形式,而那無論如何都會捨棄掉大部分的色彩細節。對於人眼觀看而言,缺少的位元會在平滑的色彩漸層中表現為淡淡的條帶,但不會是任何眼睛會立即察覺的東西。

4.13.4. YUV422

YUV422 將每個像素的色彩拆分成一個 亮度 值(Y)與兩個 色度 值(U 和 V),然後對色度進行次取樣,因為人類視覺對色彩變化的敏感度遠低於對亮度變化的敏感度。每個像素都帶有自己的 Y,但相鄰的像素對則共用一個 U 和一個 V。每一對的位元組排列為四個位元組——Y0、U、Y1、V——平均下來等於每像素兩個位元組,與 RGB565 相同。

不過這兩個位元組所代表的意義與 RGB565 不同。單就 Y 通道本身就是一張可直接使用的 8 位元灰階影像,而那正是大多數傳統機器視覺演算法(邊緣偵測、樣板比對、色塊分析)實際所消耗的資料;U 和 V 通道則為少數需要色彩的演算法承載色彩資訊。

當管線兩者都需要時——亦即只讀取 Y 的早期階段演算法,後接使用色度進行更精細色彩判斷的後期階段——YUV422 就是正確的選擇,因為 Y 值就現成地擺在那裡,無需進行色彩空間轉換即可使用。

4.13.5. 灰階

灰階是每像素一個位元組:僅有亮度值,完全沒有色彩。它是最小的完成格式——是 RGB565 與 YUV422 的一半大小,是 RGB888 的三分之一大小。

大多數傳統機器視覺演算法本來就在灰階上運作,因此直接從感測器捨棄色彩通道,往往是最簡單也最節省記憶體的選擇。邊緣偵測、找線、色塊分析、QR-code 解碼、樣板比對與 AprilTag 偵測全都在灰階上執行,並可受益於更小的緩衝區。

4.13.6. 其他格式

OpenMV Cam 可以產生的少數幾種格式,並不會在正常流程中作為 ISP 管線的一部分輸出。

BINARY 是每像素一個位元——可能的最小表示形式。用於經閾值處理的影像、遮罩緩衝區,以及任何在每個像素上只區分「符合」與「不符合」的運算的輸出。

JPEG 是一種壓縮的彩色格式。有些感測器內含晶片上的 JPEG 編碼器,能夠直接輸出經 JPEG 壓縮的影格;對於沒有編碼器的感測器,MCU 則會在 ISP 之後對一張已完成的 RGB 或灰階影格執行 JPEG 編碼器。無論哪種方式,輸出都是 JPEG 位元串流,可用於將影格儲存到儲存裝置,或透過頻寬受限的連結傳送它們。

PNG 是一種無損的壓縮格式。感測器不會直接產生 PNG;而是由 MCU 依需求壓縮一張已完成的 RGB 或灰階影格。當頻寬或儲存空間很重要、但 JPEG 所套用的有損壓縮會捨棄應用程式日後所需的資訊時,這種格式很有用。