在開始接觸電腦視覺(Computer Vision)與影像處理時,我們必須先了解「電腦是如何看一張圖片的」。本文將透過一張簡單的貓咪測試圖,來拆解影像背後的資料結構與基礎觀念。

網路上的貓

一、影像的維度:H × W × C

在程式碼中,一張圖片通常會被轉換為矩陣(NumPy Array),並具有三個主要維度:高度 (Height) $\times$ 寬度 (Width) $\times$ 通道數 (Channel)

H 和 W 很好理解,就是圖片的長寬像素大小,而 C (Color Channel,顏色通道) 則決定了圖片的色彩構成:

  • C = 1 (灰階圖片):每個像素只需一個數值來表示亮度(黑到白)。
  • C = 3 (標準彩色圖片):由 R (紅)、G (綠)、B (藍) 三個通道組成。
  • C = 4 (帶有透明度的圖片):除了 RGB,還加上 A (Alpha) 通道來記錄透明度(例如去背的 PNG 圖檔)。

圖片拆解 (透過程式將原圖轉換為灰階、縮放,以及拆分為獨立的 R、G、B 通道)

二、資料型態與像素值:什麼是 uint8?

當我們檢查影像矩陣的資料型態時,最常看見的是 uint8 (Unsigned 8-bit Integer,無號 8 位元整數)。這代表圖片中每一個像素的數值,都是一個介於 0 到 255 之間的正整數。

  • 為什麼是 255? 因為 8 位元 (8-bit) 在電腦中剛好可以組合出 $2^8 = 256$ 種變化。
  • 數值的意義:在 RGB 中,0 代表該顏色最暗(不發光),255 代表該顏色最亮。例如 RGB [255, 255, 255] 組合起來就是純白色。

不過,並非所有圖片的範圍都是 0 到 255。如果遇到單眼相機的 RAW 檔或是醫療影像,它們可能是 16-bit 影像,數值範圍就會高達 0 到 65535,能保留更多光影細節,避免修圖時出現色階斷層。

三、電腦視覺實作的兩個「隱藏地雷」

在實際撰寫程式時,有兩個初學者常踩的坑必須特別注意:

  1. 座標原點永遠在「左上角」: 與數學課本的幾何座標不同,影像處理的絕對起點 (0, 0) 位在左上角。X 軸向右遞增,而 Y 軸是向下遞增的。我們在實作時,常會印出左上角 [0, 0] 的像素值,來做資料格式與背景色的「健康檢查」。
  2. 套件的通道順序差異 (RGB vs. BGR)
    • 使用 PILMatplotlib 讀取圖片時,預設順序是 RGB
    • 但是,使用業界最普及的 OpenCV (cv2) 讀取圖片時,預設順序卻是 BGR!若沒有做轉換就直接丟入 AI 模型訓練,會導致模型辨識顏色錯亂。

四、影像直方圖 (Histogram):看透圖片的體質

直方圖是影像處理中極為強大的分析工具。它統計了圖片中「每一個亮度數值 (0 到 255) 到底出現了幾次」。

圖片直方圖 (貓咪測試圖的 R、G、B 像素分佈直方圖)

透過觀察直方圖,我們可以快速判斷這張圖片的體質:

  • 曝光狀況:如果圖表資料全部擠在左側(靠近 0),代表圖片太暗(曝光不足);若擠在右側(靠近 255),則代表太亮(過曝死白)。
  • 對比度:若資料均勻分佈在 0 到 255 整個區間,這張圖片通常對比度佳、細節清晰;若只集中在中間一小段,圖片看起來就會灰灰濛濛的。
  • 進階應用:在演算法實作中,我們常利用直方圖來做「直方圖均衡化」自動增強對比,或是利用它來尋找閾值(Thresholding),完美地將前景與背景分離。

相關範例程式碼請參閱 Github:Example 1