更新於 2024/08/22閱讀時間約 2 分鐘

[OpenCV][Python]提取出特定的色彩通道(RGB,HSV)

在 OpenCV 中,將圖片從 BGR 色彩空間轉換為灰階圖像時常用cv2.COLOR_BGR2GRAY ,此函數使用了特定的權重來計算灰階值。這些權重是基於人眼對不同顏色的敏感度進行調整的。


BGR2GRAY權重

Gray=0.299×R+0.587×G+0.114×B


這些權重反映了人眼對不同顏色的敏感度,綠色對人眼的影響最大,因此權重最高,而藍色的影響最小,因此權重最低。

相反的在AVI檢測,如果特徵是紅色或者是藍色,都使用這個方式來轉換灰階,這樣顏色的特徵性就會降低

本文將介紹使用其他方法來提取特定的色彩通道


在後面會使用到HSV來切割色彩通道,故先說明,這樣看結果圖比較容易理解。

HSV 色彩通道的組成:

Hue(色相):

表示顏色的色調,它用角度來表示,範圍通常為 0 到 360 度。這些角度對應於顏色在色環中的位置:

色相可以用來區分不同的顏色。

    • 0° 是紅色
    • 60° 是黃色
    • 120° 是綠色
    • 180° 是青色
    • 240° 是藍色
    • 300° 是洋紅色
  • 在 OpenCV 中,H (色相)值的範圍是0到180 而不是 0 到 360

Saturation(飽和度):

Saturation 表示顏色的鮮艷程度或純度,範圍通常為 0 到 100%。飽和度為 0% 表示灰色(完全沒有顏色),而飽和度為 100% 表示純色(顏色最鮮豔)。

Value(明度):
Value 表示顏色的亮度或光強度,範圍通常為 0 到 100%。明度為 0% 時表示黑色(完全沒有光),而明度為 100% 時表示最亮的顏色。

  • 在 OpenCV 中,S(飽和度)和 V(明度)的範圍是 0 到 255

結果圖

灰階值數值越高越白,越低則越黑,全白= 255,全黑 =0

在RGB通道中,黃金獵犬與背景顏色中,黃色占比較高,黃色主要為R跟G混合而成,所以在R與G通道原先黃色的位置就會比較白。

H為色相,黃色算數值比較低的,故灰階值較低就會比較暗一點

S為飽和度,圖像中色彩較鮮艷的地方,轉換灰階值就會比較亮一點

V為明亮度,


取出特定的色彩通道的函式

def __Color_split_img(img: np.ndarray, Color_split_choose: str):
'''
Changing Colorspace for BGR -> Gray,R,G,B,H,S,V
'''
if len(img.shape) == 2:
return img

if Color_split_choose == 'Gray':
split_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
elif Color_split_choose in ('R','G','B'):
B, G, R, = cv2.split(img)
if Color_split_choose == 'R':
split_img = R
elif Color_split_choose == 'G':
split_img = G
elif Color_split_choose == 'B':
split_img = B
elif Color_split_choose in ('H','S','V'):
H, S, V, = cv2.split(img)
if Color_split_choose == 'H':
split_img = H
elif Color_split_choose == 'S':
split_img = S
elif Color_split_choose == 'V':
split_img = V
else:
return img
return split_img
  • HSV 色彩空間轉換: 在分割 H、S、V 通道之前,必須先將圖片從 BGR 色彩空間轉換為 HSV 色彩空間。這是透過 cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 來完成的。
  • 灰度圖像檢查: 如果圖片已經是灰度圖像(即圖片只有兩個維度),則直接返回這個灰度圖像,不做其他處理。
  • 錯誤處理: 在 else 分支中,如果用戶輸入了一個無效的 Color_split_choose 選項,程式將返回原始圖片,以防止未定義行為的發生。



分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.