4. OpenCV--色彩空间(Color Space)

》》点赞,收藏+关注,理财&技术不迷路《《

目录:

先总结:

色彩空间种类和定义的理论掌握

转换方法:XXX = cv.cvtColor(image, cv.COLOR_BGR2XXX)

调用opencv内部函数都属于调用他的API接口

视频输入读取: capture = cv.VideoCapture(“ ”)

ret, frame = capture.read()

第一个参数ret 为True 或者False,代表有没有读取到图片, ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。

第二个参数frame表示截取到一帧的图片,frame就是每一帧的图像,是个三维矩阵.

通过hsv来追踪颜色:

         hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)

        lower_hsv = np.array([0,0,221])

        upper_hsv = np.array([180,30,255])

        # 这里追踪白色,得到的是一个二值图像

        mask = cv.inRange(hsv,lowerb=lower_hsv,upperb=upper_hsv)

通道分割与合并:

分割:r, g, b = cv.split(src)

单独修改某个通道:src[ :, :, 0/1/2 ] = 0/?

合并:cv.merge( [r, g, b] ) 

 

4.1 定义及空间种类

 

纯黑:0 0 0

纯白:255, 255, 255

 

三原色:红、绿、蓝,这三种光波是自然界所有颜色的基础,任何颜色都可以由这三种颜色混合而来。

 

每种颜色按亮度分为0~255共256个等级(不了解亮度可以看第一节),0表示亮度为0%,255表示亮度为100%,这是我们首先要知道的,数值表示的是颜色的亮度。

三种颜色的不同亮度相互组合成立大千世界,这些数值可以表示256*256*256=1678万中颜色,对于电脑再现大千世界绰绰有余了。但为什么是255呢,这关于到色彩位数2^8=256,,表示这是8位色彩深度,色彩深度是计算机图形学领域表示在位图或者视频帧缓冲区中储存1像素的颜色所用的位数,位数越多,能表示的颜色越多。

HSV:

H:hue 色调

为什么还要用HSV来表示?因为HSV在差异性很大的色彩中很好用,他能很大的突出途中某些很突出的颜色

HSV: H: 0-360. SV:0-255.

但是实际中opencv H是0-180, 因为其他都是0-255, 所以用uint8 , 2的8次就可以表示,但是要是到360的话就会溢出。所以缩小取值范围让它满足取值范围。

HIS:I:intensive 灰度级别。S:Saturation 饱和度

YCrCb:多用于检测皮肤

YUV:Android开发。

 

4.2 RGB转化为其他:

重点:RGB —— HSV!!!!

gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)

yuv = cv.cvtColor(image, cv.COLOR_BGR2YUV)

Ycrcb = cv.cvtColor(image, cv.COLOR_BGR2YCrCb)

………………...

 

上面表格中在色彩空间里面都特别容易区分,所以我们用 inRange 来区分,能直接把这些颜色的HSV值提取出来。

比如某个像素点 他的坐标都位于 黑色的HSV 区域,那么这个像素点一定是黑色。

这个表格是经验总结表,很重要:!!!!

比如你想提取图中所有黄色点,那么满足 h [26, 34], s [43, 255], v[46, 255] 这三个要求的所有点都可以提取为黄色。上面三个通道,最大值最小值总6个值,就可以过滤出所有黄色的点了。

做颜色物体跟踪的关键!!

 

4.3 通过hsv追踪颜色(cv.irange(hsv, 下限,上限))

通过hsv追踪的最后都是二值图,你追踪的颜色就是白色,没追踪的全部为黑色。

这里牢牢的追踪了白色。

 

4.4 通道的分割与合并

cv2.split函数分离得到各个通道的灰度值(单通道图像)。

改变某个单独通道的值:

通过merge()来合并:

cv2.merge函数是合并单通道成多通道(不能合并多个多通道图像)。