深入学习YCbCr色彩模型

本文详细介绍了RGB颜色空间与YCbCr颜色空间之间的转换公式,并解释了这些转换系数的推导过程。通过数学计算展示了如何从RGB颜色转换到YCbCr颜色,反之亦然。同时提供了适用于整数运算的优化算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基础

  RGB转YCbCr的转换是这样的: [Y ] = [ 0.299   0.587   0.114 ]   [R]   [  0] [Cb] = [-0.1687 -0.3313  0.5   ] * [G] + [128] [Cr] = [ 0.5    -0.4187 -0.0813]   [B]   [128]   YCbCr转RGB的转换是这样的: [R] = [1  0        1.402  ]   [  Y   ] [G] = [1 -0.34414 -0.71414] * [Cb-128] [B] = [1  1.772    0      ]   [Cr-128]

二、那些变换系数是如何推导出来的?

  看到“YCbCr转RGB”中计算R、B的那些零没有,把它们精简掉: R = Y + 1.402*(Cr-128) B = Y + 1.772*(Cb-128)

  利用“Y = 0.299*R + 0.587*G + 0.114*B”这个事实来推导G: G = (Y - 0.299*R - 0.114*B) / 0.587

  将B、R的计算公式代入并化简: G = {Y - 0.299*[Y + 1.402*(Cr-128)] - 0.114*[Y + 1.772*(Cb-128)]} / 0.587  = {Y - [0.299*Y + 0.299*1.402*(Cr-128)] - [0.114*Y + 0.114*1.772*(Cb-128)]} / 0.587  = [(1 - 0.299 - 0.114)*Y - 0.299*1.402*(Cr-128) - 0.114*1.772*(Cb-128)] / 0.587  = Y - (0.299*1.402 / 0.587)*(Cr-128) - (0.114*1.772 / 0.587)*(Cb-128)  = Y - 0.714136*(Cr-128) - 0.344136*(Cb-128)   现在只是不明白神奇的1.772、1.402了,将它们代入“RGB转YCbCr”看看: Cb: 1.772 * [-0.1687 -0.3313  0.5   ] = [-0.2989364 -0.5870636  0.886    ] ≈ [ -0.299 -0.587 1-0.114] Cr: 1.402 * [ 0.5    -0.4187 -0.0813] = [ 0.701     -0.5870174 -0.1139826] ≈ [1-0.299 -0.587  -0.114]

  0.5看起来很明了,我们用 0.5 与 0.299、0.587、0.114 可以推导出那两个常数: Cb2b * 0.5 = 1-0.114 Cr2R * 0.5 = 1-0.299

Cb2b = 2*(1-0.114) = 1.772 Cr2R = 2*(1-0.299) = 1.402   用矩阵计算“RGB转YCbCr”很慢,我们可根据“YCbCr转RGB”逆推: Cb = (1 / 1.772)*(B - Y) + 128 = [1 / (2*(1-0.114))]*(B - Y) + 128 = (1/2)*[1 / (1-0.114)]*(B - Y) + 128 Cr = (1 / 1.402)*(R - Y) + 128 = [1 / (2*(1-0.299))]*(R - Y) + 128 = (1/2)*[1 / (1-0.299)]*(R - Y) + 128

  啊哈!现在理解 1-0.114、1-0.299 的由来了吧:当 B为1、R和G为0 时,(B-Y) 为 (1-0.114) = 0.886;当 B为0、R和G为1 时,(B-Y) 为 (0-0.886) = -0.886。所以需要除以(1-0.114)将结果缩放。   但是,我们一般需要结果在 0~255 这样的字节范围内,所以需要乘以(1/2),再加上128

  所以YCbCr完全是根据 0.299、0.587、0.114 这几个常数推导出来的。 三、整数算法

  先将前面的成果列出来。   RGB转YCbCr: Y = 0.299*R + 0.587*G + 0.114*B Cb = (1 / 1.772)*(B - Y) + 128 Cr = (1 / 1.402)*(R - Y) + 128

  YCbCr转RGB: R = Y + 1.402*(Cr-128) B = Y + 1.772*(Cb-128) G = Y - (0.299*1.402 / 0.587)*(Cr-128) - (0.114*1.772 / 0.587)*(Cb-128)

  可以看出,Cb、Cr、R、B 的计算就是用乘法缩放数值,完全可以数组查表,甚至那个加减128可以在查表时优化掉。   至于Y的计算,请参考《彩色转灰度算法彻底学习》。   唯一麻烦一点的是G,因为它有两个乘法,直接整数查表恐怕不精确。所以可以考虑将数值缩放65536倍(16位精度)。   大概是这样: Y = (R*19595 + G*38469 + B*7472) >> 16 Cb = YCbCr_B2Cb[0x100 + B - Y] Cr = YCbCr_R2Cr[0x100 + R - Y]

R = Y + YCbCr_Cr2R[Cr] B = Y + YCbCr_Cb2B[Cb] G = Y - ((YCbCr_Cr2G[Cr] + YCbCr_Cb2G[Cb]) >> 16)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值