文章目录
- 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, :