【音视频开发】YUV色彩空间详解(数字视频与图像处理)
YUV色彩空间是数字视频处理中的核心概念,它将图像分解为亮度(Y')和色度(U/V)分量,利用人眼对亮度更敏感的特性实现高效压缩。本文详解YUV与Y'CbCr的关系、转换矩阵、色度子采样、像素格式等关键技术,包括BT.601/709标准差异、4:2:0/4:2:2采样方式及NV12/I420等内存布局。特别强调正确处理色彩矩阵、范围限定和色度定位的重要性,避免常见的色偏、发灰等问题。通过OpenC
·
YUV色彩空间详解(数字视频与图像处理)
目录
-
- 核心概念
-
- YUV 与 Y’CbCr 的关系
-
- 转换矩阵与范围
-
- 色度子采样与定位
-
- 像素格式与内存布局
-
- 压缩优势与应用
-
- 处理流程与注意事项
-
- OpenCV 与 FFmpeg 示例
-
- 常见坑与排查清单
-
- 快速心智模型
1. 核心概念
- 将图像拆分为明度与色度:
Y'表示伽马后的明度(非线性),U/V表示颜色偏向的差分分量。 - 人眼对亮度更敏感、对色度更不敏感,便于对色度更强压缩而不显著损伤感知质量。
2. YUV 与 Y’CbCr 的关系
- 工程实践中“YUV”多指数字视频的
Y'CbCr:Y'是伽马后的明度,Cb/Cr是蓝/红与明度的差分,经缩放与偏移形成整数域表示。 - 经典线性关系(8-bit,全范围)用于理解与近似实现,但具体标准定义以 BT.601/709/2020 为准。
3. 转换矩阵与范围
-
BT.601(SDTV):
Y' = 0.299R + 0.587G + 0.114BCb = −0.168736R − 0.331264G + 0.5B + 128Cr = 0.5R − 0.418688G − 0.081312B + 128
-
BT.709(HD/UHD):
Y' = 0.2126R + 0.7152G + 0.0722BCb = −0.114572R − 0.385428G + 0.5B + 128Cr = 0.5R − 0.454153G − 0.045847B + 128
-
范围(Range):
- 电视范围(limited):
Y'∈[16,235],Cb/Cr∈[16,240] - 全范围(full):
[0,255] - 范围或矩阵选择错误会导致黑场抬升/压黑、整体发灰或明显色偏(肤色最敏感)。
- 电视范围(limited):
4. 色度子采样与定位
- 采样格式:
4:4:4:Y,U,V同分辨率,质量最佳,带宽最高。4:2:2:水平方向色度减半,每两个亮度像素共享一组色度。4:2:0:水平与垂直都减半,四个亮度像素共享一组色度,最常用于压缩视频。
- 色度定位(Chroma Siting):色度像素相对亮度像素的对齐位置(居中/共址)因标准不同而异;上采样需使用正确滤波与对齐避免色边与锯齿。
5. 像素格式与内存布局
- 平面(planar):
yuv420p/I420:Y(W×H)+U(W/2×H/2)+V(W/2×H/2)yuv422p:Y(W×H)+U(W/2×H)+V(W/2×H)
- 半平面(semi-planar):
NV12:Y平面 +UV交错平面(W×H/2)NV21:Y平面 +VU交错平面(W×H/2)
- 打包(packed):
YUY2/YUYV:字节序Y U Y V ...行内交织,常见于采集设备输出。
- 遍历像素需考虑每平面的
stride与对齐填充,而非单纯使用图像宽度。
6. 压缩优势与应用
- 编码器优先保护
Y'的细节,在U,V上更强量化与子采样;人眼对细微色差不敏感,使整体压缩率显著提升而感知质量保持良好。 - 视频编解码与传输链路、硬件ISP/编解码器、GPU纹理等广泛以YUV工作。
7. 处理流程与注意事项
- 编码链:
RGB→YUV→压缩→传输;显示链:YUV→RGB→显示设备 - 选择正确的色彩矩阵(BT.601/709/2020)与范围(limited/full);链路内保持一致性。
4:2:0→4:4:4上采样时使用合适滤波与正确对齐,避免色边与伪影。Y'为伽马后的明度,涉及物理计算或合成时应在线性空间操作再映射到显示空间。
8. OpenCV 与 FFmpeg 示例
import cv2
src = cv2.imread('input.jpg')
ycrcb = cv2.cvtColor(src, cv2.COLOR_BGR2YCrCb)
i420 = cv2.cvtColor(src, cv2.COLOR_BGR2YUV_I420)
restored = cv2.cvtColor(i420, cv2.COLOR_YUV2BGR_I420)
cv2.imwrite('ycrcb.png', ycrcb)
cv2.imwrite('restored.png', restored)
ffmpeg -i input.mp4 -pix_fmt yuv420p -colorspace bt709 -color_primaries bt709 -color_trc bt709 out_yuv420p.mp4
ffmpeg -i input.mp4 -vf scale=in_color_matrix=bt709:out_color_matrix=bt709 -pix_fmt nv12 out_nv12.mp4
9. 常见坑与排查清单
- 范围错用:limited内容按full显示会发灰;full内容按limited显示会压黑/过曝。
- 矩阵错用:用BT.601处理BT.709内容会整体色偏,肤色偏差尤为明显。
- 上采样错位:
UV与Y未对齐导致彩色边缘晕染或锯齿。 - 平面顺序误解:
I420(Y U V)与YV12(Y V U)顺序不同,交换将导致紫/绿偏色。
10. 快速心智模型
- 将
Y'视为高质量黑白图,承载绝大多数细节与纹理;U,V是颜色倾向的低分辨率附图。 - 压缩时优先保护
Y',对U,V更大胆量化与子采样以提升效率。
11. U/V 的含义与实践
-
核心理解
U与V是色度差分轴:U近似描述“蓝色相对亮度”的差分,V近似描述“红色相对亮度”的差分;它们不承载亮度,只描述颜色方向与强度。- 心智模型:将灰色点视为平面中心
(128,128),U–V平面上的向量方向对应“色相”,长度对应“饱和度”。
-
数学关系(以 BT.601 全范围为例)
Y' = 0.299R + 0.587G + 0.114BU (Cb) ≈ −0.168736R − 0.331264G + 0.5B + 128 ≈ k·(B − Y') + 128V (Cr) ≈ 0.5R − 0.418688G − 0.081312B + 128 ≈ k·(R − Y') + 128- 逆变换(示意):
R ≈ Y' + 1.402·(V−128),B ≈ Y' + 1.772·(U−128),G ≈ Y' − 0.344·(U−128) − 0.714·(V−128)(系数随标准略有变化)。
-
直观含义与方向解释
- 中心值:
U=128, V=128表示“无色”(灰);偏离中心越远,颜色越“饱和”。 U增大(>128)→ 偏蓝/青;U减小(<128)→ 偏黄/绿。V增大(>128)→ 偏红/洋红;V减小(<128)→ 偏青绿/黄。- 亮度独立:改变
U或V不改变明暗(由Y'决定),只改变色相/饱和。
- 中心值:
-
范围与标准
- 电视范围(limited):
Y'∈[16,235],U/V∈[16,240];全范围(full):[0,255]。 - 系数随标准(BT.601/709/2020)变化;矩阵或范围错用会导致发灰、压黑或明显色偏(肤色尤敏感)。
- 电视范围(limited):
-
子采样与压缩
4:4:4不子采样;4:2:2水平减半;4:2:0水平+垂直减半。- 人眼对色度不敏感,
U/V可低分辨率存储并更强量化,显著提升压缩效率;Y'保留细节。
-
像素格式差异与注意
- 平面:
yuv420p/I420(Y+U+V)。 - 半平面:
NV12(Y+ 交错UV)、NV21(Y+ 交错VU)。 - 打包:
YUY2/YUYV行内交织。 - 注意 UV 顺序与色度定位(居中/共址),错用会出现紫/绿反转或色边。
- 平面:
-
应用场景
- 肤色检测:在
U–V平面内,肤色落在稳定椭圆区域,用于 AWB 与人脸优先。 - 蓝绿幕抠像:利用
U或V维度的集中性构建阈值/概率模型。 - 编码调优:对
U/V更强量化与更大步长,平衡带宽与感知质量。
- 肤色检测:在
-
常见坑与排查
NV12/NV21顺序反:颜色紫/绿颠倒。- 矩阵/范围混用:BT.601 处理 BT.709 内容、limited 当 full 显示导致色偏/发灰。
- 上采样错位:
4:2:0→4:4:4还原时,色度对齐错误引起彩边。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)