作者:小郭学数据
源自:快学python
学习视频可参见python opencv3.3视频教学 基础入门[1]
今天写的是色彩空间的转换
1.常见色彩空间及色彩空间转换
- RGB
- 红色:Red,绿色:Green,蓝色:Blue
- HSV
- 色相:Hue(0-180),饱和度:Saturation(0-255),明度;Value(0-255)
- 常用于颜色检测
- HSL/HLS
- 色相:Hue、饱和度:Saturation、亮度:Lightness/Luminance
- 色相H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°
- YUV
- YUV不是几个英文单词的组合词,而是符号,Y表示亮度,UV用来表示色差,U、V是构成彩色的两个分量
- YUV 色彩模型来源于rgb模型,该模型的特点是将亮度和色度分离开,从而适合于图像处理领域。
- YCrCb
- Y:亮度分量,Cb:蓝色色度分量,Cr:红色色度分量
- YCbCr模型来源于yuv模型,应用于数字视频
- 常用于肤色检测 色彩空间demo
def color_space_demo(image):
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
cv.imshow("gray",gray)
hsv=cv.cvtColor(image,cv.COLOR_BGR2HSV)
cv.imshow("hsv",hsv)
hls=cv.cvtColor(image,cv.COLOR_BGR2HLS)
cv.imshow("hls",hls)
yuv = cv.cvtColor(image, cv.COLOR_BGR2YUV)
cv.imshow("yuv", yuv)
ycrcb = cv.cvtColor(image, cv.COLOR_BGR2YCrCb)
cv.imshow("ycrcb", ycrcb)
运行结果如下:
2.跟踪视频中指定颜色,inRange
HSV颜色分量范围
inRange函数说明:
代码语言:javascript复制mask = cv2.inRange(hsv, lower, upper)
- hsv:rgb图像转换为hsv格式的图像
- lower:图像中低于这个lower的值,图像值变为0,即变为黑
- upper:图像中高于这个upper的值,图像值变为0,即变为黑
- 在lower~upper之间的值变成255,即变为白 inRange用于实现图片的二值化
从视频中获取绿色分量代码如下:
代码语言:javascript复制# 可从视频中跟踪指定颜色,指定颜色置为白,其余置为黑
def extract_object_demo():
capture=cv.VideoCapture("./images/vtest.avi")
while(True):
ret,frame=capture.read()
if ret ==False:
break
hsv=cv.cvtColor(frame,cv.COLOR_BGR2HSV)
lower_hsv = np.array([35, 43, 46]) # 对应的绿色的hsv中h,s,v的最小值
upper_hsv = np.array([77, 255, 255]) #对应的绿色的hsv中的h,s,v最大值
mask=cv.inRange(hsv,lowerb=lower_hsv,upperb=upper_hsv)
cv.imshow("video",frame)
cv.imshow("mask",mask)
c=cv.waitKey(40)
if c==27:
break
结果如下:
若想获得红色,蓝色等的分量可以从表中选取对应值进行操作
如果结果想凸显绿色,可进行像素间的与运算得到,下节课提到了。
代码如下:
代码语言:javascript复制 mask=cv.inRange(hsv,lowerb=lower_hsv,upperb=upper_hsv)
dst=cv.bitwise_and(frame,frame,mask=mask)
cv.imshow("video",frame)
cv.imshow("mask",mask)
cv.imshow("dst",dst)
video与dst窗口的对比图如下:
3.图像的分离与合并
3.1 分离
#显示各个通道的图像
代码语言:javascript复制 b,g,r=cv.split(src)
cv.imshow("blue",b)
cv.imshow("green",g)
cv.imshow("red",r)
原图与各个通道的对比图如下:
将绿色,红色通道置为0,获得新图像。
代码语言:javascript复制 src[:,:,2]=0
src[:,:,1]=0
cv.imshow("new image",src)
结果如下:
如果取原图和新图的蓝色通道慧发现是一样的,因为蓝色通道的值没有改变
3.2合并
将三通道分离出来的图片合并一起可以发现跟原图是一样的
代码语言:javascript复制 src=cv.merge([b,g,r]) #merge第一个参数mv是数组形式
cv.imshow("change_image",src)
结语
以上内容仅是自我学习时记录的笔记,欢迎大家批评指正,一起学习进步。
参考资料
[1]
python opencv3.3视频教学 基础入门: https://www.bilibili.com/video/BV1QW411F7e7?p=1