• opencv(4):颜色空间


    颜色空间

    不同色彩空间显示效果是不一样的。

    RGB 人眼的色彩空间

    HSV 色彩空间

    HSV 代表色相(Hue)、饱和度(Saturation)、明度(Value),这三个分量描述了颜色的不同方面:

    • 色相(Hue): 表示颜色的种类,以角度度量(0°到360°)。常见的颜色如红、绿、蓝等都有特定的色相值。
    • 饱和度(Saturation): 表示颜色的纯度或灰度。饱和度为0时,颜色变成灰度,为1时,颜色是完全饱和的。
    • 明度(Value): 表示颜色的明亮程度。数值范围从0到1,其中0代表黑色,1代表最亮的颜色。

    opencv 倾向于使用 hsv.

    import cv2
    import numpy as np
    
    # 读取图像
    image = cv2.imread('example.jpg')
    
    # 将图像从 BGR 转换为 HSV
    hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    HSL

    HSL 是另一种颜色空间,表示颜色的方式与 RGB 和 HSV 略有不同。HSL 代表色相(Hue)、饱和度(Saturation)、亮度(Lightness),这三个分量描述了颜色的不同方面:

    • 色相(Hue): 表示颜色的种类,以角度度量(0°到360°)。HSL 色相与 HSV 色相是相同的。
    • 饱和度(Saturation): 表示颜色的纯度或灰度。饱和度为0时,颜色是灰度的,为1时,颜色是完全饱和的。
    • 亮度(Lightness): 表示颜色的相对亮度。数值范围从0到1,其中0代表黑色,0.5是中间的灰度,1代表最亮的颜色。

    在这里插入图片描述

    HSL 色彩空间同样常用于图像处理和计算机视觉任务中。在 OpenCV 中,你同样可以使用 cv2.cvtColor 函数将图像从其他颜色空间(如 BGR)转换为 HSL。
    HSL 用的比较少。

    YUV

    主要用在视频中。
    YUV 是一种将亮度(Luminance)和色度(Chrominance)分离的颜色编码方式,常用于视频压缩和图像处理。YUV 的表示方式包括 Y、U、V 三个分量:

    • Y(亮度): 表示图像的亮度信息,即灰度信息。Y 分量用于表示黑白图像的亮度,与 RGB 的灰度表示类似。
    • U(蓝色色度): 表示蓝色的色度信息。U 分量描述了图像中蓝色和黄色的变化。在 YUV 中,U 分量越大,蓝色越强,越小则黄色越强。
    • V(红色色度): 表示红色的色度信息。V 分量描述了图像中红色和绿色的变化。在 YUV 中,V 分量越大,红色越强,越小则绿色越强。

    YUV 主要应用于视频编码和传输领域,其中 Y 分量用于表示亮度信息,而 U 和 V 分量则用于表示颜色信息。通过将颜色信息与亮度信息分离,可以更有效地进行压缩,因为人眼对亮度的感知更为敏感,而对颜色的感知相对较弱。

    在 OpenCV 中,你可以使用 cv2.cvtColor 函数将图像从其他颜色空间(如 BGR)转换为 YUV。例如:

    import cv2
    import numpy as np
    # 读取图像
    image = cv2.imread('example.jpg')
    # 将图像从 BGR 转换为 YUV
    yuv_image = cv2.cvtColor(image, cv2.COLOR_BGR2YUV)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    YUV420、YUV422、YUV444 是 YUV 颜色编码的不同变体,它们主要区别在于亮度(Y)和色度(U、V)分量的采样方式和存储结构。

    YUV420:

    采样方式: Y 分量进行全采样,而 U 和 V 分量进行水平和垂直方向的子采样。通常是 4:2:0 的采样方式,表示每 4 个 Y 值对应 2 个 U 和 2 个 V 值。
    存储结构: 以块为单位存储,每个块中包含多个 Y、U、V 像素。Y 采样密集,而 U 和 V 采样相对稀疏。这是最常用于视频压缩的一种格式。

    YUV422:

    采样方式: Y 分量进行全采样,而 U 和 V 分量进行水平方向的子采样。通常是 4:2:2 的采样方式,表示每 4 个 Y 值对应 2 个 U 和 2 个 V 值。
    存储结构: 类似 YUV420,以块为单位存储,但 U 和 V 采样略为密集,相对于 YUV420,存储要求更高。

    YUV444:

    采样方式: Y、U、V 分量均进行全采样,没有子采样。每个 Y、U、V 都有一个对应的采样值。
    存储结构: 每个像素都有对应的 Y、U、V 值,存储密集。这是最高质量的 YUV 变体,但也需要更多的存储空间。
    这些变体在视频压缩和传输中具有不同的应用场景。YUV420 常用于广播电视和视频流,因为它在保持相对较高图像质量的同时,能够更有效地压缩数据。YUV444 则通常用于图像和视频编辑等对图像质量要求较高的场景。

    颜色空间转换代码示例

    import cv2
    
    def callback(userdata):
        pass
    cv2.namedWindow('color', cv2.WINDOW_NORMAL)
    img = cv2.imread('./RMB.jpeg')
    colorspaces = [cv2.COLOR_BGR2RGBA, cv2.COLOR_BGR2BGRA, 
                   cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2HSV, 
                   cv2.COLOR_BGR2YUV]
    cv2.createTrackbar('curcolor', 'color', 0, 4, callback)
    while True:
        index = cv2.getTrackbarPos('curcolor', 'color')
        #颜色空间转换API
        cvt_img = cv2.cvtColor(img, colorspaces[index])
        cv2.imshow('color', cvt_img)
        key = cv2.waitKey(10)
        print(key)
        if key & 0xFF == ord('q'):
            break
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    常见的C/C++开源QP问题求解器
    数据结构:排序算法
    Android ViewPager2 + Fragment + BottomNavigationView 联动
    实现JSONP请求
    0029【Edabit ★☆☆☆☆☆】Profitable Gamble
    简介GC垃圾回收
    本地搭建php包依赖管理工具,使用satis搭建私有composer仓库
    如何创建Vue项目并与后端django联调
    设计模式个人理解——工厂模式
    Java#17(static)
  • 原文地址:https://blog.csdn.net/weixin_41783424/article/details/134466929