Like Share Discussion Bookmark Smile

J.J. Huang   2026-01-15   Python OpenCV 03.圖片處理篇:基礎技巧   瀏覽次數:次   DMCA.com Protection Status

Python | OpenCV 灰階化與色彩空間轉換

📚 前言

在前面我們學會了如何查詢圖片與影片的基本屬性。
這一篇要進一步學習 灰階化與色彩空間轉換,這是影像處理的基礎操作之一,常用於影像分析、特徵擷取與前處理。

🎨 基本概念

  • 灰階化 (Grayscale):將彩色圖片轉換為單通道灰階圖片,常用於簡化影像處理。
  • 色彩空間轉換 (Color Space Conversion):不同的色彩模型適合不同的應用,例如:
    • BGR ↔ Gray
    • BGR ↔ HSV
    • BGR ↔ LAB
    • BGR ↔ YCrCb

🎨 色彩模型是什麼

色彩模型 (Color model) 是一種用數字來表示顏色的數學方式。它定義了顏色如何被描述、儲存與運算。不同的色彩模型會用不同的數值組合來表示同一種顏色,目的在於讓電腦能夠理解並處理顏色。

常見色彩模型解釋

  • RGB (Red, Green, Blue) 參考
    • 以三原色光的強度組合來表示顏色。
    • 例如:紅色 = (255, 0, 0),綠色 = (0, 255, 0)。
    • 常用於顯示器、數位影像。
  • HSV (Hue, Saturation, Value)參考
    • 用「色相、飽和度、亮度」來描述顏色,更接近人眼感知方式。
    • 例如:紅色 = (0°, 100%, 100%)。
    • 常用於顏色篩選、物件追蹤。
  • Lab (Lightness, a, b)參考
    • 基於人眼感知的均勻色彩模型,能更準確描述色差。
    • 常用於顏色校正、印刷比對。
  • Gray (灰階)參考
    • 單通道,僅保留亮度資訊。
    • 常用於邊緣檢測、二值化。
  • YCrCb參考
    • 分離亮度 (Y) 與色度 (Cr, Cb),常用於影像壓縮。
    • 例如 JPEG 就是基於 YCrCb。

🧩 常見應用場景

色彩模型 應用範例
RGB/BGR 顯示與存儲:螢幕顯示、數位影像的基本格式
HSV 顏色篩選與分割:例如偵測紅色物件、追蹤球體、交通號誌辨識
Lab 顏色校正與色差分析:影像增強、印刷色彩比對
Gray 邊緣檢測與二值化:Canny 邊緣偵測、人臉識別前處理
YCrCb 影像壓縮與膚色偵測:常用於 JPEG 壓縮、膚色區域分割

💻 範例程式:圖片灰階化與色彩空間轉換

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import cv2

img = cv2.imread("test.png")

# BGR → Gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# BGR → HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# BGR → Lab
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)

# BGR → YCrCb
ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)

# BGR → RGB (OpenCV 預設是 BGR)
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 顯示結果
cv2.imshow("Gray", gray)
cv2.imshow("HSV", hsv)
cv2.imshow("Lab", lab)
cv2.imshow("YCrCb", ycrcb)
cv2.imshow("RGB", rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:圖片灰階化與色彩空間轉換示例


圖:圖片灰階化與色彩空間轉換示例圖

🎬 範例程式:影片灰階化與色彩空間轉換

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import cv2

cap = cv2.VideoCapture("video.mp4")

while True:
ret, frame = cap.read()
if not ret:
break

# 灰階化
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lab = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)

# 縮小影格 (方便 Demo 縮小到 50%)
scale = 0.5
frame_small = cv2.resize(frame, None, fx=scale, fy=scale)
gray_small = cv2.resize(gray, None, fx=scale, fy=scale)
hsv_small = cv2.resize(hsv, None, fx=scale, fy=scale)
lab_small = cv2.resize(lab, None, fx=scale, fy=scale)

# 顯示結果
cv2.imshow("Frame", frame_small)
cv2.imshow("Gray", gray_small)
cv2.imshow("HSV", hsv_small)
cv2.imshow("Lab", lab_small)

if cv2.waitKey(30) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()


圖:影片逐格灰階化與色彩空間轉換示例


圖:影片逐格灰階化與色彩空間轉換示例圖

⚠️ 注意事項

  • 灰階化後通道數:灰階圖片只有單通道,處理時要注意 shape 變化。
  • 色彩空間差異:不同色彩模型適合不同應用,選擇要依需求而定。
  • 顯示問題:部分色彩空間(如 HSV、LAB)直接顯示時可能看起來怪異,因為它們不是設計來直接顯示的。
  • 影片處理效能:影片逐格轉換可能造成效能瓶頸,建議搭配壓縮或只處理部分影格。

🎯 結語

這一篇我們學會了如何將圖片與影片進行 灰階化與色彩空間轉換,理解不同色彩模型的特性與用途,並知道它們在實際應用中的角色。
下一篇將進一步學習 圖片縮放、旋轉與翻轉,掌握圖片幾何操作的技巧。

📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。


註:以上參考了
OpenCV Tutorials
OpenCV-Python Tutorials
OpenCV-Python Color Space Conversions