本篇文章介绍简单图像处理的颜色空间转化。
环境:Windows 7(64) Python 3.6 OpenCV3.4.2
一、颜色空间转化
主要学习RGB转化为Gray,RGB转化为HSV。学习的函数是cvtColor()。
1.1 cvtColor()函数介绍
函数形式如下:
dst = cv.cvtColor( src, code[, dst[, dstCn]])
功能:将一个图像从一个颜色空间转化为另一个颜色空间。在RGB颜色空间转换情况下,应明确指定通道的顺序(RGB或BGR)。请注意,OpenCV中的默认颜色格式通常称为RGB,但它实际上是BGR(字节相反)。因此,标准(24位)彩色图像中的第一个字节将是8位蓝色分量,第二个字节将为绿色,第三个字节将为红色。
参数:
src:原图像
dst:结果图像。颜色空间转化后的图像
code:颜色空间转化标志符。指定将转化为何种颜色空间。
code的取值如下所示,列举部分常用的,所有的取值请查看ColorConversionCodes:
cv.COLOR_BGR2BGRA/cv.COLOR_RGB2RGBA:增加一个alpha通道。
cv.COLOR_BGRA2BGR/cv.COLOR_RGBA2RGB:去掉alpha通道。
cv.COLOR_BGR2RGB/cv.COLOR_RGB2BGR:RGB与BGR之间相互转化。
cv.COLOR_BGR2GRAY/cv.COLOR_RGB2GRAY:转化为灰度图像
cv.COLOR_BGR2BGR565/ cv.COLOR_RGB2RGB565:RGB图像转化为16为图像(BR都是5bit,G是6bit)
cv.COLOR_GRAY2BGR565:灰度图像转化为BGR565图像
cv.COLOR_BGR2XYZ:RGB空间转化为XYZ空间
cv.COLOR_BGR2YCrCb:RGB空间转化为YCrCb空间
cv.COLOR_BGR2HSV:RGB空间转化为HSV空间
cv.COLOR_BGR2Lab:RGB空间转化为Lab空间
1.2 代码实现
实现一个简单的功能,将摄像头拍摄的每一帧转化为HSV颜色空间,然后提取出特定颜色的对象,本文提取蓝色区域。用到的筛选函数是inRange(),形式如下:
dst = cv.inRange( src, lowerb, upperb[, dst] )
功能:检查数组元素是否位于lowerb和upperb之间。
参数:
src:输入数组
lowerb:下限
upperb:上限
dst:结果数组,大小和src一样大,数据类型是CV_8U。
所以整个代码如下:
import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
# 抓取帧
_, frame = cap.read()
#BGR转化为HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
#[110,43,46]~[124,255,255]蓝色区间
lower_blue = np.array([100,43,46])
upper_blue = np.array([124,255,255])
# 筛选
res = cv.inRange(hsv, lower_blue, upper_blue)
cv.imshow('frame',frame)
cv.imshow('res',res)
k = cv.waitKey(5) & 0xFF
if k == 27:
break
cv.destroyAllWindows()
cap.release()
运行结果如下:
可以看到,左图蓝色部分,在右图中就是白色,左图中其他颜色,在右图中都是黑色。