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: 输出的通道数