一篇文章搞清楚编程中YUV和RGB间的相互转换

YUV/RGB色彩空间的相互转换在算法上是很简单的,都是线性变换。但是对相关领域不熟悉的同学在第一次着手做时,往往会非常迷惑,因为网上的资料往往带着各种相似却不相同的术语,比如YUV,YCbCr,Y′CbCr,BT601/709/2020,full-range,studio-swing等等,不同术语描述的转换公式和常数又都不一样,给选择带来极大困扰。本文的目的就是尽可能简单明了地说清楚这些术语表示的意义,让我们能够正确选择转换用的公式,甚至可以根据需求自行推导。

着急的或者图方便的同学可以直接拉到本文最下面去查公式
YUV相关的术语。

YUV是一大类色彩空间的统称。由没有经过伽马矫正的RGB信号转化来的YUV色彩空间,模拟信号的称作YCC,数字信号的称作YCbCr;由经过了伽马矫正的RGB信号(记作R′G′B′)转化来的YUV色彩空间,模拟信号的称作Y′PbPr,数字信号的称作Y′CbCr。同时,作为模拟信号的RGB和R′G′B′对应的数字信号记作RdGdBd和R′dG′dB′d:

YUV
无伽马矫正 有伽马矫正
模拟信号 YCC Y′PbPr
数字信号 YCbCr Y′CbCr
RGB
无伽马矫正 有伽马矫正
模拟信号 RGB R′G′B′
数字信号 RdGdBd R′dG′dB′d

而在计算机程序中所进行的YUV/RGB转换,大部分情况都是指Y′CbCr和R′dG′dB′d间的转换。在Y′CbCr的三个分量中,Y′被称作luma,即进行过伽马校正过的亮度值。另外的两个分量Cb表示blue-difference,即亮度与蓝色间的差别;Cr表示red-difference,即亮度与红色间的差别。Cb和Cr统称为chroma,即色度。

Y′CbCr和R′dG′dB′d间的转换,是由Y′PbPr和R′G′B′间的转换推导而来的。大体思路是R′dG′dB′d<=>R′G′B′<=>Y′PbPr<=>Y′CbCr。接下来从左到右分步介绍。

R′dG′dB′d<=>R′G′B′

首先是数字信号的RGB和模拟信号间的相互转换,模拟信号RGB三个分量范围是[0,1],数字信号是[0,255],相互之间的转换就是线性拉伸,因此:

l e t   f = 1 255 [ R ′ G ′ B ′ ] = [ R D ′ G D ′ B D ′ ] ⋅ f [ R D ′ G D ′ B D ′ ] = [ R ′ G ′ B ′ ] ⋅ 1 f \mathit{let}~ f = \frac{1}{255} \\ \begin{bmatrix} R'\\ G'\\ B' \end{bmatrix}= \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix} \cdot f \\ \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}= \begin{bmatrix} R'\\ G'\\ B' \end{bmatrix} \cdot \frac{1}{f} let f=2551RGB=RDGDBDfRDGDBD=RGBf1

R′G′B′<=>Y′PbPr

国际标准ITU-R定义了其所推荐的模拟信号Y′PbPr色彩空间,以及它和模拟信号的R′G′B′色彩空间的相互转换。随着技术进步,ITU-R标准推出了BT.601,BT.709,BT.2020等版本,其中BT.601用于SDTV,BT.709用于HDTV,BT.2020用于UHDTV。
各版本的转换公式都是相同的,即向量(R′, G′, B′)乘以一个3x3的转换矩阵M(后文简称M)便得出(Y′, Pb, Pr),而一个(Y′, Pb, Pr)向量乘以M的逆矩阵则得到对应的(R′, G′, B′)向量。R′G′B′三个分量的范围都是[0, 1],乘以M后得到的luma的范围是[0, 1],chroma的范围则是[-0.5, +0.5]:

[ Y ′ P B P R ] = M ⋅ [ R ′ G ′ B ′ ] [ R ′ G ′ B ′ ] = M − 1 ⋅ [ Y ′ P B P R ] \begin{bmatrix} Y'\\ P_{B}\\ P_{R} \end{bmatrix} =M\cdot \begin{bmatrix} R'\\ G'\\ B' \end{bmatrix} \\ \begin{bmatrix} R'\\ G'\\ B' \end{bmatrix} =M^{-1}\cdot \begin{bmatrix} Y'\\ P_{B}\\ P_{R} \end{bmatrix} YPBPR=MRGBRGB=M1YPBPR

对于矩阵M,ITU-R标准定义了Kr,Kg,Kb三个量,由这三个量就可以推导出M和它的逆矩阵:

M = [ K R K G K B − 1 2 ⋅ K R 1 − K B − 1 2 ⋅ K G 1 − K B 1 2 1 2 − 1 2 ⋅ K G 1 − K R − 1 2 ⋅ K B 1 − K R ] M − 1 = [ 1 0 2 − 2 ⋅ K R 1 − K B K G ⋅ ( 2 − 2 ⋅ K B ) − K R K G ⋅ ( 2 − 2 ⋅ K R ) 1 2 − 2 ⋅ K B 0 ] M= \begin{bmatrix} K_{R} & K_{G} & K_{B}\\ -\frac{1}{2}\cdot \frac{K_{R}}{1-K_{B}} & -\frac{1}{2}\cdot \frac{K_{G}}{1-K_{B}} & \frac{1}{2}\\ \frac{1}{2} & -\frac{1}{2}\cdot \frac{K_{G}}{1-K_{R}} & -\frac{1}{2}\cdot \frac{K_{B}}{1-K_{R}} \end{bmatrix} \\ M^{-1}= \begin{bmatrix} 1 & 0 & 2-2\cdot K_{R}\\ 1 & -\frac{K_{B}}{K_{G}}\cdot \left ( 2-2\cdot K_{B} \right ) & -\frac{K_{R}}{K_{G}}\cdot \left ( 2-2\cdot K_{R} \right )\\ 1 & 2-2\cdot K_{B} & 0 \end{bmatrix} M=KR211KBKR21KG211KBKG211KRKGKB21211KRKBM1=1110KGKB(22KB)22KB22KRKGKR(22KR)0

同时由于Kr + Kg + Kb = 1必须恒成立,因此只要定义其中两个值即可:

Kr Kb
BT.601 0.299 0.114
BT.709 0.2126 0.0722
BT.2020 0.2627 0.0593
Y′PbPr<=>Y′CbCr

ITU-R标准同样定义了Y′CbCr,同时其他需要使用数字YUV信号的标准也可自行定义,一般都需要将Y′PbPr进行拉伸和移位,使得新的三个分量落在对应位深度所表示的取值范围(对8bit位深度,取值范围即[0, 255])内的某一部分中。由此引出了range(也叫swing,后文统一称为range)的概念。

ITU-R标准定义了8bit位深度的Y′CbCr:Y′PbPr首先要笛卡尔乘scale向量(219, 224, 224),然后加上offset向量(16, 128, 128)。求出的Y′CbCr中luma范围是[16, 235],chroma的范围是[16, 240]。这样的range由于没有占满[0, 255]的取值范围,被称为narrow range(也叫mpeg range,video range,studio range等等,后文统一为narrow range);而对于需要占满整个位深度取值范围的Y′CbCr,Y′PbPr首先要笛卡尔乘scale向量(255, 255, 255),然后加上offset向量(0, 128, 128)。这样一来Y′CbCr三个分量取值范围都落在了[0, 255],该range被成为full range。

从Y′CbCr转换为Y′PbPr的过程是上述过程的反转,即先减去offset向量,再笛卡尔除scale向量。

l e t   S c a l e = { [ 219 224 224 ] T o n   n a r r o w   r a n g e [ 255 255 255 ] T o n   f u l l   r a n g e l e t   O f f s e t = { [ 16 128 128 ] T o n   n a r r o w   r a n g e [ 0 128 128 ] T o n   f u l l   r a n g e [ Y ′ C B C R ] = [ Y ′ P B P R ] × S c a l e + O f f s e t [ Y ′ P B P R ] = ( [ Y ′ C B C R ] − O f f s e t ) × S c a l e − 1 \mathit{let}~\mathit{Scale}= \left\{\begin{matrix} \begin{bmatrix} 219 & 224 & 224 \end{bmatrix}^{T} & \mathit{on~narrow~range}\\ \begin{bmatrix} 255 & 255 & 255 \end{bmatrix}^{T} & \mathit{on~full~range} \end{matrix}\right. \\ \mathit{let}~\mathit{Offset}= \left\{\begin{matrix} \begin{bmatrix} 16 & 128 & 128 \end{bmatrix}^{T} & \mathit{on~narrow~range}\\ \begin{bmatrix} 0 & 128 & 128 \end{bmatrix}^{T} & \mathit{on~full~range} \end{matrix}\right. \\ \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}= \begin{bmatrix} Y'\\ P_{B}\\ P_{R} \end{bmatrix} \times \mathit{Scale} + \mathit{Offset} \\ \begin{bmatrix} Y'\\ P_{B}\\ P_{R} \end{bmatrix}= \left ( \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}- \mathit{Offset} \right ) \times \mathit{Scale}^{-1} let Scale={[219224224]T[255255255]Ton narrow rangeon full rangelet Offset={[16128128]T[0128128]Ton narrow rangeon full rangeYCBCR=YPBPR×Scale+OffsetYPBPR=YCBCROffset×Scale1

相互转换最后需要进行四舍五入和边界剪裁(round and clamp),因此不可避免地会造成一定程度上的精度损失。也有人为此对转换矩阵进行了微调,但无法彻底避免。

总体流程

综合上面三个步骤,可得到R′dG′dB′d<=>Y′CbCr的总体流程:

l e t   f = 1 255 l e t   S c a l e = { [ 219 224 224 ] T o n   n a r r o w   r a n g e [ 255 255 255 ] T o n   f u l l   r a n g e l e t   O f f s e t = { [ 16 128 128 ] T o n   n a r r o w   r a n g e [ 0 128 128 ] T o n   f u l l   r a n g e [ Y ′ C B C R ] = O f f s e t + M ⋅ f ⋅ [ R D ′ G D ′ B D ′ ] × S c a l e [ R D ′ G D ′ B D ′ ] = 1 f ⋅ M − 1 ⋅ ( [ Y ′ C B C R ] − O f f s e t ) × S c a l e − 1 \mathit{let}~ f = \frac{1}{255} \\ \mathit{let}~\mathit{Scale}= \left\{\begin{matrix} \begin{bmatrix} 219 & 224 & 224 \end{bmatrix}^{T} & \mathit{on~narrow~range}\\ \begin{bmatrix} 255 & 255 & 255 \end{bmatrix}^{T} & \mathit{on~full~range} \end{matrix}\right. \\ \mathit{let}~\mathit{Offset}= \left\{\begin{matrix} \begin{bmatrix} 16 & 128 & 128 \end{bmatrix}^{T} & \mathit{on~narrow~range}\\ \begin{bmatrix} 0 & 128 & 128 \end{bmatrix}^{T} & \mathit{on~full~range} \end{matrix}\right. \\ \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}= \mathit{Offset} + M \cdot f \cdot \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix} \times \mathit{Scale} \\ \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}= \frac{1}{f} \cdot M^{-1} \cdot \left ( \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}- \mathit{Offset} \right ) \times \mathit{Scale}^{-1} let f=2551let Scale={[219224224]T[255255255]Ton narrow rangeon full rangelet Offset={[16128128]T[0128128]Ton narrow rangeon full rangeYCBCR=Offset+MfRDGDBD×ScaleRDGDBD=f1M1YCBCROffset×Scale1

在实际计算中,会把f、M、scale结合到一起成为一个新矩阵,这样可以省略若干计算步骤。可以看到在full range下f和scale相互抵消。

同时,这里也给出简单的整数的近似公式,基本上就是把f、M、scale结合而成的矩阵各项乘以256取整,然后矩阵乘法的计算结果加128再右移8位(相当于定点数rounding)。 最后同样要经行clamp(公式中省略了):

l e t   M ′ = i n t { 256 ⋅ S c a l e × M ⋅ f } l e t   M ′ ′ = i n t { 256 ⋅ S c a l e − 1 × 1 f ⋅ M − 1 } [ Y ′ C B C R ] = O f f s e t + ( M ′ ⋅ [ R D ′ G D ′ B D ′ ] + [ 128 128 128 ] ) ≫ 8 [ R D ′ G D ′ B D ′ ] = ( M ′ ′ ⋅ ( [ Y ′ C B C R ] − O f f s e t ) + [ 128 128 128 ] ) ≫ 8 \mathit{let} ~M'= \mathit{int} \left \{ 256 \cdot \mathit{Scale} \times M \cdot f \right \} \\ \mathit{let} ~M''= \mathit{int} \left \{ 256 \cdot \mathit{Scale}^{-1} \times \frac{1}{f} \cdot M^{-1} \right \} \\ \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}= \mathit{Offset} + \left ( M' \cdot \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix} + \begin{bmatrix} 128\\ 128\\ 128 \end{bmatrix} \right ) \gg 8 \\ \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}= \left ( M'' \cdot \left ( \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}- \mathit{Offset} \right ) + \begin{bmatrix} 128\\ 128\\ 128 \end{bmatrix} \right ) \gg 8 let M=int{256Scale×Mf}let M=int{256Scale1×f1M1}YCBCR=Offset+MRDGDBD+1281281288RDGDBD=MYCBCROffset+1281281288

至此,我们可以推导出所有的情况下的公式。

那么公式的选择对编程到底有怎样的影响呢?举一个最简单的例子:现在需要用FFmpeg载入一个视频然后用OpenGL渲染,因此必须转换为RGB空间。如果视频是BT.709 narrow range的,编程中使用BT.601 full range的公式就会出错,渲染的色彩空间会出现扭曲。不过视频的信息中一般都会标明自己采用的色彩空间和range,FFmpeg中也有编程接口可以获取这些信息,所以这种用况下一定不要把转换公式写死,而要动态地判断。

着急的或者图方便的同学可以忽略上面所有内容,只看下面的公式列表就行(只适用于8bit)

BT.601 full range

[ Y ′ C B C R ] = [ 0 128 128 ] + [ 0.299000 0.587000 0.114000 − 0.168736 − 0.331264 0.500000 0.500000 − 0.418688 − 0.081312 ] ⋅ [ R D ′ G D ′ B D ′ ] [ R D ′ G D ′ B D ′ ] = [ 1.000000 0.000000 1.402000 1.000000 − 0.344136 − 0.714136 1.000000 1.772000 0.000000 ] ⋅ ( [ Y ′ C B C R ] − [ 0 128 128 ] ) \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}= \begin{bmatrix} 0\\ 128\\ 128 \end{bmatrix}+ \begin{bmatrix} 0.299000 & 0.587000 & 0.114000\\ -0.168736 & -0.331264 & 0.500000\\ 0.500000 & -0.418688 & -0.081312 \end{bmatrix} \cdot \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix} \\ \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}= \begin{bmatrix} 1.000000 & 0.000000 & 1.402000\\ 1.000000 & -0.344136 & -0.714136\\ 1.000000 & 1.772000 & 0.000000 \end{bmatrix} \cdot \left ( \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}- \begin{bmatrix} 0\\ 128\\ 128 \end{bmatrix} \right ) \\ YCBCR=0128128+0.2990000.1687360.5000000.5870000.3312640.4186880.1140000.5000000.081312RDGDBDRDGDBD=1.0000001.0000001.0000000.0000000.3441361.7720001.4020000.7141360.000000YCBCR0128128

BT.601 full range 整数近似

[ Y ′ C B C R ] = [ 0 128 128 ] + ( [ 77 150 29 − 43 − 85 128 128 − 107 − 21 ] ⋅ [ R D ′ G D ′ B D ′ ] + [ 128 128 128 ] ) ≫ 8 [ R D ′ G D ′ B D ′ ] = ( [ 256 0 359 256 − 88 − 183 256 454 0 ] ⋅ ( [ Y ′ C B C R ] − [ 0 128 128 ] ) + [ 128 128 128 ] ) ≫ 8 \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}= \begin{bmatrix} 0\\ 128\\ 128 \end{bmatrix}+ \left ( \begin{bmatrix} 77 & 150 & 29\\ -43 & -85 & 128\\ 128 & -107 & -21 \end{bmatrix} \cdot \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}+ \begin{bmatrix} 128\\ 128\\ 128 \end{bmatrix} \right ) \gg 8 \\ \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}= \left ( \begin{bmatrix} 256 & 0 & 359\\ 256 & -88 & -183\\ 256 & 454 & 0 \end{bmatrix} \cdot \left ( \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}- \begin{bmatrix} 0\\ 128\\ 128 \end{bmatrix} \right )+ \begin{bmatrix} 128\\ 128\\ 128 \end{bmatrix} \right ) \gg 8 \\ YCBCR=0128128+7743128150851072912821RDGDBD+1281281288RDGDBD=2562562560884543591830YCBCR0128128+1281281288

BT.601 narrow range

[ Y ′ C B C R ] = [ 16 128 128 ] + [ 0.256788 0.515639 0.100141 − 0.144914 − 0.290993 0.439216 0.429412 − 0.367788 − 0.071427 ] ⋅ [ R D ′ G D ′ B D ′ ] [ R D ′ G D ′ B D ′ ] = [ 1.164384 0.000000 1.596027 1.164384 − 0.391762 − 0.812968 1.164384 2.017232 0.000000 ] ⋅ ( [ Y ′ C B C R ] − [ 16 128 128 ] ) \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}= \begin{bmatrix} 16\\ 128\\ 128 \end{bmatrix}+ \begin{bmatrix} 0.256788 & 0.515639 & 0.100141\\ -0.144914 & -0.290993 & 0.439216\\ 0.429412 & -0.367788 & -0.071427 \end{bmatrix} \cdot \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix} \\ \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}= \begin{bmatrix} 1.164384 & 0.000000 & 1.596027\\ 1.164384 & -0.391762 & -0.812968\\ 1.164384 & 2.017232 & 0.000000 \end{bmatrix} \cdot \left ( \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}- \begin{bmatrix} 16\\ 128\\ 128 \end{bmatrix} \right ) \\ YCBCR=16128128+0.2567880.1449140.4294120.5156390.2909930.3677880.1001410.4392160.071427RDGDBDRDGDBD=1.1643841.1643841.1643840.0000000.3917622.0172321.5960270.8129680.000000YCBCR16128128

BT.601 narrow range 整数近似

[ Y ′ C B C R ] = [ 16 128 128 ] + ( [ 66 132 26 − 37 − 74 112 110 − 94 − 18 ] ⋅ [ R D ′ G D ′ B D ′ ] + [ 128 128 128 ] ) ≫ 8 [ R D ′ G D ′ B D ′ ] = ( [ 298 0 409 298 − 100 − 208 298 516 0 ] ⋅ ( [ Y ′ C B C R ] − [ 16 128 128 ] ) + [ 128 128 128 ] ) ≫ 8 \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}= \begin{bmatrix} 16\\ 128\\ 128 \end{bmatrix}+ \left ( \begin{bmatrix} 66 & 132 & 26\\ -37 & -74 & 112\\ 110 & -94 & -18 \end{bmatrix} \cdot \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}+ \begin{bmatrix} 128\\ 128\\ 128 \end{bmatrix} \right ) \gg 8 \\ \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}= \left ( \begin{bmatrix} 298 & 0 & 409\\ 298 & -100 & -208\\ 298 & 516 & 0 \end{bmatrix} \cdot \left ( \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}- \begin{bmatrix} 16\\ 128\\ 128 \end{bmatrix} \right )+ \begin{bmatrix} 128\\ 128\\ 128 \end{bmatrix} \right ) \gg 8 \\ YCBCR=16128128+663711013274942611218RDGDBD+1281281288RDGDBD=29829829801005164092080YCBCR16128128+1281281288

BT.709 full range

[ Y ′ C B C R ] = [ 0 128 128 ] + [ 0.212600 0.715200 0.072200 − 0.114572 − 0.385428 0.500000 0.500000 − 0.454153 − 0.045847 ] ⋅ [ R D ′ G D ′ B D ′ ] [ R D ′ G D ′ B D ′ ] = [ 1.000000 0.000000 1.574800 1.000000 − 0.187324 − 0.468124 1.000000 1.855600 0.000000 ] ⋅ ( [ Y ′ C B C R ] − [ 0 128 128 ] ) \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}= \begin{bmatrix} 0\\ 128\\ 128 \end{bmatrix}+ \begin{bmatrix} 0.212600 & 0.715200 & 0.072200\\ -0.114572 & -0.385428 & 0.500000\\ 0.500000 & -0.454153 & -0.045847 \end{bmatrix} \cdot \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix} \\ \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}= \begin{bmatrix} 1.000000 & 0.000000 & 1.574800\\ 1.000000 & -0.187324 & -0.468124\\ 1.000000 & 1.855600 & 0.000000 \end{bmatrix} \cdot \left ( \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}- \begin{bmatrix} 0\\ 128\\ 128 \end{bmatrix} \right ) \\ YCBCR=0128128+0.2126000.1145720.5000000.7152000.3854280.4541530.0722000.5000000.045847RDGDBDRDGDBD=1.0000001.0000001.0000000.0000000.1873241.8556001.5748000.4681240.000000YCBCR0128128

BT.709 full range 整数近似

[ Y ′ C B C R ] = [ 0 128 128 ] + ( [ 54 183 18 − 29 − 99 128 128 − 116 − 12 ] ⋅ [ R D ′ G D ′ B D ′ ] + [ 128 128 128 ] ) ≫ 8 [ R D ′ G D ′ B D ′ ] = ( [ 256 0 403 256 − 48 − 120 256 475 0 ] ⋅ ( [ Y ′ C B C R ] − [ 0 128 128 ] ) + [ 128 128 128 ] ) ≫ 8 \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}= \begin{bmatrix} 0\\ 128\\ 128 \end{bmatrix}+ \left ( \begin{bmatrix} 54 & 183 & 18\\ -29 & -99 & 128\\ 128 & -116 & -12 \end{bmatrix} \cdot \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}+ \begin{bmatrix} 128\\ 128\\ 128 \end{bmatrix} \right ) \gg 8 \\ \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}= \left ( \begin{bmatrix} 256 & 0 & 403\\ 256 & -48 & -120\\ 256 & 475 & 0 \end{bmatrix} \cdot \left ( \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}- \begin{bmatrix} 0\\ 128\\ 128 \end{bmatrix} \right )+ \begin{bmatrix} 128\\ 128\\ 128 \end{bmatrix} \right ) \gg 8 \\ YCBCR=0128128+5429128183991161812812RDGDBD+1281281288RDGDBD=2562562560484754031200YCBCR0128128+1281281288

BT.709 narrow range

[ Y ′ C B C R ] = [ 16 128 128 ] + [ 0.182586 0.628254 0.063423 − 0.098397 − 0.338572 0.439216 0.429412 − 0.398942 − 0.040274 ] ⋅ [ R D ′ G D ′ B D ′ ] [ R D ′ G D ′ B D ′ ] = [ 1.164384 0.000000 1.792741 1.164384 − 0.213249 − 0.532909 1.164384 2.112402 0.000000 ] ⋅ ( [ Y ′ C B C R ] − [ 16 128 128 ] ) \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}= \begin{bmatrix} 16\\ 128\\ 128 \end{bmatrix}+ \begin{bmatrix} 0.182586 & 0.628254 & 0.063423\\ -0.098397 & -0.338572 & 0.439216\\ 0.429412 & -0.398942 & -0.040274 \end{bmatrix} \cdot \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix} \\ \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}= \begin{bmatrix} 1.164384 & 0.000000 & 1.792741\\ 1.164384 & -0.213249 & -0.532909\\ 1.164384 & 2.112402 & 0.000000 \end{bmatrix} \cdot \left ( \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}- \begin{bmatrix} 16\\ 128\\ 128 \end{bmatrix} \right ) \\ YCBCR=16128128+0.1825860.0983970.4294120.6282540.3385720.3989420.0634230.4392160.040274RDGDBDRDGDBD=1.1643841.1643841.1643840.0000000.2132492.1124021.7927410.5329090.000000YCBCR16128128

BT.709 narrow range 整数近似

[ Y ′ C B C R ] = [ 16 128 128 ] + ( [ 47 161 16 − 25 − 87 112 110 − 102 − 10 ] ⋅ [ R D ′ G D ′ B D ′ ] + [ 128 128 128 ] ) ≫ 8 [ R D ′ G D ′ B D ′ ] = ( [ 298 0 459 298 − 55 − 136 298 541 0 ] ⋅ ( [ Y ′ C B C R ] − [ 16 128 128 ] ) + [ 128 128 128 ] ) ≫ 8 \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}= \begin{bmatrix} 16\\ 128\\ 128 \end{bmatrix}+ \left ( \begin{bmatrix} 47 & 161 & 16\\ -25 & -87 & 112\\ 110 & -102 & -10 \end{bmatrix} \cdot \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}+ \begin{bmatrix} 128\\ 128\\ 128 \end{bmatrix} \right ) \gg 8 \\ \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}= \left ( \begin{bmatrix} 298 & 0 & 459\\ 298 & -55 & -136\\ 298 & 541 & 0 \end{bmatrix} \cdot \left ( \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}- \begin{bmatrix} 16\\ 128\\ 128 \end{bmatrix} \right )+ \begin{bmatrix} 128\\ 128\\ 128 \end{bmatrix} \right ) \gg 8 \\ YCBCR=16128128+4725110161871021611210RDGDBD+1281281288RDGDBD=2982982980555414591360YCBCR16128128+1281281288

BT.2020 full range

[ Y ′ C B C R ] = [ 0 128 128 ] + [ 0.262700 0.678000 0.059300 − 0.139630 − 0.360370 0.500000 0.500000 − 0.459786 − 0.040214 ] ⋅ [ R D ′ G D ′ B D ′ ] [ R D ′ G D ′ B D ′ ] = [ 1.000000 0.000000 1.474600 1.000000 − 0.164553 − 0.571353 1.000000 1.881400 0.000000 ] ⋅ ( [ Y ′ C B C R ] − [ 0 128 128 ] ) \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}= \begin{bmatrix} 0\\ 128\\ 128 \end{bmatrix}+ \begin{bmatrix} 0.262700 & 0.678000 & 0.059300\\ -0.139630 & -0.360370 & 0.500000\\ 0.500000 & -0.459786 & -0.040214 \end{bmatrix} \cdot \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix} \\ \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}= \begin{bmatrix} 1.000000 & 0.000000 & 1.474600\\ 1.000000 & -0.164553 & -0.571353\\ 1.000000 & 1.881400 & 0.000000 \end{bmatrix} \cdot \left ( \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}- \begin{bmatrix} 0\\ 128\\ 128 \end{bmatrix} \right ) \\ YCBCR=0128128+0.2627000.1396300.5000000.6780000.3603700.4597860.0593000.5000000.040214RDGDBDRDGDBD=1.0000001.0000001.0000000.0000000.1645531.8814001.4746000.5713530.000000YCBCR0128128

BT.2020 full range 整数近似

[ Y ′ C B C R ] = [ 0 128 128 ] + ( [ 67 174 15 − 36 − 92 128 128 − 118 − 10 ] ⋅ [ R D ′ G D ′ B D ′ ] + [ 128 128 128 ] ) ≫ 8 [ R D ′ G D ′ B D ′ ] = ( [ 256 0 377 256 − 42 − 146 256 482 0 ] ⋅ ( [ Y ′ C B C R ] − [ 0 128 128 ] ) + [ 128 128 128 ] ) ≫ 8 \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}= \begin{bmatrix} 0\\ 128\\ 128 \end{bmatrix}+ \left ( \begin{bmatrix} 67 & 174 & 15\\ -36 & -92 & 128\\ 128 & -118 & -10 \end{bmatrix} \cdot \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}+ \begin{bmatrix} 128\\ 128\\ 128 \end{bmatrix} \right ) \gg 8 \\ \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}= \left ( \begin{bmatrix} 256 & 0 & 377\\ 256 & -42 & -146\\ 256 & 482 & 0 \end{bmatrix} \cdot \left ( \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}- \begin{bmatrix} 0\\ 128\\ 128 \end{bmatrix} \right )+ \begin{bmatrix} 128\\ 128\\ 128 \end{bmatrix} \right ) \gg 8 \\ YCBCR=0128128+6736128174921181512810RDGDBD+1281281288RDGDBD=2562562560424823771460YCBCR0128128+1281281288

BT.2020 narrow range

[ Y ′ C B C R ] = [ 16 128 128 ] + [ 0.225613 0.595576 0.052091 − 0.119918 − 0.316560 0.439216 0.429412 − 0.403890 − 0.035325 ] ⋅ [ R D ′ G D ′ B D ′ ] [ R D ′ G D ′ B D ′ ] = [ 1.164384 0.000000 1.678674 1.164384 − 0.187326 − 0.650424 1.164384 2.141772 0.000000 ] ⋅ ( [ Y ′ C B C R ] − [ 16 128 128 ] ) \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}= \begin{bmatrix} 16\\ 128\\ 128 \end{bmatrix}+ \begin{bmatrix} 0.225613 & 0.595576 & 0.052091\\ -0.119918 & -0.316560 & 0.439216\\ 0.429412 & -0.403890 & -0.035325 \end{bmatrix} \cdot \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix} \\ \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}= \begin{bmatrix} 1.164384 & 0.000000 & 1.678674\\ 1.164384 & -0.187326 & -0.650424\\ 1.164384 & 2.141772 & 0.000000 \end{bmatrix} \cdot \left ( \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}- \begin{bmatrix} 16\\ 128\\ 128 \end{bmatrix} \right ) \\ YCBCR=16128128+0.2256130.1199180.4294120.5955760.3165600.4038900.0520910.4392160.035325RDGDBDRDGDBD=1.1643841.1643841.1643840.0000000.1873262.1417721.6786740.6504240.000000YCBCR16128128

BT.2020 narrow range 整数近似

[ Y ′ C B C R ] = [ 16 128 128 ] + ( [ 58 152 13 − 31 − 81 112 110 − 103 − 9 ] ⋅ [ R D ′ G D ′ B D ′ ] + [ 128 128 128 ] ) ≫ 8 [ R D ′ G D ′ B D ′ ] = ( [ 298 0 430 298 − 48 − 167 298 548 0 ] ⋅ ( [ Y ′ C B C R ] − [ 16 128 128 ] ) + [ 128 128 128 ] ) ≫ 8 \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}= \begin{bmatrix} 16\\ 128\\ 128 \end{bmatrix}+ \left ( \begin{bmatrix} 58 & 152 & 13\\ -31 & -81 & 112\\ 110 & -103 & -9 \end{bmatrix} \cdot \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}+ \begin{bmatrix} 128\\ 128\\ 128 \end{bmatrix} \right ) \gg 8 \\ \begin{bmatrix} R'_{D}\\ G'_{D}\\ B'_{D} \end{bmatrix}= \left ( \begin{bmatrix} 298 & 0 & 430\\ 298 & -48 & -167\\ 298 & 548 & 0 \end{bmatrix} \cdot \left ( \begin{bmatrix} Y'\\ C_{B}\\ C_{R} \end{bmatrix}- \begin{bmatrix} 16\\ 128\\ 128 \end{bmatrix} \right )+ \begin{bmatrix} 128\\ 128\\ 128 \end{bmatrix} \right ) \gg 8 \\ YCBCR=16128128+583111015281103131129RDGDBD+1281281288RDGDBD=2982982980485484301670YCBCR16128128+1281281288

参考资料:

[1] 维基百科
[2] BT.601标准spec

你可能感兴趣的:(视频编解码,视频处理,yuv,rgb,图像识别)