图像处理时,有些图像可能在 RGB 颜色空间信息不如转换到其它颜色空间更清晰.
这里整理下关于颜色空间的知识,以及 python-opencv 的实现.

图像处理中有多种色彩空间,例如 RGB、HLS、HSV、HSB、YCrCb、CIE XYZ、CIE Lab 等,经常要遇到色彩空间的转化,以便生成 mask 图等操作.

颜色空间也称彩色模型(彩色空间,彩色系统),主要是在某些标准下用通常可接受的方式对彩色加以说明.

本质上,彩色模型是坐标系统和子空间的阐述. 位于系统的每种颜色都有单个点表示.

在彩色图像处理中,选择合适的彩色模型是很重要的. 从应用的角度来看,众多彩色模型可以分为两类:

[1] - 面向诸如彩色显示器或彩色打印机之类输出显示场合使用的硬设备.

[2] - 面向视觉感知或者说以彩色处理分析为目的的应用,如动画中的彩色图形,各种图像处理的算法等.(这里主要是图像处理.)

1. 几种颜色空间

1.1. RGB

RGB (Red 红色,Green 绿色,Blue 蓝色),是根据人眼识别的颜色而定义的空间,可用于表示大部分颜色,也是图像处理中最基本、最常用、面向硬件的颜色空间,是一种光混合的体系.

RGB 颜色模式用三维空间中的一个点表示一种颜色,每个点有三个分量,分别表示红、绿、蓝的亮度值,亮度值限定为 [0, 1].

在RGB模型的立方体中,
[1] - 原点对应的颜色为黑色,它的三个分量值都为0;
[2] - 距离原点最远的顶点对应的颜色为白色,三个分量值都为1.
[3] - 从黑色到白色的灰度值分布在这两个点的连线上,该虚线称为灰度线.
[4] - 立方体的其余各点对应不同的颜色,即三原色红、绿、蓝及其混合色黄、品红、青色.

1.2. LAB 颜色空间

LAB 全称是 CIELAB,CIE代表 International Commission on Illumination(国际照明委员会),它是一个关于光照、颜色等的国际权威组织.

LAB 颜色空间由一个亮度通道和两个颜色通道组成的. 在LAB 颜色空间中,每个颜色用L、A、B三个数字表示,其中,各个分量的含义是:

[1] - L - 亮度

[2] - A - 从绿色到红色的分量

[3] - B - 从蓝色到黄色的分量

LAB 是基于人对颜色的感觉来设计的,更具体地说,它是感知均匀(perceptual uniform)的。Perceptual Uniform的意思是,如果数字(即前面提到的L、A、B这三个数)变化的幅度一样,那么它给人带来视觉上的变化幅度也差不多.(:Helmholtz–Kohlrausch effect 是人眼的一种错觉——当色彩饱和度高时,颜色会看起来更亮.)

LAB 相较于RGB与CMYK等颜色空间更符合人类视觉,也更容易调整:想要调节亮度,就调节L 通道,想要调节只色彩平衡就分别调 A 和 B.

理论上说,L、A、B 都是实数,一般限定在一个整数范围内:

  • L 越大,亮度越高。L 为 0 时代表黑色,为100时代表白色。
  • A 和 B 为0时都代表灰色。
  • A 从负数变到正数,对应颜色从绿色变到红色。
  • B 从负数变到正数,对应颜色从蓝色变到黄色。
  • 在实际应用中常常将颜色通道的范围[-100, +100]或[-128, 127]之间。

1.3. HSI

HSI 颜色空间可以用一个圆锥空间模型来描述,能清晰表现色调(Hue)、饱和度(Saturation, Chroma)和亮度(Intensity, Brightness)的变化情形.

色相 H(Hue) - 表示颜色的相位角. 红、绿、蓝分别相隔 120 度;互补色分别相差 180 度,即颜色的类别.

饱和度 S(Saturation) - 色彩的强度或纯度. 表示成所选颜色的纯度和该颜色最大的纯度之间的比率,范围:[0, 1],即颜色的深浅程度.

亮度 I(Intensity) - 表示颜色的明亮程度,通常以 0% (黑色) 到 100% (白色) 的百分比来衡量(人眼对亮度很敏感).

HSI色彩空间和RGB色彩空间只是同一物理量的不同表示法,它们之间可以进行相互转换:

HSI颜色模式中的色调使用颜色类别表示,饱和度与颜色的白光光亮亮度刚好成反比,代表灰色与色调的比例,亮度是颜色的相对明暗程度.

2. cv2.cvtColor() 颜色转换函数

import matplotlib.pyplot as plt 
import cv2
    
img_BGR = cv2.imread('test.jpg') # BGR 
plt.subplot(3,3,1)
plt.imshow(img_BGR);plt.axis('off');plt.title('BGR')

img_RGB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB)
plt.subplot(3,3,2)
plt.imshow(img_RGB);plt.axis('off');plt.title('RGB')
    
img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY)
plt.subplot(3,3,3);
plt.imshow(img_GRAY);plt.axis('off');plt.title('GRAY')
    
img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV)
plt.subplot(3,3,4)
plt.imshow(img_HSV);plt.axis('off');plt.title('HSV')
    
img_YcrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb)
plt.subplot(3,3,5)
plt.imshow(img_YcrCb);plt.axis('off');plt.title('YcrCb')
    
img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS)
plt.subplot(3,3,6)
plt.imshow(img_HLS);plt.axis('off');plt.title('HLS')
    
img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ)
plt.subplot(3,3,7)
plt.imshow(img_XYZ);plt.axis('off');plt.title('XYZ')
    
img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB)
plt.subplot(3,3,8)
plt.imshow(img_LAB);plt.axis('off');plt.title('LAB')
    
img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV)
plt.subplot(3,3,9)
plt.imshow(img_YUV);plt.axis('off');plt.title('YUV')
plt.show()

3. 参考

[1] - 数字图像处理 颜色空间RGB、HSI、CMYK、YUV的相互转换

[2] - opencv︱图像的色彩空間cvtColor(HSV、HSL、HSB )及相关色彩学

[3] - 彻底搞懂Lab 颜色空间

[4] - OpenCV - Changing Colorspaces

[5] - Python cv2.cvtColor() Examples

Last modification:November 18th, 2019 at 04:59 pm