• 五 色彩空间转换


    背景

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

    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

    HSV是一种将RGB色彩空间中的点在倒圆锥体中的表示方法。HSV即色相(Hue)、饱和度(Saturation)、明度(Value),又称HSB(B即Brightness)。色相是色彩的基本属性,就是平常说的颜色的名称,如红色、黄色等。饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。明度(V),取0-max(计算机中HSV取值范围和存储的长度有关)。HSV颜色空间可以用一个圆锥空间模型来描述。圆锥的顶点处,V=0,H和S无定义,代表黑色。圆锥的顶面中心处V=max,S=0,H无定义,代表白色。

    H是色彩

    S是深浅, S = 0时,只有灰度

    V是明暗,表示色彩的明亮程度,但与光强无直接联系,(意思是有一点点联系吧)。

     

    H:0-180  S: 0-255 V: 0-255  -> opencv中

    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)

    6、YUV

    1、YUV(亦称YCrCb)是被欧洲电视系统所采用的一种颜色编码方法。在现代彩色电视系统中,通常采用三管彩色摄像机或彩色CCD摄影机进行取像,然后把取得的彩色图像信号经分色、分别放大校正后得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号R-Y(即U)、B-Y(即V),最后发送端将亮度和两个色差总共三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的YUV色彩空间表示。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V信号分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。

    2、YUV主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和Cb来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之同的差异。

    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

    一、调用转换函数实现图像色彩空间转换

    # -*- coding=GBK -*-
    import cv2 as cv
     
     
    #色彩空间的转换
    def color_space_demo(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)#RGB转换为gray
        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)
     
    src = cv.imread("C://1.jpg")
    cv.namedWindow("原来", cv.WINDOW_NORMAL)
    cv.imshow("原来", src)
    color_space_demo(src)
    cv.waitKey(0)
    cv.destroyAllWindows()

    说明:

    cvCvtColor( const CvArr* src, CvArr* dst, int code )

    src:源图像(输入的 8-bit , 16-bit 或 32-bit 单倍精度浮点数影像)

    dst:目标图像(输入的 8-bit , 16-bit 或 32-bit 单倍精度浮点数影像)

    code:

    需要特别说明的是RGB–>GRAY的转换是我们常用的转换格式,其转换公式如下:

     二、色彩空间转换,利用inrange函数过滤视频中的颜色,实现跟踪某一颜色

    HSV追踪有颜色的对象(捕获视频中的红色)

    import cv2 as cv
    import numpy as np
    
    def extrace_object():
        capture = cv.VideoCapture("./1.mp4")
        while True:
        #打开摄像头
            ret,frame = capture.read()  #frame是每一帧图像,ret是返回值,为0是表示图像读取完毕
            if ret == False:
                break
            #转换为hsv图像
            hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
            #下阈值
            lower_hsv = np.array([0,43,46])
            #上阈值
            upper_hsv = np.array([10,255,255])
            mask = cv.inRange(hsv,lower_hsv,upper_hsv) #mask输出图像 cv.inRange(src,lower,upper,dst=None)
            #cv.inRange(目标图像,下阈值,上阈值)
            cv.imshow("video",frame)
            cv.imshow("mask", mask)
            c = cv.waitKey(40)
            if c == 27:    #相当于人为退出
                break
    
    extrace_object(src)

    说明:

    cv.inRange(image,lower,upper)

    对图像的所有通道同时做阈值范围限制,在三个通道阈值范围内的像素值设为二值化中的高值,比如255,不在通道阈值范围内的像素值设为二值化中的低值,比如0,最后输出的图像是单通道图像。

    注意,它的参数形成的区间是闭区间,而不是开区间。

    if c == 27:
        break
    
    #也可以改为
    if cv.waitKey(50) & 0xFF == ord('q'):
        break

    三、通道分离、修改、合并

    1、通道分离

    src = cv.imread("./6.jpg")  #读取图片
    cv.namedWindow("RGB",cv.WINDOW_AUTOSIZE)    #创建GUI窗口,形式为自适应
    cv.imshow("RGB",src)    #通过名字将图像和窗口联系
    
    b,g,r = cv.split(src)   #通道分离为b,g,r三个
    cv.imshow("B",b)
    cv.imshow("G",g)
    cv.imshow("R",r)
    cv.waitKey(0)
    cv.destroyAllWindows()

    2、修改某一通道

    1 src = cv.imread('1.jpg')
    2 src[:,:,0] = 0  #b变为黑
    3 cv.imshow('change b',src)
    4 src[:,:,1] = 0 #G变为黑
    5 cv.imshow('chage G',src)
    6 src[:,:,2] = 0 #r变为黑
    7 cv.imshow('chage r',src)
    8 cv.waitKey(0)
    9 cv.destroyAllWindows()

    3、合并通道

    src2 = cv.merge([b,g,r])
    cv.imshow("meger image",src2)

     

  • 相关阅读:
    variables _ golang
    values _ golang
    hello world _ golang
    golang
    英语
    ubuntu下安装node、node代码调试
    xampp日常需求
    垂直居中方法总结
    angularJS之ui-router插件(1)
    Sass学习
  • 原文地址:https://www.cnblogs.com/pacino12134/p/9844431.html
Copyright © 2020-2023  润新知