Opencv中有數(shù)百種關(guān)于在不同色彩空間之間轉(zhuǎn)換的方法。當(dāng)前痒玩,在計算機視覺中有三種常見的色彩空間:灰度,BGR以及HSV(Hue:色調(diào)呛谜,Saturation:飽和度市怎,Value:黑暗的程度)
1).灰度色彩空間是通過去除彩色信息來將其轉(zhuǎn)換成灰階糠排,灰度色彩空間對中間處理特別有效,比如人臉檢測蠢壹。
2).BGR,即藍(lán)-綠-紅色彩空間嗓违,每一個像素點都由一個三元數(shù)組來表示,分別代表藍(lán)图贸、綠蹂季、紅三種顏色冕广。網(wǎng)頁開發(fā)者可能熟悉另一個與之相似的顏色空間:RGB,它們只是在顏色的順序上不同偿洁。
3).HSV,H(Hue)是色調(diào)撒汉,S(Saturation)是飽和度,V(Value)表示黑暗的程度(或光譜另一端的明亮程度)
BGR的簡短說明:當(dāng)?shù)谝淮翁幚鞡GR色彩空間時,可以不要其中的一個色彩分量涕滋,比如像素值[0, 255, 255](沒有藍(lán)色睬辐,綠色分量取最大值,紅色分量取最大值)表示黃色宾肺。
PS:計算機所使用的顏色模型具有可加性并且處理的是光照溯饵,而繪畫遵從的是減色模型,計算機使用顯示器發(fā)光來做顏色的媒介锨用,故計算機上的軟件使用的是加色模型丰刊。
1.轉(zhuǎn)換顏色空間
在 OpenCV 中有 超過百種進行顏色空間轉(zhuǎn)換的方法。但是你以后就會發(fā)現(xiàn)我們經(jīng)常用到的也就兩種:BGR?Gray 和 BGR?HSV增拥。
我們用到的函數(shù)是cv2.cvtColor(input_image?ag)啄巧,其中?ag就是轉(zhuǎn)換類型。
對于BGR?Gray的轉(zhuǎn)換跪者,我們使用的?ag就是cv2.COLOR_BGR2GRAY棵帽。
同樣對于BGR?HSV的轉(zhuǎn)換我們用的?ag就是cv2.COLOR_BGR2HSV。
import cv2
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(len(flags))? #274
PS:在 OpenCV 的 HSV 格式中渣玲,H(色彩/色度)的取值范圍是 [0,179]弟晚, S(飽和度)的取值范圍 [0忘衍,255],V(亮度)的取值范圍 [0卿城,255]枚钓。但是不同的軟件使用的值可能不同。所以當(dāng)你拿 OpenCV 的 HSV 值與其他軟件的 HSV 值對比時瑟押,一定要記得歸一化搀捷。
2.目標(biāo)跟蹤(針對顏色)cv2.inRange()??cv2.bitwise_and()
現(xiàn)在我們知道如何將BGR圖像轉(zhuǎn)換為HSV,我們可以使用它來提取彩色對象多望。在HSV中嫩舟,表示顏色比表示RGB顏色空間更容易。在我們的應(yīng)用程序中怀偷,我們將嘗試提取藍(lán)色對象家厌。下面是方法:
import cv2
import numpy as np
img = cv2.imread('pinggai.jpg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)? #轉(zhuǎn)換到HSV
#設(shè)定藍(lán)色的閥值
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
#根據(jù)閥值構(gòu)建掩模
mask = cv2.inRange(hsv,lower_blue,upper_blue)
#對原圖和掩模進行位運算
res = cv2.bitwise_and(img,img,mask,mask)
cv2.imshow('img',img)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
k = cv2.waitKey()
cv2.destroyAllWindows()
PS:噪點還是很多,想啊喲更好看點椎工,需要消減噪音
3.找到要跟蹤對象的HSV值
只需傳遞所需的BGR值饭于,而不是傳遞圖像
green = np.uint8([[[0,255,0 ]]])
hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print(hsv_green)? ?# [[[ 60 255 255]]]
現(xiàn)在你把[ H - 10蜀踏,100,100 ]和[ H + 10掰吕,255果覆,255 ]分別作為下界和上界。除此之外殖熟,您還可以使用任何圖像編輯工具(如GIMP或任何在線轉(zhuǎn)換器)來查找這些值局待,但不要忘記調(diào)整HSV范圍