opencv-python改变颜色空间
cv.cvtColor()函数用于颜色空间转换。他的参数有两个,第一个是需要改变颜色空间的图片对象,第二个是需要转换成的类型。然后返回改变后的图片。
img1 = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
转换类型:
转换类型 | opencv2.x | opencv3.x |
---|---|---|
RGB<–>BGR | CV_BGR2BGRA 、CV_RGB2BGRA 、CV_BGRA2RGBA 、CV_BGR2BGRA、CV BGRA2BGR | COLOR_BGR2BGRA、COLOR_RGB2BGRA、COLOR_BGRA2RGBA、COLOR_BGR2BGRA、COLOR_BGRA2BGR |
RGB<–>GRAY | CV_RGB2GRAY、CV_GRAY2RGB、CV_RGBA2GRAY、CV_GRAY2GRBA | COLOR_RGB2GRAY、COLOR_GRAY2RGB 、COLOR_RGBA2GRAY、COLOR_GRAY2GRBA |
RGB<–>HSV | CV_BGR2HSV、CV_RGB2HSV、CV_HSV2BGR、CV_HSV2RGB | COLOR_BGR2HSV、COLOR_RGB2HSV、COLOR_HSV2BGR、COLOR_HSV2RGB |
RGB<–>YCrCb、JPEG(或YCC) | CV_RGB2YCrCb 、CV_RGB2YCrCb、CV_YCrCb2BGR 、CV YCrCb2RGB、(可以用 YUV代替 YCrCb) | COLOR_RGB2YCrCb、COLOR_RGB2YCrCb、COLOR_YCrCb2BGR、COLOR_ YCrCb2RGB (可以用 YUV代替YCrCb) |
RGB<–>CIE XYZ | CV_BGR2XYZ、CV_RGB2XYZ,、CV_XYZ2BGR,、CV_XYZ2RGB | XOLOR_BGR2XYZ、COLOR_RGB2XYZ、COLOR_XYZ2BGR、 COLOR_XYZ2RGB |
RGB<–>HLS | CV_BGR2HLS、CV_RGB2HLS、 CV_HLS2BGR、CV_HLS2RGB | COLOR_BGR2HLS、COLOR_RGB2HLS、COLOR_HLS2BGR、 COLOR_HLS2RGB |
RGB<–>CIE L*a*b | CV_BGR2Lab、CV_RGB2Lab、CV_Lab2BGR、CV_Lab2RG | COLOR_BGR2Lab、COLOR_RGB2Lab、COLOR_Lab2BGR,、COLOR_ Lab2RGB |
RGB<–>CIE L*a*b | CV_BGR2Luv、CV_RGB2Luv,、CV_LUV2BGR, CV Luv2RGB | COLOR BGR2Luv、COLOR_RGB2Luv、COLOR_Luv2BGR、COLOR Luv2RGB |
cv.inrange()函数,可实现二值化功能(这点类似threshold()函数),更关键的是可以同时针对多通道进行操作。他有四个参数,第一个是用来处理的图片,第二个是阈值下限,第三是阈值上限,第四个是处理后的图片。返回值是处理后的图片。
具体效果和threshold相似如果像素不在规定的阈值范围内,就是置为0.
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
mask = cv.inRange(hsv, lower_blue, upper_blue)
追踪想要的HSV值
可以使用相同的函数cv.cvtColor()。你只需传递你想要的BGR值,而不是传递图像。例如,要查找绿色的HSV值:
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
>>> print( hsv_green )
[[[ 60 255 255]]]
提取单个对象代码例子
import cv2 as cv
import numpy as np
cap = cv.VideoCapture("C:\\Users\\Administrator\\Desktop\\pic\\na.mp4")
while(1):
# 读取帧
_, frame = cap.read()
# 转换颜色空间 BGR 到 HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# 定义HSV中蓝色的范围
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# 设置HSV的阈值使得只取蓝色
mask = cv.inRange(hsv, lower_blue, upper_blue)
mask_inv =cv.bitwise_not(mask)
# 将掩膜和图像逐像素相加
res = cv.bitwise_and(frame,frame, mask= mask)
cv.namedWindow('frame',cv.WINDOW_NORMAL)
cv.namedWindow('mask',cv.WINDOW_NORMAL)
cv.namedWindow('res',cv.WINDOW_NORMAL)
cv.imshow('frame',frame)
cv.imshow('mask',mask)
cv.imshow('res',res)
k = cv.waitKey(5) & 0xFF
if k == 27:
break
cv.destroyAllWindows()
提取多个彩色对象
import cv2 as cv
import numpy as np
cap = cv.VideoCapture("C:\\Users\\Administrator\\Desktop\\pic\\na.mp4")
while(1):
# 读取帧
_, frame = cap.read()
# 转换颜色空间 BGR 到 HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# 定义HSV中蓝色的范围
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
lower_green=np.array([50,110,50])
upper_green=np.array([255,130,255])
lower_red=np.array([50,50,110])
upper_red=np.array([255,255,130])
# 设置HSV的阈值使得只取蓝色
maskb = cv.inRange(hsv, lower_blue, upper_blue)
maskb_inv =cv.bitwise_not(maskb)
maskg=cv.inRange(hsv, lower_green, upper_green)
maskg_inv=cv.bitwise_not(maskg)
maskr=cv.inRange(hsv, lower_red, upper_red)
maskr_inv=cv.bitwise_not(maskr)
mask=cv.add(maskb,maskg,0)
mask=cv.add(mask,maskr,0)
mask_inv=cv.add(maskb_inv,maskr_inv,0)
mask_inv = cv.add(mask_inv, maskg_inv, 0)
# 将掩膜和图像逐像素相加
res = cv.bitwise_and(frame,frame, mask= mask)
cv.namedWindow('frame',cv.WINDOW_NORMAL)
cv.namedWindow('mask',cv.WINDOW_NORMAL)
cv.namedWindow('res',cv.WINDOW_NORMAL)
cv.imshow('frame',frame)
cv.imshow('mask',mask)
cv.imshow('res',res)
k = cv.waitKey(5) & 0xFF
if k == 27:
break
cv.destroyAllWindows()