首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么YUV <-> RGB中的常数被选择为它们的值

为什么YUV <-> RGB中的常数被选择为它们的值
EN

Stack Overflow用户
提问于 2018-12-28 02:13:22
回答 1查看 353关注 0票数 2

我已经阅读了各种资源,这些资源定义了用于从RGB转换到YUV的常量,这些常量是在不同的标准中重新定义的,其值略有不同。

来自维基 on YCbCr

国际电联-R BT.601转换-RBT.601(前CCIR 601)标准中为标准清晰度电视使用而定义的Y‘’CbCr格式,用于数字组件视频,从相应的RGB空间导出如下: Kr=0.299 Kg=0.587 Kb=0.114

选择这些常量值的原因是什么?为什么它们在其他标准上会有所不同呢?如我们所见,这里

EN

回答 1

Stack Overflow用户

发布于 2020-10-16 16:09:00

它们是根据CIE xy色度图中的RGB和标准照明灯xy坐标计算的。

根据编号601 625 - CIE的xy色度值是:

代码语言:javascript
复制
Wx = 0.3127; Wy = 0.3290; // White Point D65
Rx = 0.640;  Ry = 0.330;  // Red primary
Gx = 0.290;  Gy = 0.600;  // Green primary
Bx = 0.150;  By = 0.060;  // Blue primary

Yxy和XYZ颜色空间的定义如下:

代码语言:javascript
复制
Y = 1.0; // maximum luminance
x + y + z = 1;
Xw = Wx / Wy; // from X = Y * x / y
Zw = Wz / Wy; // from Z = Y * z / y

在xy图上混合RGB基元将产生一些中心点。RGB空间要求中心点为白点。因此,我们必须使用以下方法( RGB -> XYZ变换矩阵)计算RGB标度系数(Ra,Rg,Rb):

代码语言:javascript
复制
Ra * Rx + Ga * Gx + Ba * Bx = Xw = Wx / Wy
Ra * Ry + Ga * Gy + Ba * By = Yw = 1
Ra * Rz + Ga * Gz + Ba * Bz = Zw = Wz / Wy

当我们解出上述方程时,我们得到:

代码语言:javascript
复制
Ra = 0.9059594488629998
Ga = 0.8259453663844839
Ba = 1.4326521467778324

我们可以使用它生成RGB (Rec.601625) -> XYZ转换矩阵:

代码语言:javascript
复制
[ Ra * Rx, Ga * Gx, Ba * Bx ]
[ Ra * Ry, Ga * Gy, Ba * By ]
[ Ra * Rz, Ga * Gz, Ba * Bz ]

中间行将包含Kr、Kg、Kb Y系数:

代码语言:javascript
复制
[ 0.2123763607050675, 0.7010598569257229, 0.08656378236920959 ]

这与YCbCr的Kr,Kg,Kb上的维基完全不同。因为wiki上的系数是针对SMPTE C颜色空间的,它有:

代码语言:javascript
复制
Wx = 0.3127; Wy = 0.3290; // White Point D65
Rx = 0.630;  Ry = 0.340;  // Red primary
Gx = 0.310;  Gy = 0.595;  // Green primary
Bx = 0.155;  By = 0.070;  // Blue primary

如果我们重复上面的话,我们得到了SMPTE的Kr,Kg,Kb Y系数:

代码语言:javascript
复制
[ 0.29896661812479, 0.5864212101329835, 0.1146121717422266 ]

是维基的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53952959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档