OpenCV---色彩空间(一)

颜色空间:用三种或者更多特征来指定颜色的方法,被称为颜色空间或者颜色模型

1.RGB(OpenCV中为BGR):

一幅图像由三个独立的图像平面或者通道构成:红、蓝、绿(以及可选项:透明度alpha通道)
每个值代表每个像素的每个分量的度量值,值越高对应于更亮的像素
对应于人眼的三种光锥细胞,所以被广泛使用
RGB色彩空间源于使用阴极射线管的彩色电视,
RGB分别代表三个基色(R-红色、G-绿色、B-蓝色),具体的色彩值由三个基色叠加而成。
在图像处理中,我们往往使用向量表示色彩的值,如(0,0,0)表示黑色、(255, 255, 255)表示白色。
其中,255表示色彩空间被量化成255个数,最高亮度值为255(255 = 2^8 - 1,即每个色彩通道用8位表示)。
在这个色彩空间中,有256*256*256种颜色。RGB色彩空间如下图所示(图片来自百度百科)。是一个包含Red、Green、Blue的三维空间。

2.HSV

推文:OpenCV 自学笔记21. RGB色彩空间和HSV色彩空间的理解

H:0-360在OpenCV中被规范为0-180,若是360超出255溢出,所有规划到180,,8位可以保存,是HSV3位保存一致,都是只占一个字节
S和V:在OpenCV中规范化为0-255(一个字节就可以表示)

HSV颜色空间输入面向色度的颜色坐标系统的一种。这种类型的颜色模型接近人类颜色感知的仿真模型。
HSV的三个通道表示色度(H给出的颜色光谱构成的一种度量),饱和度(S给出主波长中的纯光比例,这表明一种颜色距离相同亮度灰度的程度)和纯度(V给出相对于白色光照强度的亮度),对应于直觉上的色彩、明暗和色调。HSV广泛应用于色彩的比较。

OpenCV中的imshow()函数假设图像的颜色以RGB显示,因此其他显示均不正确。所以首先必须将其转换成RGB颜色空间

3.HLS:

HLS属于面向色度的颜色坐标系统中的一种,和之前的HSV类似
用来指定每个通道中的一种颜色的色度值、明暗值、饱和度值
与HSV不同的是HSL定义的一种纯颜色的亮度等于一种中等灰色的亮度
而HSV定义的一种纯颜色的亮度等于白色的亮度

4.YCrCb

该空间广泛用于视频和图像压缩,不能算作纯粹的色彩空间,它是RGB颜色空间的一种解码方式
Y通道表示亮度,而Cr和Cb表示红色差值(在RGB空间中R通道和Y的差值)和蓝色差值(在RGB空间中B通道和Y的差值)各自的色度分量。

5.灰度图

每个像素值只表示灰度信息这一单一信息
RGB[A]准换成灰度:Y=0.299*R+0.587*G+0.114*B
灰度转换为RGB[A]:R=Y,G=Y,B=Y,A=max(ChannelRange)

推文:【OpenCV】笔记(9)——色彩空间和颜色处理

6.YUV

推文:YUV格式分析

Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B

R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U

7.色彩空间api相互转换

import cv2 as cv

def color_space_conv(image):
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) #RGB转灰度图
    cv.imshow("gray",gray)
    hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)   #RGB转HSV
    cv.imshow("hsv",hsv)
    yuv = cv.cvtColor(image,cv.COLOR_BGR2YUV)   #RGB转YUV
    cv.imshow("yuv",yuv)
    ycrcb = cv.cvtColor(image,cv.COLOR_BGR2YCrCb)#RGB转YCrCb
    cv.imshow("ycrcb",ycrcb)
    hls = cv.cvtColor(image,cv.COLOR_BGR2HLS)   #RGB转HLS
    cv.imshow("hls",hls)

src = cv.imread("./1.png")  #读取图片
cv.namedWindow("RGB",cv.WINDOW_AUTOSIZE)    #创建GUI窗口,形式为自适应
cv.imshow("RGB",src)    #通过名字将图像和窗口联系
t1 = cv.getTickCount()  #获取时间,用于精度计时,操作系统启动所经过(elapsed)的毫秒数
color_space_conv(src)
t2 = cv.getTickCount()
print((t2-t1)/cv.getTickFrequency())    #getTickFrequency()是获取一秒钟结果的点数,获取秒数
cv.waitKey(0)   #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
cv.destroyAllWindows()  #销毁所有窗口

 

posted @ 2018-07-03 18:52  山上有风景  阅读(1320)  评论(0编辑  收藏  举报