在開始接觸電腦視覺(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,能保留更多光影細節,避免修圖時出現色階斷層。
三、電腦視覺實作的兩個「隱藏地雷」
在實際撰寫程式時,有兩個初學者常踩的坑必須特別注意:
- 座標原點永遠在「左上角」:
與數學課本的幾何座標不同,影像處理的絕對起點
(0, 0)位在左上角。X 軸向右遞增,而 Y 軸是向下遞增的。我們在實作時,常會印出左上角[0, 0]的像素值,來做資料格式與背景色的「健康檢查」。 - 套件的通道順序差異 (RGB vs. BGR):
- 使用
PIL或Matplotlib讀取圖片時,預設順序是 RGB。 - 但是,使用業界最普及的
OpenCV(cv2) 讀取圖片時,預設順序卻是 BGR!若沒有做轉換就直接丟入 AI 模型訓練,會導致模型辨識顏色錯亂。
- 使用
四、影像直方圖 (Histogram):看透圖片的體質
直方圖是影像處理中極為強大的分析工具。它統計了圖片中「每一個亮度數值 (0 到 255) 到底出現了幾次」。
(貓咪測試圖的 R、G、B 像素分佈直方圖)
透過觀察直方圖,我們可以快速判斷這張圖片的體質:
- 曝光狀況:如果圖表資料全部擠在左側(靠近 0),代表圖片太暗(曝光不足);若擠在右側(靠近 255),則代表太亮(過曝死白)。
- 對比度:若資料均勻分佈在 0 到 255 整個區間,這張圖片通常對比度佳、細節清晰;若只集中在中間一小段,圖片看起來就會灰灰濛濛的。
- 進階應用:在演算法實作中,我們常利用直方圖來做「直方圖均衡化」自動增強對比,或是利用它來尋找閾值(Thresholding),完美地將前景與背景分離。
相關範例程式碼請參閱 Github:Example 1