【翻譯】改變色彩空間
⚠️這個系列是自己瞎翻的,文法很醜,主要靠意會,跳著跳著撿重要的部分翻,翻錯了不負責,就這樣哈。
⚠️基於3.4.3,Changing Colorspaces,附原文。
目標
- 在這個教程中,你會學到如何把影象從一個色彩空間改變到另外一個。比如BGR ↔ Gray,BGR ↔ HSV等等。
- 除此之外,我們還將建立一個提取視訊中彩色物件的應用程式。
- 你會學到以下這些方法:cv.cvtColor(),cv.inRange() 等等。
改變顏色空間
這大概有150多種可用的顏色空間轉換的方法,在OpenCV裡。但咱們著眼於兩個應用最廣泛的:BGR ↔ Gray 以及 BGR ↔ HSV。
要改變顏色,我們使用方法 cv.cvtColor(input_image, flag) 引數flag決定影象轉換的型別。
要從BGR轉成Gray我們用這個標誌 cv.COLOR_BGR2GRAY。類似的,BGR轉成HSV,我們用 cv.COLOR_BGR2HSV 這個標誌。要知道其他的標誌,只要執行以下命令,在你Python的終端上:
>>> import cv2 as cv >>> flags = [i for i in dir(cv) if i.startswith('COLOR_')] >>> print( flags )
提示
對HSV來說,色調範圍是 [0,179] ,飽和度範圍是 [0,255] 數值範圍是 [0,255] 。不同的軟體使用了不同的標尺,所以,如果你要比較OpenCV中的數值和其他軟體給出的數值,你就需要把他們標準化。
物件跟蹤
現在我們知道如何把 BGR 影象轉成 HSV,我們可以使用這招來提取彩色物件。在 HSV 裡,展示出一種顏色比在 BGR 色彩空間裡更容易。在我們的應用裡,我們嘗試提取出藍色的物體,方法如下:
- 拿到視訊中的每一幀。
- 把色彩空間從 BGR 改到 HSV。
- 我們把藍色的範圍設定為 HSV 影象的閾值。
- 現在只提取藍色的物件,我們可以對這影象做任何我們想做的事情。
以下程式碼有詳細的註釋:
import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
# Take each frame
_, frame = cap.read()
# Convert BGR to HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# define range of blue color in HSV
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# Threshold the HSV image to get only blue colors
mask = cv.inRange(hsv, lower_blue, upper_blue)
# Bitwise-AND mask and original image
res = cv.bitwise_and(frame,frame, mask= mask)
cv.imshow('frame',frame)
cv.imshow('mask',mask)
cv.imshow('res',res)
k = cv.waitKey(5) & 0xFF
if k == 27:
break
cv.destroyAllWindows()
以下影象顯示了藍色物體的追蹤過程:
提示
影象中有些噪聲,我們會在下節看看怎麼消除他們。(譯者注:瞭解一下影象噪聲)
這是最最簡單的追蹤物體的方式,一旦你學會了關於輪廓的方法,你可以做很多事情,比如找物體質心來追蹤物體,對著攝像頭移動手指繪製圖表,以及很多其他好玩的事情。
如何找到HSV數值來追蹤呢
這是一個在 stackoverflow.com 這個網站上常見的問題。其實很簡單,你可以用同一個方法,cv.cvtColor() 。不是傳入一個影象物件,而是傳入你想要的 BGR 值,比如,要找到綠色的 HSV 值。嘗試以下的命令在你的Python終端上:
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
>>> print( hsv_green )
[[[ 60 255 255]]]
現在分別將 [H-10,100,100] 和 [H + 10,255,255] 作為下限和上限。 除了這種方法,你可以使用任何影象編輯工具,如GIMP或任何線上轉換器來查詢這些值,但不要忘記調整HSV範圍。
額外資源
練習
- 嘗試找到一個方法來提取更多的彩色物體,比如同時提取紅色、藍色、綠色的物體。
下篇:【翻譯】影象的幾何變換