RGB 转换至 YCbCr (YUV) 的计算公式

对于每个取样点的 R,G,B 值, 在转换到 YUV colour space 时, 首先定义画面的平均亮度值(Luminance), Y, 其计算公式为:

Y = kr*R + kg*G + kb*B
kr, kg, kb 为 weighting factors (加权因数), kr + kg + kb = 1 恒定.
(其中, ITU-R BT.601 定义 kb = 0.114 和 kr = 0.299)

然后定义 Cr, Cg, Cb 为颜色强度 (colour intensity) 与这个 luminance 的差值:

Cb = B − Y
Cr = R − Y
Cg = G − Y

这时对于一个取样点, 完整的信息被保存于 Y, Cb, Cr, Cg 四个变量里, 此时相对于 RGB colour space 的三个变量值, 这样的计算公式还没有优势.

但由于 Cb + Cr + Cg 是个常数, 我们可以用其中两个变量来表达原来所需的三个, 并且在数据的贮存和传输中也只需使用其中的两个变量. 这样, 就完成了定义 YCbCr colour space 中的三个变量了: Y, Cb, Cr.

一个在 RGB colour space 中取样值的三个变量 R, G, B 在转换为 YCbCr 的公式于是重新 定义/转化 为:

Y = kr*R + (1 − kb − kr )*G + kb*B........ (1)
Cb = 0.5(1 − kb) / (B − Y )
Cr = 0.5(1 − kr) / (R − Y )
然后再用公式 (1) 代换 Y, 得到仅含 R,G,B 的 Cb, Cr 函数 (kr,kb 视为常数)

作简单的代数也可以求出从 YCbCr 转换至 RGB 的公式:

R = Y + (1 - kr)*Cr/0.5
G = Y - [kb*(1 - kb)*Cb]/ [0.5*(1 - kb - kr)] - [kr*(1 - kr)*Cr]/ [0.5*(1 - kb - kr)]
B = Y + (1 - kb)*Cb/0.5

代入 ITU-R BT.601 定义的 kb = 0.114 和 kr = 0.299
那么 RGB ---> YCbCr 的公式为:

Y = 0.299R + 0.587G + 0.114B........ (2)
Cb = 0.564(B − Y )
Cr = 0.713(R − Y )
同样地, 然后再用公式 (2) 代换 Y, 得到仅含 R,G,B 的 Cb, Cr 函数 (kr,kb 视为常数)

YCbCr ---> RGB 的公式为:

R = Y + 1.402Cr
G = Y − 0.344Cb − 0.714Cr
B = Y + 1.772Cb

 

Quote: https://bbs.et8.net/bbs/showthread.php?t=501147

你可能感兴趣的:(PHP,.net,bbs)