由于从事数字图像处理工作,常常要做颜色空间(如RGB、YUV、YCbCr、HSI)、色域(BT.601、BT.709、BT.2020)的转换。之前一直没有弄明白YUV和YCbCr的差异,也没有深究。来来回回浪费了许多时间,想想还是应该弄清楚,讲明白。
CSC指color space convert,这里主要讲RGB与YCbCr颜色空间的转换,常用的色域空间有BT.601(SDTV,标清电视),BT.709(HDTV,高清电视),BT.2020(UHDTV,超高清电视),在不同的色域空间下,有不同的转换矩阵。
下面先说说YUV与YCbCr的区别,再结合不同的色域讲解颜色空间RGB与YCbCr的转换关系(color space convert, CSC)。
1. YUV与YCbCr的区别
YUV中Y表示亮度(luminance),UV表示两个彩色分量,主要用于PAL制信号传输,属于模拟信号。
YCbCr中Y表示亮度,Cb、Cr表示两个色差分量(colour-difference):蓝色和红色色差分量,主要用于数字视频信号传输,属于数字信号。
2. RGB与YCbCr转换关系
色域表示显示设备能够显示的颜色范围,下图中马蹄形区域为人眼能看到的色彩区域,
BT.601是标清视频使用的色域范围,BT.709和BT.2020分别对应高清和超高清视频的色域。
(1) BT.601色域CSC
归一化下亮度分量:
EY = 0.299 ER + 0.587 EG + 0.114 EB
其中ER、EG、EB范围为[0,1]
归一化下红色色差分量等于红色分量减去亮度分量:
(ER - EY) = ER - 299 ER - 0.587 EG - 0.114 EB = 0.701 ER - 0.587 EG - 0.114 EB
范围为[-0.701,0.701],对其进行归一化
ECR = 0.5 ER + 0.419 EG + 0.081 EB
归一化下红色色差分量等于蓝色分量减去亮度分量::
(EB- EY) = EB - 0.299 ER - 0.587 EG - 0.114 EB = -0.299 ER - 0.587 EG + 0.886 EB
范围为[-0.886,0.886],对其进行归一化
ECB = 0.169 ER + 0.331 EG + 0.5 EB
由于信号为边缘有其它用途,所以在实际应用中,往往使用窄动态limited格式,对于8bit信号,亮度分量的范围为16-235(共220个灰阶),色差分量的范围为16-240(共225个灰阶)。对于10bit信号,亮度分量的范围为64-940(共877个灰阶),色差分量的范围为64-960(共897个灰阶)。
因此量化后的各分量如下:
Y = 219 EY + 16 = 0.2568 * R + 0.5041 * G + 0.0979 * B + 16
Cb = 224 ECB + 128 = -0.1482 * R – 0.291 * G + 0.4392 * B + 128
Cr = 224 ECR + 128 = 0.4392 * R – 0.3678 * G – 0.0714 * B + 128
因此,RGB与YCbCr颜色空间的转换可用以下公式来表示:
反过来,ycbcr2rgb可表示如下:
顺便说一下,matlab中rgb2ycbcr函数也是用的上面的公式来实现的,matlab帮助文档如下:
接下来说转换矩阵,不考虑后面加16和128。
BT601_RGB2YCbCr = [
0.2568 0.5041 0.0979 16
-0.1482 -0.2910 0.4392 128
0.4392 -0.3678 -0.0714 128
0 0 0 1]
8bit定点化时,相当于乘上256,矩阵如下
BT601_RGB2YCbCr_8bit =
[65.7408 129.0496 25.0624 4096
-37.9392 -74.4960 112.4352 32768
112.4352 -94.1568 -18.2784 32768
0 0 0 256]
= [66 129 25 4096
-38 -74 112 32768
112 -94 -18 32768
0 0 0 256]
此即为8bit下转换矩阵。
对RGB2YCbCr求逆可得到
BT601_YCbCr2RGB = inv(RGB2YCbCr) = [
1.1644 -0.0001 1.5960 -225.2356
1.1644 -0.3917 -0.8130 133.2470
1.1644 2.0173 -0.0001 -279.1554
0 0 0 1.0000]
8bit定点化,得到:
BT601_YCbCr2RGB_8bit =
[298 0 409 -57660
298 -100 -208 34111
298 516 0 -71464
0 0 0 256]
2. BT.709色域
参考BT.709手册,计算方法如下
Y = 219 EY + 16 = (219/255) * (0.2126 R + 0.7152 G + 0.0722 B) + 16 = 0.1826 R + 0.6142 G + 0.062 B + 16
Cb = 224 ECb + 128 = -0.1006 R - 0.3386 G + 0.4392 B + 128
Cr = 224 ECr + 128 = 0.4382 R - 0.398 G + 0.0402 B + 128
因此,可得到转换矩阵:
BT709_RGB2YCbCr = [
0.1826 0.6142 0.062 16
-0.1006 -0.3386 0.4392 128
0.4382 -0.398 -0.0402 128
0 0 0 1]
8bit量化后有:
BT709_RGB2YCbCr_8bit = [
47 157 16 4096
-26 -87 112 32768
112 -102 -10 32768
0 0 0 256]
对BT709_RGB2YCbCr求逆可得到:
BT709_YCbCr2RGB = [
1.1644 0.0001 1.7969 -248.6413
1.1644 -0.2133 -0.5342 77.0427
1.1644 2.1125 -0.0002 -288.9952
0 0 0 1.0000]
8bit量化后有:
BT709_YCbCr2RGB_8bit = [
298 0 460 -63652
298 -55 -137 19723
298 541 0 -73983
0 0 0 256]
3. BT.2020色域
参考BT.2020手册,计算方法如下:
Y = 219 EY + 16 = (219/255) * (0.2627 R + 0.678 G + 0.0593 B) + 16 = 0.2256 R + 0.5832 G + 0.0509 B + 16
Cb= 224 ECb + 128 = (224/255) * (-0.2627 R - 0.678 G + 0.9407 B) / 1.8814 + 128 = -0.1227 R – 0.3166 G + 0.4392 B + 128
Cr= 224 ECr + 128 = (224/255) * ( 0.7373 R-0.678 G- 0.0593 B) / 1.4746 + 128 = 0.4392 R – 0.4039 G - 0.0353 B + 128
因此,可得到转换矩阵:
BT2020_RGB2YCbCr = [
0.2256 0.5832 0.0509 16
-0.1227 -0.3166 0.4392 128
0.4392 -0.4039 -0.0353 128
0 0 0 1]
8bit量化后有:
BT2020_RGB2YCbCr_8bit = [
58 149 13 4096
-31 -81 112 32768
112 -103 -9 32768
0 0 0 256]
对BT2020_RGB2YCbCr求逆可得到:
BT2020_YCbCr2RGB = [
1.1632 0.0002 1.6794 -233.6003
1.1632 -0.1870 -0.6497 88.4933
1.1634 2.1421 0.0008 -292.9093
0 0 0 1.0000]
8bit量化后有:
BT2020_YCbCr2RGB = [
298 0 430 -59802
298 -48 -166 22654
298 548 0 -74985
0 0 0 256]
需要注意的是,在不同色域下,需要使用不同的转换矩阵,如果转换矩阵不匹配的话,图像会偏色,并发生亮暗变化。
参考:
[1] https://en.wikipedia.org/wiki/YUV
[2] https://en.wikipedia.org/wiki/YCbCr
[3] Rec. ITU-R BT.601-7
[4] R-REC-BT.709-6
[5] R-REC-BT.2020-2
[6] http://blog.csdn.net/majinlei121/article/details/51143432