这是一种由发光元件(例如显示器)所定义的颜色空间, 包含最基本的三原色(红, 绿, 蓝). 生活中所接触到的图像, 大部分由RGB空间表示. 它的一个缺点就是把色调、亮度、饱和度糅合在了一起. 在某一些领域, 例如科学研究、制图绘图等不常采用.
它是工业印刷采用的颜色空间, 基本颜色主要由洋红、黄色、青色、黑色组成。它与RGB的红、黄、蓝相对应, RGB的颜色叠加越多颜色发白, 而CMY叠加的颜色越多颜色越暗, 由于在研究领域方面也比较少用到这个颜色空间, 由于这是一种印刷界使用的标准颜色空间, 因此对于出版行业的人来说比较熟悉. 对于专注于图像研究的我们来说, 只要了解这个颜色空间就行.
这是一种在绘图领域比较常见的颜色表达, 主要分为色调、饱和度、明度或者强度. 比如说在PS中, 你可以调出HSV色板, 可以通过调节饱和度和明度, 感受某种颜色的变化情况. 这是一种以光影强度变化为特征的颜色空间体系.
尽管叫法和名称在不同资料上可能有所不同, 但本质是一样的 (hue, saturation, indensity/value/light), 如果从波的角度来看这个问题, 色调就是不同的频率, 也就是光谱. 饱和度表示接收端接收到的光信号衰减程度, 而明度表示发射端发射的光波强度, 明度与饱和度共同决定了某个颜色最终表现的情况.
Lab颜色模型是由CIE(国际照明委员会)制定的一种色彩模式。自然界中任何一点色都可以在Lab空间中表达出来,它的色彩空间比RGB空间还要大。另外,这种模式是以数字化方式来描述人的视觉感应, 与设备无关,所以它弥补了RGB和CMYK模式必须依赖于设备色彩特性的不足。由于Lab的色彩空间要比RGB模式和CMYK模式的色彩空间大。这就意味着RGB以及CMYK所能描述的色彩信息在Lab空间中都能 得以影射。
以笛卡尔空间表示, 它有三个轴, L轴是光亮度, 值越大颜色越发白; A轴正半轴是红色, 负半轴是绿色; B轴正半轴是黄色, 负半轴是蓝色.
RGB转Lab颜色空间的方式:
RGB没法直接转换到LAB空间, 通常需要先转换到XYZ空间后, 再转换到LAB空间.
[ X Y Z ] = [ 0.412453 0.357580 0.180423 0.212671 0.715160 0.072169 0.019334 0.119193 0.950227 ] ⋅ [ R G B ] \begin{bmatrix} X\\ Y\\ Z \end{bmatrix} = \begin{bmatrix} 0.412453 & 0.357580 & 0.180423 \\ 0.212671 & 0.715160 & 0.072169 \\ 0.019334 & 0.119193 & 0.950227 \end{bmatrix} \cdot \begin{bmatrix} R\\ G\\ B \end{bmatrix} ⎣⎡XYZ⎦⎤=⎣⎡0.4124530.2126710.0193340.3575800.7151600.1191930.1804230.0721690.950227⎦⎤⋅⎣⎡RGB⎦⎤
[ R G B ] = [ 3.240479 − 1.537150 − 0.498535 − 0.969256 1.875992 0.041556 0.055648 − 0.204043 1.057311 ] ⋅ [ X Y Z ] \begin{bmatrix} R\\ G\\ B \end{bmatrix} = \begin{bmatrix} 3.240479 & -1.537150 & -0.498535 \\ -0.969256 & 1.875992 & 0.041556 \\ 0.055648 & -0.204043 & 1.057311 \end{bmatrix} \cdot \begin{bmatrix} X\\ Y\\ Z \end{bmatrix} ⎣⎡RGB⎦⎤=⎣⎡3.240479−0.9692560.055648−1.5371501.875992−0.204043−0.4985350.0415561.057311⎦⎤⋅⎣⎡XYZ⎦⎤
XYZ对LAB空间转换
L = 116 f ( Y / Y ∗ ) − 16 L = 116f(Y/Y^{*}) - 16 L=116f(Y/Y∗)−16
a = 500 [ f ( X / X ∗ ) − f ( Y / Y ∗ ) ] a = 500[f(X/X^{*}) - f(Y/Y^{*})] a=500[f(X/X∗)−f(Y/Y∗)]
b = 200 [ f ( Y / Y ∗ ) − f ( Z / Z ∗ ) ) ] b = 200[f(Y/Y^{*}) - f(Z/Z^{*}))] b=200[f(Y/Y∗)−f(Z/Z∗))]
其中:
f ( t ) = { t 1 3 t > δ 3 t 3 δ 2 + 4 29 o t h e r w i s e f(t) = \left\{\begin{matrix} t^{\frac{1}{3}} & t > \delta ^ 3 \\ \frac{t}{3 \delta^2} + \frac{4}{29} & otherwise \end{matrix}\right. f(t)={t313δ2t+294t>δ3otherwise
δ = 6 29 \delta = \frac{6}{29} δ=296
RGB取值范围, 如果不特别说明, 通常研究以 [ 0 , 1 ] [0, 1] [0,1]表示, 所以RGB转换为XYZ后, 为了归一, XYZ会分别除以0.950456、1.0、1.088754, 这是因为:
X ∗ = 0.412453 + 0.357580 + 0.180423 = 0.950456 X^{*} = 0.412453 + 0.357580 + 0.180423 = 0.950456 X∗=0.412453+0.357580+0.180423=0.950456
Y ∗ = 0.212671 + 0.715160 + 0.072169 = 1.0 Y^{*} = 0.212671 + 0.715160 + 0.072169 = 1.0 Y∗=0.212671+0.715160+0.072169=1.0
Z ∗ = 0.019334 + 0.119193 + 0.950227 = 1.088754 Z^{*} = 0.019334 + 0.119193 + 0.950227 = 1.088754 Z∗=0.019334+0.119193+0.950227=1.088754
LAB对XYZ空间转换
X = X ∗ f − 1 ( L + 16 116 + a 500 ) X = X^{*} f^{-1} ( \frac{L + 16}{116} + \frac{a}{500} ) X=X∗f−1(116L+16+500a)
Y = Y ∗ f − 1 ( L + 16 116 ) Y = Y^{*} f^{-1} ( \frac{L + 16}{116}) Y=Y∗f−1(116L+16)
Z = Z ∗ f − 1 ( L + 16 116 − b 200 ) Z = Z^{*} f^{-1} ( \frac{L + 16}{116} - \frac{b}{200} ) Z=Z∗f−1(116L+16−200b)
其中:
F ( L ) = L + 16 116 F(L) = \frac{L + 16}{116} F(L)=116L+16
f − 1 ( t ) = { t 3 t > δ 3 δ 2 ( t − 4 29 ) o t h e r w i s e f^{-1}(t) = \left\{ \begin{matrix} t^{3} & t > \delta \\ 3 \delta ^ 2 ( t - \frac{4}{29} ) & otherwise \end{matrix}\right. f−1(t)={t33δ2(t−294)t>δotherwise
YUV与YCbCr是同一种类型的颜色空间表达方式, 其中Y表示亮度, UV表示两种不同的颜色信号, 也就是构成最终颜色的颜色分量, 在YCbCr颜色空间体系下, 颜色表示如下:
采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。
广播、视频和成像标准使用YUV色彩空间还有一个重要的原因,就是与人的视觉系统很有关系。人类的眼睛对低频信号比对高频信号具有更高的敏感度。事实上,人类的眼睛对明视度的改变也比对色彩的改变要敏感的多。因此对人类而言,Y分量比U分量重要,根据人眼的这一特征,在不使用任何复杂算法的前提下, 可以适当地抛弃U和V分量以达到压缩的目的,这就是部分取样(subsampling)。
YUV与YCrCb的区别:YCrCb颜色空是由YUV颜色空间派生的一种颜色空间。YCbCr是在世界数字组织视频标准研制过程中作为ITU-R BT.601建议的一部分,其实是YUV经过缩放和偏移的翻版。YCrCb中的Y与YUV中的Y含义一致,Cb、Cr同样都指色彩,只是在表示方法上不同。YCbCr中,Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。在YUV家族中,YCbCr是在计算机系统中应用最多的成员,其应用领域很广泛,JPEG、MPEG均采用此格式。一般人们所讲的YUV大多是指YCbCr。YCbCr有许多取样格式。
[ Y U V ] = [ 0.299 0.587 0.114 − 0.14713 − 0.28886 0.436 0.615 − 0.51499 − 0.10001 ] ⋅ [ R G B ] \begin{bmatrix} Y\\ U\\ V \end{bmatrix} = \begin{bmatrix} 0.299 & 0.587 & 0.114 \\ -0.14713 & -0.28886 & 0.436 \\ 0.615 & -0.51499 & -0.10001 \end{bmatrix} \cdot \begin{bmatrix} R\\ G\\ B \end{bmatrix} ⎣⎡YUV⎦⎤=⎣⎡0.299−0.147130.6150.587−0.28886−0.514990.1140.436−0.10001⎦⎤⋅⎣⎡RGB⎦⎤
[ R G B ] = [ 1 0 1.13983 1 − 0.39465 − 0.58060 1 2.03211 0 ] ⋅ [ Y U V ] \begin{bmatrix} R\\ G\\ B \end{bmatrix} = \begin{bmatrix} 1 & 0 & 1.13983 \\ 1 & -0.39465 & -0.58060 \\ 1 & 2.03211 & 0 \end{bmatrix} \cdot \begin{bmatrix} Y\\ U\\ V \end{bmatrix} ⎣⎡RGB⎦⎤=⎣⎡1110−0.394652.032111.13983−0.580600⎦⎤⋅⎣⎡YUV⎦⎤
YUV主要采样格式: YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。
(1)、YUV 4:4:4:无压缩,YUV三个信道的抽样率相同,因此在生成的图像里,每个象素的三个分量信息完整(每个分量通常8比特),经过8比特量化之后,未经压缩的每个像素占用3个字节。
(2)、YUV 4:2:2:压缩33.3%,每个色差信道的抽样率是亮度信道的一半,所以水平方向的色度抽样率只是4:4:4的一半。对非压缩的8比特量化的图像来说,每个由两个水平方向相邻的像素组成的宏像素需要占用4字节内存。
(3)、YUV 4:1:1: 压缩50%,4:1:1的色度抽样,是在水平方向上对色度进行4:1抽样。对于低端用户和消费类产品这仍然是可以接受的。对非压缩的8比特量化的视频来说,每个由4个水平方向相邻的像素组成的宏像素需要占用6字节内存。
每个点保存一个8bit的亮度值(也就是Y值),每2x2个点保存一个Cr和Cb值, 图像在肉眼中的感觉不会起太大的变化。所以,原来用RGB(R,G,B都是8bit unsigned)模型,1个点需要8x3=24bits,(全采样后,YUV仍各占8bit)。按4:1:1采样后,而现在平均仅需要 8+(8/4)+(8/4)=12bits(4个点,8*4(Y)+8(U)+8(V)=48bits), 平均每个点占12bits。这样就把图像的数据压缩了一半。
(4)、YUV4:2:0: 压缩50%,4:2:0并不意味着只有Y、Cb而没有Cr分量。它指得是对每行扫描线来说,只有一种色度分量以2:1的抽样率存储。相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0…以此类推。对每个色度分量来说,水平方向和竖直方向的抽样率都是2:1,所以可以说色度的抽样率是4:1。对非压缩的8比特量化的视频来说,每个由2x2个2行2列相邻的像素组成的宏像素需要占用6字节内存。绝大多数视频编解码器都采用这种格式作为标准的输入格式。
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')
[参考资料]