Like Share Discussion Bookmark Smile

J.J. Huang   2026-01-08   Python OpenCV 01.入門與環境準備   瀏覽次數:次   DMCA.com Protection Status

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
    3
    0   = 黑色 
    128 = 灰色
    255 = 白色
    矩陣表示方式:
    1
    2
    3
    [[  0 128 255] 
    [ 64 192 128]
    [255 0 64]]

    圖:灰階影像矩陣範例,單通道亮度值

彩色圖片

  • 彩色圖片通常有 三個通道:在 OpenCV 中是 BGR(藍、綠、紅)。
  • 每個像素用三個數字表示,例如:
    1
    [B, G, R] = [0, 128, 255]
    → 藍色 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 的彩色圖片,會被表示成:
    1
    (360, 359, 3)
    → 360 行、359 列、3 個顏色通道。
  • 📌 注意:規格表 vs. 程式中的 shape
    • 規格表或日常描述:我們通常寫成「寬 × 高」,例如 1920x1080 像素代表寬 1920 像素、高 1080 像素。這是數位影像的標準表示法。
    • NumPy / OpenCV 的 img.shape:回傳的是 (height, width, channels),也就是 先高後寬。

🛠️ 範例程式

1
2
3
4
5
6
7
8
9
10
11
12
13
import cv2
import numpy as np

# 讀取圖片
img = cv2.imread("test.png")

print("影像型態:", type(img))
print("影像大小:", img.shape)
print("資料型態:", img.dtype)

# 取出某個像素 (y=100, x=200)
pixel = img[100, 200]
print("像素值 (BGR):", pixel)

註:雖然這段程式沒有直接呼叫 np,但影像本質就是 NumPy 陣列,因此我們仍需理解 NumPy 的操作方式。

輸出結果可能是:

1
2
3
4
影像型態: <class 'numpy.ndarray'>  # 影像就是 NumPy 陣列
影像大小: (360, 359, 3) # 高度 360、寬度 359、3 個通道
資料型態: uint8 # 每個像素值是 0–255 的整數
像素值 (BGR): [189 207 252] # 該座標像素的 BGR 值

👉 可以看到,OpenCV 影像就是 NumPy 的 ndarray


圖:使用程式讀取圖片並輸出 NumPy 陣列資訊

📊 NumPy 操作影像的好處

  • 快速運算:NumPy 的向量化運算比逐像素迴圈快很多。
  • 靈活操作:可以用切片(slice)快速裁切影像。
  • 數學工具:能直接做矩陣運算、統計分析。
  • 整合性強:方便與其他科學計算套件(Pandas、SciPy、TensorFlow)結合。

⚠️ 注意事項

  • OpenCV 預設顏色通道順序是 BGR,而不是常見的 RGB。
  • 影像的資料型態通常是 uint8(0~255),運算時要注意溢位。
  • NumPy 操作影像時,記得保持矩陣維度一致,避免出現 shape mismatch。

結語 🎯

理解 OpenCV 與 NumPy 的關係,是學習影像處理的第一步。
只要掌握「影像 = NumPy 陣列」這個核心概念,就能用 NumPy 的強大功能,靈活地操作影像資料。

接下來,我們將進入 影像基本操作,學習如何讀取、顯示、儲存圖片,以及進行大小調整與顏色轉換。


註:以上參考了
OpenCV Tutorials
OpenCV-Python Tutorials
NumPy-Learn