跳到主要内容

YUV 色彩转换 (yuv)

YUV 与 RGB 色彩空间转换模块,支持 BT.601 和 BT.709 两种标准,使用整数运算避免浮点依赖。

色彩空间

标准适用场景
BT.601标清(SD)视频,如 PAL/NTSC 电视
BT.709高清(HD)视频,如 720p/1080p

两者使用不同的转换系数,混用会导致色彩偏差。

数据范围

采用有限范围(Limited Range):

分量范围说明
Y16~235亮度,16 为黑,235 为白
U / V16~240色度,128 为无色
R / G / B0~255全范围

API

BT.601

void bt601_yuv2rgb(uint8_t y, uint8_t u, uint8_t v, uint8_t * r, uint8_t * g, uint8_t * b);

BT.601 标准下 YUV 转 RGB,结果钳位到 [0, 255]。

void bt601_rgb2yuv(uint8_t r, uint8_t g, uint8_t b, uint8_t * y, uint8_t * u, uint8_t * v);

BT.601 标准下 RGB 转 YUV。

BT.709

void bt709_yuv2rgb(uint8_t y, uint8_t u, uint8_t v, uint8_t * r, uint8_t * g, uint8_t * b);

BT.709 标准下 YUV 转 RGB,结果钳位到 [0, 255]。

void bt709_rgb2yuv(uint8_t r, uint8_t g, uint8_t b, uint8_t * y, uint8_t * u, uint8_t * v);

BT.709 标准下 RGB 转 YUV。

使用示例

解码视频帧像素

uint8_t y = yplane[i];
uint8_t u = uplane[i / 2];
uint8_t v = vplane[i / 2];
uint8_t r, g, b;
bt709_yuv2rgb(y, u, v, &r, &g, &b);

编码 RGB 为 YUV

uint8_t y, u, v;
bt601_rgb2yuv(r, g, b, &y, &u, &v);