YUV to RGB

YUV

YUV 是一種顏色編碼方法,Y 表明明亮度,U 和 V 則是色度。YUV 是一類顏色編碼方法的統稱,如 YUV、Y`UV、YCbCr、YPbPr 等專有名詞均可以稱爲 YUV。數組

歷史

Y'UV 的發明是因爲黑白電視到彩色電視的過渡時期。黑白視頻只有 Y 數據,也就是灰階值,到了彩色電視時期,增長了 UV 表示圖像的色度(U 表明藍色通道與亮度的差值,V 表明紅色通道與亮度的差值),若是忽略了 UV,那麼剩下的 Y 信號就與以前的黑白電視表現一致,這樣便解決了黑白電視和彩色電視的兼容問題。ide

RGB 訴求於人眼對色彩的感應,YUV 則着重於視覺對於亮度的敏感程度。所以 YUV 能夠經過下降色度的採樣率來減小帶寬而不會對圖像產生大的影響。優化

YUV Formats

YUV 格式一般有兩類:編碼

  • packed formats:打包格式,每一個像素點的 Y、U、V 混合在一塊兒存放,相似 RGB 的存放方式。
  • planar formats:平面格式,將一幀圖像的 Y、U、V 以獨立的平面組織,存放在不一樣的數組中。

根據不一樣的採樣方式分爲 YUV4:4:四、YUV4:2:二、YUV4:2:0、YUV4:1:1 等,表明 Y:U:V。orm

  • YUV4:4:4 表示完整採樣,保持了 UV 份量的完整信息。
  • YUV4:2:2 表示色度份量具備 2:1的水平採樣,垂直徹底採樣。
  • YUV4:2:0 表示色度份量具備 2:1的水平採樣,2:1的垂直採樣,YUV4:2:0 並非指只有 U,沒有 V,而是對於每一行,只有一個 U 或者 V 份量,若是第一行是 4:2:0,那麼下一行就是 4:0:2,以此類推。
  • YUV4:1:1 表示色度份量具備 4:1的水平採樣,垂直徹底採樣。

常見的 YUV 存儲方式

YUV420P: I420/YU12/YV12

YUV420P 屬於 YUV4:2:0 採樣,是一種 Plane 模式,將 Y、U、V 份量分別打包,依次存儲。YU12 與 I420 相同,而 YV12 與 YU12 的區別僅僅是 UV 順序不一樣。視頻

在 I420/YU12 格式中,是以 Y平面-> U 平面-> V 平面的方式排列的,即 YUV;YV12 則相反,以 Y平面-> V 平面-> U 平面的方式排列,即 YVU。ip

排列舉例:get

  • I420/YU12:
    • 2*2圖像 YYYYUV
    • 4*4圖像 YYYYYYYYYYYYYYYYUUUUVVVV
  • YV12:
    • 2*2圖像 YYYYVU
    • 4*4圖像 YYYYYYYYYYYYYYYYVVVVUUUU

YU12 取名錶明 Y 後面緊跟 U,YV12 則相反,12 表明它位深 12,在 2*2 圖像中,一共四個像素點,佔用 6 個字節,則每一個像素佔用空間 12 bit。it

YUV420SP: NV12/NV21

YUV420P 屬於 YUV4:2:0 採樣,是一種 Two-Plane 模式,即 Y 和 UV 分爲兩個平面,UV 爲交錯存儲。NV12 和 NV21 相似,區別僅是 UV 順序不一樣。io

在 NV12 格式中,是以 Y平面-> UV平面(以 UV 的方式交錯存儲);NV21 則相反,以 Y平面-> UV平面(以 VU 的方式交錯存儲)。

排列舉例:

  • NV12:
    • 2*2圖像 YYYYUV
    • 4*4圖像 YYYYYYYYYYYYYYYYUVUVUVUV
  • NV21:
    • 2*2圖像 YYYYVU
    • 4*4圖像 YYYYYYYYYYYYYYYYVUVUVUVU

YUV 和 RGB 的轉換

首先說下 YCbCr,YCbCr 是被 ITU 定義在標準 ITU-R BT.601(標清)、ITU-R BT.709(高清)、ITU-R BT.2020(超高清)中的一種色彩空間, 是一種針對 RGB 所作的編碼,是 YUV 壓縮和偏移的版本,YCbCr 一般用於視頻和圖像壓縮和傳輸,在視頻編解碼中的"YUV 圖像"指的就是 YCbCr。

對於 YCbCr 和 RGB 的轉換來講,不一樣的標準有不一樣的方式,而且有時候須要區分 Video Range[16-235] 和 Full Range[0-255]。

爲方便計算機運算和優化,下列提供定點化後的公式,默認使用 ITU-R BT.601 Video Range。

ITU-R BT.601 標準:

  • RGB 轉 YCbCr (Video Range):
\begin{bmatrix}
Y  \\
Cb \\
Cr
\end{bmatrix}=
\begin{bmatrix}
16	\\
128 \\
128
\end{bmatrix}+
\begin{bmatrix}
0.257 & 0.504 & 0.098 	\\
-0.148 & -0.291 & 0.439 \\
0.439 & -0.368 & -0.071
\end{bmatrix}*
\begin{bmatrix}
R \\
G \\
B
\end{bmatrix}

​ 定點化後:

\begin{align}
Y =& 16 + ((66 * R + 129 * G + 25 * B + 128)>>8) \\
Cb =& 128 + ((-38 * R - 74 * G + 112 * B + 128)>>8) \\
Cr =& 128 + ((112 * R - 94 * G - 18 * B + 128)>>8)
\end{align}
  • YCbCr 轉 RGB (Video Range):
\begin{bmatrix}
R \\
G \\
B
\end{bmatrix}=
\begin{bmatrix}
1.164 & 0.000 & 1.596 \\
1.164 & -0.392 & -0.813 \\
1.164 & 2.017 & 0.000
\end{bmatrix}*
\begin{bmatrix}
(Y-16) \\
(Cb-128) \\
(Cr-128)
\end{bmatrix}

​ 定點化後:

\begin{align}
&限制範圍[0,255] \\
&R = (298 * (Y - 16) + 409 * (Cr -128) + 128) >> 8 \\
&G = (298 * (Y - 16) - 100 * (Cb -128) - 208 * (Cr - 128) + 128) >> 8 \\
&B = (298 * (Y - 16) + 516 * (Cb -128) + 128)>>8
\end{align}
  • RGB 轉 YCbCr (Full Range):
\begin{bmatrix}
Y  \\
Cb \\
Cr
\end{bmatrix}=
\begin{bmatrix}
0	\\
128 \\
128
\end{bmatrix}+
\begin{bmatrix}
0.299 & 0.587 & 0.114 	\\
-0.169 & -0.331 & 0.500 \\
0.500 & -0.419 & -0.0813
\end{bmatrix}*
\begin{bmatrix}
R \\
G \\
B
\end{bmatrix}

​ 定點化後:

\begin{align}
Y =& ((77 * R + 150 * G + 29 * B + 128)>>8) \\
Cb =& 128 + ((-43 * R - 85 * G + 128 * B + 128)>>8) \\
Cr =& 128 + ((128 * R - 107 * G - 21 * B + 128)>>8)
\end{align}
  • YCbCr 轉 RGB (Full Range):
\begin{bmatrix}
R \\
G \\
B
\end{bmatrix}=
\begin{bmatrix}
1.000 & 0.000 & 1.402 \\
1.000 & -0.344 & 0.714 \\
1.000 & 1.772 & 0.000
\end{bmatrix}*
\begin{bmatrix}
Y \\
(Cb-128) \\
(Cr-128)
\end{bmatrix}

​ 定點化後:

\begin{align}
&限制範圍[0,255] \\
&R = (Y + 359 * (Cr -128) + 128) >> 8 \\
&G = (Y - 88 * (Cb -128) + 183 * (Cr - 128) + 128) >> 8 \\
&B = (Y + 454 * (Cb -128) + 128)>>8
\end{align}

ITU-R BT.709 標準:

  • RGB 轉 YCbCr (Video Range):
\begin{bmatrix}
Y  \\
Cb \\
Cr
\end{bmatrix}=
\begin{bmatrix}
16	\\
128 \\
128
\end{bmatrix}+
\begin{bmatrix}
0.183 & 0.614 & 0.062 	\\
-0.101 & -0.339 & 0.439 \\
0.439 & -0.399 & -0.040
\end{bmatrix}*
\begin{bmatrix}
R \\
G \\
B
\end{bmatrix}

​ 定點化後:

\begin{align}
Y =& 16 + ((47 * R + 157 * G + 16 * B + 128)>>8) \\
Cb =& 128 + ((-26 * R - 87 * G + 112 * B + 128)>>8) \\
Cr =& 128 + ((112 * R - 102 * G - 10 * B + 128)>>8)
\end{align}
  • YCbCr 轉 RGB (Video Range):
\begin{bmatrix}
R \\
G \\
B
\end{bmatrix}=
\begin{bmatrix}
1.164 & 0.000 & 1.793 \\
1.164 & -0.213 & -0.534 \\
1.164 & 2.112 & 0.000
\end{bmatrix}*
\begin{bmatrix}
(Y-16) \\
(Cb-128) \\
(Cr-128)
\end{bmatrix}

​ 定點化後:

\begin{align}
&限制範圍[0,255] \\
&R = (298 * (Y - 16) + 459 * (Cr -128) + 128) >> 8 \\
&G = (298 * (Y - 16) - 55 * (Cb -128) - 137 * (Cr - 128) + 128) >> 8 \\
&B = (298 * (Y - 16) + 541 * (Cb -128) + 128)>>8
\end{align}
  • RGB 轉 YCbCr (Full Range):
\begin{bmatrix}
Y  \\
Cb \\
Cr
\end{bmatrix}=
\begin{bmatrix}
0	\\
128 \\
128
\end{bmatrix}+
\begin{bmatrix}
0.213 & 0.715 & 0.072 	\\
-0.117 & -0.394 & 0.511 \\
0.511 & -0.464 & -0.047
\end{bmatrix}*
\begin{bmatrix}
R \\
G \\
B
\end{bmatrix}

​ 定點化後:

\begin{align}
Y =& ((55 * R + 183 * G + 19 * B + 128)>>8) \\
Cb =& 128 + ((-30 * R - 101 * G + 130 * B + 128)>>8) \\
Cr =& 128 + ((130 * R - 119 * G - 12 * B + 128)>>8)
\end{align}
  • YCbCr 轉 RGB (Full Range):
\begin{bmatrix}
R \\
G \\
B
\end{bmatrix}=
\begin{bmatrix}
1.000 & 0.000 & 1.540 \\
1.000 & -0.183 & -0.459 \\
1.000 & 1.816 & 0.000
\end{bmatrix}*
\begin{bmatrix}
Y \\
(Cb-128) \\
(Cr-128)
\end{bmatrix}

​ 定點化後:

\begin{align}
&限制範圍[0,255] \\
&R = (Y + 394 * (Cr -128) + 128) >> 8 \\
&G = (Y - 47 * (Cb -128) - 118 * (Cr - 128) + 128) >> 8 \\
&B = (Y + 465 * (Cb -128) + 128)>>8
\end{align}

參考

en.wikipedia.org/wiki/YUV

en.wikipedia.org/wiki/YCbCr

zhuanlan.zhihu.com/p/28766366

相關文章
相關標籤/搜索