opencv学习笔记04-色彩转换

发布时间 2023-06-01 22:17:54作者: (⊃・ᴥ・)つ

opencv 简易笔记 4--色彩转换

1.色彩空间的认识

色彩是人的眼睛对于不同频率的光线的不同感受,色彩既是客观存在的(不同频率的光)又是主观感知的,有认识差异。所以人类对于色彩的认识经历了极为漫长的过程,直到近代才逐步完善起来,但人类仍不能说对色彩完全了解并准确表述了,许多概念不是那么容易理解。“色彩空间”一词源于西方的“Color Space”,又称作“色域”,色彩学中,人们建立了多种色彩模型,以一维、二维、三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间。我们经常用到的色彩空间主要有 RGB、CMYK、Lab 等。

1.1 HSV

HSV (色相 hue,饱和度 saturation, 明度 value), 也称 HSB (B 指 brightness) 是艺术家们常用的,因为与加法减法混色的术语相比,使用色相,饱和度等概念描述色彩更自然直观。HSV 是 RGB 色彩空间的一种变形,它的内容与色彩尺度与其出处——RGB 色彩空间有密切联系。

1.2 HSL

HSL (色相 hue, 饱和度 saturation,亮度 lightness/luminance), 也称 HLS 或 HSI (I 指 intensity) 与 HSV 非常相似,仅用亮度(lightness)替代了明度(brightness)。二者区别在于,一种纯色的明度等于白色的明度,而纯色的亮度等于中度灰的亮度.

1.3 RGB 与 RGBA

RGB 采用加法混色法,因为它是描述各种“光”通过何种比例来产生颜色。光线从暗黑开始不断叠加 产生颜色。 RGB 描述的是红绿蓝三色光的数值。RGBA 是在 RGB 上增加阿尔法通道实现透明效果。

2.opencv 中的色彩空间与示例

opencv 里面默认使用的是 BGR,而正常肉眼看到的色彩则是基于 RGB。

import cv2


def callback(any):
    pass


# 窗口命名
cv2.namedWindow("color", cv2.WINDOW_NORMAL)
colorspace = [
    cv2.COLOR_BGR2RGBA,
    cv2.COLOR_BGR2BGRA,
    cv2.COLOR_BGR2GRAY,
    cv2.COLOR_BGR2HSV_FULL,
    cv2.COLOR_BGR2YUV,
]
cv2.createTrackbar("curcolor", "color", 0, len(colorspace) - 1, callback)
img = cv2.imread("mdPNG/lesson1_1.png")
while True:
    # 获取当前trackbar的值
    index = cv2.getTrackbarPos("curcolor", "color")
    # 颜色转化
    cvt_img = cv2.cvtColor(img, colorspace[index])
    cv2.imshow("color", cvt_img)
    key = cv2.waitKey(10)
    # 销毁
    if key & 0xFF == ord("q"):
        cv2.destroyAllWindows()
        break

2.1 cvtColor(mat_src,code,dst,dstcn) -> mat

这个 api 会将输入的 mat 的色彩空间转换成指定的色彩空间,并返回一个转化后的 mat,且对输入的 mat 无任何改变。
文档介绍:该函数将输入图像从一种颜色空间转换为另一种颜色。在从 RGB 颜色空间转换到的情况下,应明确指定通道的顺序(RGB 或 BGR)。请注意,OpenCV 中的默认颜色格式通常被称为 RGB,但实际上是 BGR(字节颠倒)。因此,标准(24 位)彩色图像中的第一个字节将是一个 8 位蓝色分量,第二个字节将为绿色,第三个字节为红色。第四、第五和第六个字节将成为第二个像素(蓝色、绿色、红色),依此类推。

(1) mat_src: mat 来源
(2) code: 表示转换类型的整数代码,例如 RGB 到灰度。
(3) dst: mat 输出
(4) dstcn: 输出的通道数