文章目錄
- 1、YUV
- 2、YUV vs RGB
- 3、RGB to YUV
- 4、YUV to RGB
- 附錄——YUV NV12 vs YUV NV21
- 參考
1、YUV
YUV 顏色空間,又常被稱作 YCbCr 顏色空間,是用于數字電視的顏色空間,在 ITU-R BT.601、BT.709、BT.2020 標準中被明確定義,這三種標準分別針對標清、高清、超高清數字電視。Y是亮度,Cb(U)、Cr(V)表示色度,三個分量是相互獨立的,它們分別表示圖像的亮度、藍色色差和紅色色差。
Y 分量表示圖像的亮度信息,它描述了圖像的明暗程度,是黑白電視信號需要的內容。
U 分量表示藍色色差,它描述了藍色和綠色之間的差異,用于還原圖像中的藍色和綠色。
V分量表示紅色色差,它描述了紅色和綠色之間的差異,用于還原圖像中的紅色和綠色。
在廣播電視中,使用 YCbCr 可解決黑白電視和彩色電視之間的信號兼容問題。
YUV 格式的發展初衷是為了解決彩色電視機與黑白電視的兼容問題。在彩色電視出現之前,電視信號只有亮度(Y)信息,即黑白信號。
彩色電視規格制定時,采用 YUV/YIQ 格式來處理彩色電視圖像,把 UV 視作表示彩度的C(Chrominance或Chroma)。
如果忽略 C 信號,剩下的 Y 信號就跟之前的黑白電視信號相同,這樣彩色電視機就能與黑白電視機兼容。
此外,利用人類眼睛對亮度變化的敏感性高于對顏色變化的敏感性這一生理特性,YUV 格式允許降低色度的帶寬,從而降低了傳輸帶寬。
2、YUV vs RGB
3、RGB to YUV
以 BT601: 標清數字電視(SDTV) 8bit 為例
import cv2
import numpy as npdef merge(u, v):if u.shape == v.shape:uv = np.zeros(shape=(u.shape[0], u.shape[1] * 2))for i in range(u.shape[0]):for j in range(u.shape[1]):uv[i, 2 * j] = u[i, j]uv[i, 2 * j + 1] = v[i, j]return uvelse:print("u 和 v 的 shape 不相等")def img2yuv(img, dtype):if img.ndim == 3:b = img[:, :, 0]g = img[:, :, 1]r = img[:, :, 2]y = (0.299*r + 0.587*g + 0.114*b)u = (-0.169*r - 0.331*g + 0.5*b + 128)[::2, ::2]v = (0.5*r - 0.419*g - 0.081*b + 128)[::2, :