影像的色彩轉換
這篇教學會介紹使用 OpenCV 的 cvtcolor() 方法,將影像的色彩模型從 RGB 轉換為灰階、HLS、HSV...等。
快速導覽:
因為程式中的 OpenCV 會需要使用鏡頭或 GPU,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda ) ,並安裝 OpenCV 函式庫 ( 參考:OpenCV 函式庫 )。
色彩模型是什麼?
色彩模型 ( Color model ) 是一種以數字來表示色彩的數學模型,例如在 RGB 的色彩模型裡,以 (255,0,0) 表示紅色,但在 HSV 的色彩模型中,紅色則是以 (0,100,100) 來表示,用的色彩模型有:
RGB ( 紅、綠、藍 )
RGB 顏色模型也稱做三原色光模型,是一種「加色」模型,將紅 ( Red )、綠 ( Green )、藍 ( Blue ) 三原色的色光以不同的比例相加,混合產生各種色彩的光線,通常表現方式會使用 (255,255,255) 或十六進位 FFFFFF 來表現 ( 參考:三原色光模式 )。
RGBA ( 紅、綠、藍、alpha )
RGBA 顏色模型由 RGB 色彩模型和 Alpha 通道組成。RGBA 代表紅 ( Red )、綠 ( Green )、藍 ( Blue ) 和 Alpha 通道,alpha 通道為影像的不透明度參數,數值可以用百分比、整數或者使用 0 到 1 的實數表示。例如,若一個像素的 Alpha 通道數值為0% 表示完全透明的,無法被看見,如果數值為 100% 則是完全不透明 ( 參考:RGBA )。
HSV ( 色相、飽和度、明度 )、HSL ( 色相、飽和度、亮度 )
HSL 和 HSV 顏色模型都是一種將 RGB 色彩模型中的點,轉變在圓柱坐標系中的表示法。HSL 是色相、飽和度、亮度 ( Hue、Saturation、Lightness ),HSV 是色相、飽和度、明度 ( Hue、Saturation、Value ),又稱 HSB ( Brightness )。
HSL 和 HSV 模型都把顏色描述在圓柱坐標系內的點,這個圓柱的中心軸取值為自底部的黑色到頂部的白色而在它們中間的是灰色,繞這個軸的角度對應於「色相」,到這個軸的距離對應於「飽和度」,而沿著這個軸的高度對應於「亮度」、「色調」或「明度」 ( 參考:HSL 和 HSV 色彩空間 )。
GRAY ( 灰階 )
灰階是每個像素只有最暗黑色到最亮的白色的灰階,灰階影像在黑色與白色之間還有許多級的顏色深度,用於顯示的灰階影像,通常用每個採樣像素 8bits 的非線性尺度,內容可以包含 256 種灰階 ( 8bits 表示 2 的 8 次方 = 256 )。
cvtcolor() 色彩轉換
使用 OpenCV 的 cvtcolor() 方法,可以將轉換影像色彩,使用方法如下:
cv2.cvtColor(img, code)
# img 來源影像
# code 要轉換的色彩空間名稱
常用的色彩空間代碼如下 ( 完整參考:ColorConversionCodes ):
代碼 | 說明 |
---|---|
cv2.COLOR_BGR2BGRA | RGB 轉 RGBA。 |
cv2.COLOR_BGRA2BGR | RGBA 轉 RGB。 |
cv2.COLOR_BGR2GRAY | RGB 轉灰階。 |
cv2.COLOR_BGR2HSV | RGB 轉 HSV。 |
cv2.COLOR_RGB2HLS | RGB 轉 RSL。 |
下方的程式碼執行後,會將來源的彩色圖片,轉換成灰階影像。
import cv2
img = cv2.imread('meme.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 轉換成灰階影像
cv2.imwrite('oxxo', img)
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()
下方的程式碼執行後,會將來源的彩色影片,轉換成灰階影片。
import cv2
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
ret, frame = cap.read()
if not ret:
print("Cannot receive frame")
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 轉換成灰階影像
cv2.imshow('oxxostudio', gray)
if cv2.waitKey(1) == ord('q'):
break # 按下 q 鍵停止
cap.release()
cv2.destroyAllWindows()
參考資料
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~