在 OpenCV 中,色彩空間(Color Space)指的是表示顏色的一種方式,或是用數學模型對顏色的表達。不同的色彩空間采用不同的方式來描述顏色的三要素(如亮度、飽和度、色調),因此可以在不同的應用場景下提供不同的優點。
在計算機視覺和圖像處理中,了解和轉換不同的色彩空間是非常重要的,因為某些操作(例如,目標檢測、圖像分割、特征提取等)在某些色彩空間中比在其他色彩空間中更加有效。
1. 常見的色彩空間
OpenCV 支持多種色彩空間的轉換。以下是常見的幾種色彩空間:
1.1 RGB(Red, Green, Blue)和?BGR(Blue, Green, Red)
RGB:
- RGB 是最常用的色彩空間,尤其是在顯示設備(如顯示器、電視)中。每種顏色通道(紅、綠、藍)用一個整數值表示,通常是 0 到 255(即 8 位表示)。
- 該色彩空間直觀且易于理解,主要用于顯示和圖像采集。每個顏色通道的值分別代表圖像中的紅、綠和藍的強度。
BGR:
- BGR 是 OpenCV 中的默認色彩空間。雖然 RGB 更常見,但 OpenCV 默認讀取圖像為 BGR 格式。這是因為 OpenCV 設計時參考了早期的一些硬件標準。
- 在 BGR 色彩空間中,藍色(Blue)是第一個通道,綠色(Green)是第二個通道,紅色(Red)是第三個通道。
- opencv中imread、imshow、imwrite都是使用的BGR的順序。
import cv2# 讀取 RGB 圖像
img_bgr = cv2.imread('./images/bg.jpg')
print(img_bgr.shape) # 輸出圖像的尺寸,通常是 (height, width, channels)
print(img_bgr[0, 0, :]) # 查看第一像素的顏色值 [192 162 105] [B,G,R]
cv2.imshow('bgr', img_bgr)img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_RGB2BGR)
print(img_rgb.shape)
print(img_rgb[0, 0, :]) # 查看第一像素的顏色值 [105 162 192] [R,G,B]
cv2.imshow('rgb', img_rgb) # 圖像轉成RGB后imshow顯示會有所變化cv2.waitKey(0)
cv2.destroyAllWindows()
1.3 HSV(Hue, Saturation, Value)
-
HSV 是一種在色彩選擇、圖像分割和增強中非常常用的色彩空間。它通過三個參數來描述顏色:色調(Hue)、飽和度(Saturation)和明度(Value)。
- 色調(H):顏色的類型,通常表示為角度,范圍為 0° 到 360°,例如,紅色為 0°,綠色為 120°,藍色為 240°。
- 飽和度(S):顏色的純度或強度,范圍是 0 到 100%。0 表示灰色,100% 表示最純的顏色。
- 明度(V):顏色的亮度或亮度,范圍是 0 到 100%。0 表示完全黑色,100% 表示最亮的顏色。
-
在 HSV 空間中,圖像的顏色信息更符合人類的視覺感知,通常在圖像分割、顏色跟蹤等任務中表現優異。
# BGR 轉換到 HSV
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
print(img_hsv) # (200, 300, 3)
print(img_hsv[0,0,:]) # 第一個像素的hsv值:[100, 116, 192] [h,s,v]
1.4 HLS(Hue, Lightness, Saturation)
- HLS 色彩空間與 HSV 相似,但將飽和度和亮度的位置交換。HLS 也常用于色彩處理,它比 HSV 更能模擬人眼對顏色的感知。
- 色調(H):與 HSV 中的色調相同,表示顏色的類型。
- 亮度(L):亮度的描述,不同于 HSV 中的明度,HLS 中的亮度表現方式與實際視覺體驗更接近。
- 飽和度(S):顏色的飽和度,范圍 0 到 100%。
# BGR 轉換到 HLS
img_hls = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HLS)
print(img_hls.shape) # (200, 300, 3)
print(img_hls[0,0,:]) # [100 149 104]
1.5 Lab(CIELAB)
-
Lab 是一種基于人類視覺感知的色彩空間,分為三個通道:
- L:亮度(Lightness),范圍是 0 到 100,0 表示黑色,100 表示白色。
- a:綠色到紅色的色差,負值表示綠色,正值表示紅色。
- b:藍色到黃色的色差,負值表示藍色,正值表示黃色。
-
Lab 色彩空間的一個重要特點是它是與設備無關的(與顯示設備的亮度、對比度等無關),因此在許多圖像處理任務中具有很好的穩定性。
# BGR 轉換到 Lab
img_lab = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2LAB)
print(img_lab.shape) # (200, 300, 3)
print(img_lab[0,0,:]) # [163 117 107]
1.6 YUV
- YUV 色彩空間常用于視頻編碼和廣播電視等應用。它將顏色分為亮度分量(Y)和色度分量(U 和 V),因此能夠更有效地處理視頻圖像。
- Y:亮度分量(Luminance),范圍是 0 到 255。
- U 和 V:色度分量,表示色彩信息,范圍是 -128 到 127。
# BGR 轉換到 YUV
img_yuv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2YUV)
print(img_yuv.shape) # (200, 300, 3)
print(img_yuv[0,0,:]) # [148 150 90]
2. 常見色彩空間轉換
OpenCV 提供了非常方便的色彩空間轉換函數 cv2.cvtColor
。以下是一些常見的色彩空間轉換:
-
BGR 到 HSV:
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
-
BGR 到 RGB:
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
-
BGR 到 Lab:
img_lab = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2LAB)
-
BGR 到 YUV:
img_yuv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2YUV)
-
RGB 到 HSV:
img_hsv = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2HSV)
3. 使用色彩空間的場景
3.1 圖像分割
在某些色彩空間(例如 HSV、Lab)中,分割圖像中的不同顏色區域比在 RGB 空間中更為簡便。例如,我們可以通過設置合適的色調、飽和度和亮度閾值來提取特定顏色的區域。
3.2 目標追蹤
HSV 和 HLS 空間的色調分量對于目標追蹤特別有效,尤其是在目標的顏色變化較大時,使用色調(H)來進行追蹤更為準確。
3.3 顏色校正與增強
Lab 和 YUV 空間在顏色校正和增強中非常常用,特別是在改變圖像的亮度、對比度、飽和度時。
4. 總結
OpenCV 支持多種色彩空間,每種色彩空間有其特定的優點,選擇合適的色彩空間可以幫助我們更好地完成圖像處理任務。常見的色彩空間包括 RGB、BGR、HSV、HLS、Lab 和 YUV,每個空間通過不同的方式表示顏色信息。在進行圖像處理時,理解這些色彩空間的特點和如何在它們之間進行轉換是非常重要的。