色彩空间 YUV 与 RGB 转换实战

一、色彩空间基础概念
  1. RGB 模型
    基于红($R$)、绿($G$)、蓝($B$)三原色,符合人眼锥细胞感知特性,满足加色混合原理: $$ \begin{bmatrix} R \ G \ B \end{bmatrix} \in [0,255]^3 $$

  2. YUV 模型
    分离亮度($Y$)与色度($U,V$),其中:

    • $Y$:亮度分量,$Y \in [0,255]$
    • $U,V$:色度分量,$U,V \in [-128,127]$ 优势:兼容黑白设备,压缩效率高(人眼对亮度更敏感)

二、转换公式推导(基于 BT.601 标准)
  1. RGB → YUV 转换
    亮度分量: $$ Y = 0.299R + 0.587G + 0.114B $$ 色度分量: $$ U = 0.564(B - Y) + 128 $$ $$ V = 0.713(R - Y) + 128 $$

  2. YUV → RGB 转换
    色度校正: $$ R = Y + 1.403(V - 128) $$ $$ G = Y - 0.344(U - 128) - 0.714(V - 128) $$ $$ B = Y + 1.773(U - 128) $$

注:系数差异源于标准版本(BT.709/BT.2020),实际应用需对齐标准


三、Python 转换实现
import numpy as np

def rgb_to_yuv(rgb):
    """ RGB转YUV (BT.601标准) """
    r, g, b = rgb / 255.0
    y = 0.299 * r + 0.587 * g + 0.114 * b
    u = 0.564 * (b - y) + 0.5  # 归一化到[0,1]
    v = 0.713 * (r - y) + 0.5
    return np.clip([y, u, v], 0, 1)  # 限制数值范围

def yuv_to_rgb(yuv):
    """ YUV转RGB (BT.601标准) """
    y, u, v = yuv
    u -= 0.5; v -= 0.5  # 解除归一化
    r = y + 1.403 * v
    g = y - 0.344 * u - 0.714 * v
    b = y + 1.773 * u
    return np.clip([r, g, b], 0, 1) * 255  # 转回[0,255]


四、FFmpeg 滤镜实战应用
  1. 转换命令原理

    ffmpeg -i input.mp4 -vf "colorspace=all=bt601:iall=bt709" output.mp4
    

    • colorspace:核心转换滤镜
    • all=bt601:输出YUV标准
    • iall=bt709:输入RGB标准
  2. 典型场景案例
    需求:将H.264视频(YUV420p)转为ProRes RGB

    ffmpeg -i input.h264 -vf "format=yuv444p,colorspace=bt709:iall=bt601:trc=linear" -c:v prores output.mov
    

    • format=yuv444p:色度采样转换
    • trc=linear:伽马曲线校正
  3. 高级调优参数

    ffmpeg -i input.mp4 -vf "colorspace=range=pc:format=rgb24" output.mp4
    

    • range=pc:使用全范围(0-255)替代TV范围(16-235)
    • format=rgb24:指定输出像素格式

提示:使用ffmpeg -pix_fmts可查询支持的色彩空间格式


五、工程注意事项
  1. 标准对齐

    • 广播级视频常用BT.601(SD)或BT.709(HD)
    • 网络流媒体优先BT.2020(HDR)
  2. 性能优化

    • 硬件加速:添加-hwaccel cuda启用GPU
    • 并行处理:-threads 4指定多线程
  3. 色域损失
    转换过程存在截断误差,建议:

    • 保持浮点精度处理
    • 优先使用10bit以上色深
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐