Python | OpenCV 與 NumPy 的關係
📚 前言
在上一章我們完成了 OpenCV 的安裝與測試。
接下來要理解一個核心概念:電腦如何看待圖片,以及 OpenCV 與 NumPy 的緊密關係。
🖼️ 電腦眼中的圖片
- 一張圖片在電腦裡不是「照片」,而是由許多小方格(像素,pixel)組成。
- 每個像素都有顏色資訊,電腦用數字來表示顏色。
- 在常見的 8-bit 影像中,每個顏色通道的數值範圍是 0 ~ 255:
- 0 → 完全黑
- 255 → 完全亮(白或該顏色的最強值)
- 中間值 → 不同程度的亮度
🧩 範例一:像素矩陣圖(灰階)
下圖是一張 高 16 像素 × 寬 14 像素 的灰階影像,其中數字「5」由黑色像素(0)構成,背景為白色像素(255)。
在 NumPy 中會表示為 shape (16, 14),也就是 16 行、14 列。
這種圖像在電腦中就是一個數值矩陣:

圖:灰階影像矩陣示例,數字「5」由黑色像素構成
圖:灰階影像矩陣的數值表示方式
👉 每個數字代表一個像素的亮度,這就是灰階影像的本質。
🌈 範例二:灰階 vs 彩色矩陣
灰階圖片
- 灰階圖片只有一個通道,每個像素用一個數字表示亮度,例如:矩陣表示方式:
1
2
30 = 黑色
128 = 灰色
255 = 白色1
2
3[[ 0 128 255]
[ 64 192 128]
[255 0 64]]
圖:灰階影像矩陣範例,單通道亮度值
彩色圖片
- 彩色圖片通常有 三個通道:在 OpenCV 中是 BGR(藍、綠、紅)。
- 每個像素用三個數字表示,例如:→ 藍色 0、綠色 128、紅色 255,組合成一種顏色。
1
[B, G, R] = [0, 128, 255]
矩陣表示方式(3D 陣列):1
2[ [[0, 0, 255], [255, 255, 255]],
[[0, 255, 0], [128, 128, 128]] ]
圖:彩色影像矩陣範例,三通道 BGR 值
🎨 範例三:RGB 通道分解
一張彩色圖片,其實是由三張灰階圖組合而成:紅色通道、綠色通道、藍色通道。
下圖示範一張蘋果圖如何分解為三個通道:

圖:彩色影像分解為三個灰階通道(紅、綠、藍)
👉 每個通道都是一張灰階圖,代表該顏色的強度分佈。
🔍 影像的本質:矩陣
- 一張彩色圖片可以看成是 三維矩陣:
- 高度(rows)
- 寬度(columns)
- 顏色通道(channels:BGR)
- 例如,一張 359×360 的彩色圖片,會被表示成:→ 360 行、359 列、3 個顏色通道。
1
(360, 359, 3)
- 📌 注意:規格表 vs. 程式中的 shape
- 規格表或日常描述:我們通常寫成「寬 × 高」,例如 1920x1080 像素代表寬 1920 像素、高 1080 像素。這是數位影像的標準表示法。
- NumPy / OpenCV 的 img.shape:回傳的是 (height, width, channels),也就是 先高後寬。
🛠️ 範例程式
1 | import cv2 |
註:雖然這段程式沒有直接呼叫 np,但影像本質就是 NumPy 陣列,因此我們仍需理解 NumPy 的操作方式。
輸出結果可能是:
1 | 影像型態: <class 'numpy.ndarray'> # 影像就是 NumPy 陣列 |
👉 可以看到,OpenCV 影像就是 NumPy 的 ndarray

圖:使用程式讀取圖片並輸出 NumPy 陣列資訊
📊 NumPy 操作影像的好處
- 快速運算:NumPy 的向量化運算比逐像素迴圈快很多。
- 靈活操作:可以用切片(slice)快速裁切影像。
- 數學工具:能直接做矩陣運算、統計分析。
- 整合性強:方便與其他科學計算套件(Pandas、SciPy、TensorFlow)結合。
⚠️ 注意事項
- OpenCV 預設顏色通道順序是 BGR,而不是常見的 RGB。
- 影像的資料型態通常是 uint8(0~255),運算時要注意溢位。
- NumPy 操作影像時,記得保持矩陣維度一致,避免出現 shape mismatch。
結語 🎯
理解 OpenCV 與 NumPy 的關係,是學習影像處理的第一步。
只要掌握「影像 = NumPy 陣列」這個核心概念,就能用 NumPy 的強大功能,靈活地操作影像資料。
接下來,我們將進入 影像基本操作,學習如何讀取、顯示、儲存圖片,以及進行大小調整與顏色轉換。
