python 颜色空间转换_OpenCV-Python入门教程4-颜色空间转换

一、颜色空间转换

importcv2import numpy as np

img = cv2.imread('lena.jpg')

#转换成灰度图

img_gray =cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

cv2.imshow('img', img)

cv2.imshow('gray', img_gray)

cv2.waitKey(0)

颜色转换其实是数学运算,如灰度化最常用的是:gray = R* 0.299 + G* 0.587 + B * 0.114

二、视频中特定颜色物体追踪

HSV:色调(H),饱和度(S),明度(V)。对光照的变换并不是很敏感,相比于BGR更易于区分颜色,常用于颜色识别的模型。转换模式用COLOR_BGR2HSV表示

OpenCV中色调H的范围为[0, 179],饱和度S是[0, 255],明度V是[0, 255]。虽然H的理论数值是0°~360°,但8位图像像素点的最大值是255,所以OpenCV除以了2.

现在,我们实现一个使用HSV来只显示视频中蓝色物体的例子,步骤如下:

1. 捕获视频中一帧

2. 从BGR转换到HSV

3. 提取蓝色范围的物体

4. 只显示蓝色物体

#蓝色的hsv值

blue = np.uint8([[[255, 0, 0]]])

hsv_blue=cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)print(hsv_blue)

[[[120 255 255]]]

#绿色的hsv值

green = np.uint8([[[0, 255, 0]]])

hsv_green=cv2.cvtColor(green, cv2.COLOR_BGR2HSV)print(hsv_green)

[[[ 60 255 255]]]

#红色的hsv值

red = np.uint8([[[0, 0, 255]]])

hsv_red=cv2.cvtColor(red, cv2.COLOR_BGR2HSV)print(hsv_red)

[[[ 0 255 255]]]

importnumpy as np

capture=cv2.VideoCapture(0)#蓝色的范围,不同光照条件下不一样,可灵活调整

lower_blue = np.array([100, 110, 110])

upper_blue= np.array([130, 255, 255])while(True):#1. 捕获视频中的一帧

ret, frame =capture.read()#2.从BGR转换到HSV

hsv =cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)#3. inRange(): 介于lower/upper之间的白色,其余黑色

mask =cv2.inRange(hsv, lower_blue, upper_blue)#4. 只保留原图中的蓝色部分

res = cv2.bitwise_and(frame, frame, mask=mask)

cv2.imshow('frame', frame)

cv2.imshow('mask', mask)

cv2.imshow('res', res)if cv2.waitKey(1) == ord('q'):break

当然,你也可以只显示视频中红色或者绿色的物体。只要修改一下HSV值的上下限即可。

三、在视频中同时提取红、绿、蓝色的物体

capture =cv2.VideoCapture(0)#蓝色的范围,不同光照条件下不一样,可灵活调整

lower_blue = np.array([100, 110, 110])

upper_blue= np.array([130, 255, 255])#绿色的范围

lower_green = np.array([40, 110, 110])

upper_green= np.array([70, 255, 255])#红色的范围

lower_red = np.array([160, 110, 110])

upper_red= np.array([179, 255, 255])while(True):#1. 捕获视频中的一帧

ret, frame =capture.read()#2.从BGR转换到HSV

hsv =cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)#3. inRange(): 介于lower/upper之间的白色,其余黑色

mask_blue =cv2.inRange(hsv, lower_blue, upper_blue)

mask_green=cv2.inRange(hsv, lower_green, upper_green)

mask_red=cv2.inRange(hsv, lower_red, upper_red)

mask= mask_blue + mask_green +mask_red#4. 只保留原图中的蓝色部分

res = cv2.bitwise_and(frame, frame, mask=mask)

cv2.imshow('frame', frame)

cv2.imshow('mask', mask)

cv2.imshow('res', res)if cv2.waitKey(1) == ord('q'):break

四、小结

cv2.cvtColor()函数用来进行颜色空间转换,常用BGR↔RGB,BGR↔Gray,BGR↔HSV

HSV颜色模型常用于颜色识别,要想知道某种颜色在HSV下的值,可以将它的BGR值用cvtColor()转换得到

你可能感兴趣的:(python,颜色空间转换)