gpt4 book ai didi

image-processing - 从rec的正确转换。 709转sRGB

转载 作者:行者123 更新时间:2023-12-02 11:22:27 25 4
gpt4 key购买 nike

如何将存储为 Y'CrCb(使用 rec. 709)的颜色正确转换为 sRGB?

我正在处理 HDTV 视频,并且正在使用 libavcodec 提取原始数据。
虽然我已经成功地进行了转换,但我还没有确信我做得对。 VLC 提供一个结果,在 Gimp 中使用“撰写”结果在另一个结果中进行转换,并且使用来自网络的代码也不一致。所以我还没有找到一个可靠的引用来比较。

我的研究和目前最好的选择如下。 (值是浮点数,范围为 0.0-1.0)
我最不确定的是 Gamma 校正。它使它比我预期的要轻一些,但我也不能说它看起来不对......

工作室摇摆去除

对于 8 位,Y' 的范围从 16 到 235。 Cr 和 Cb 的范围从 16 到 240,以 128 为中心。

y = (y - (16 / 255.0)) * ( 1 + 16.0 / 255.0 + (256-235) / 255.0 );
u = (u - (16 / 255.0)) * ( 1 + 16.0 / 255.0 + (256-240) / 255.0 );
v = (v - (16 / 255.0)) * ( 1 + 16.0 / 255.0 + (256-240) / 255.0 );

//Move chroma
u -= 0.5;
v -= 0.5;

我不确定假设你永远不会得到超出范围的值是否安全,或者你是否需要限制它。

对于更高的位深度,规范说 LSB 被忽略。这意味着什么?我也在使用 10 位编码的 Material ,所以这对我很感兴趣。

从 Y'CrCb 到 RGB

rec。 709 规范告诉如何将 RGB 转换为 Y'CrCb:
E'y = 0.2126 * E'r + 0.7152 * E'g + 0.0722 * E'b
E'cb = 0.5389 * ( E'b - E'y )
E'cr = 0.6350 * ( E'r - E'y )

Wikipedia为 Cb 和 Cr 提供了似乎更准确的定义:
Pb = 0.5 * (B' - Y') / (1 - Kb)
Pr = 0.5 * (R' - Y') / (1 - Kr)

其中 Kb 和 Kr 是 E'b 和 E'r 的因子。规范中的值。似乎是从这些方程四舍五入的。

RGB 可以通过反转方程(使用维基百科版本)来找到:
double r = y + 2*(1.0-kr) * v;
double b = y + 2*(1.0-kb) * u;
double g = ( y - kr * rr - kb*rb ) / kg;

G 可以直接使用 Cr 和 Cb 来完成:
double g = y - 2*kr*(1-kr)/kg * v - 2*kb*(1-kb)/kg * u;

(y 的因子为 (1-kr-kb)/kg,即 kg/kg 为 kr+kb+kg=1)

RGB 到 sRGB

我根本没有看到任何包含这一步的代码示例。
我们需要转换rec指定的色彩空间。 709 到 sRGB 中指定的那个。 AFAIK,两者之间的唯一区别是传递函数(即 Gamma )。由 rec 指定的 XY 坐标。 709 匹配 sRGB,但我不知道为什么 sRGB 在 rec 时包含“Z”坐标。 709没有。这有什么不同吗? (我对 CIE XYZ 一无所知。)

rec。 709 指定如何对线性 RGB 进行 Gamma 编码:
V = 1.099 * L^0.45 - 0.099    for    1 >= L >= 0.018
V = 4.500 * L for 0.018 > L >= 0

我们需要将其反转,但是线性截止值 0.018 不会为两个方程中的 V 提供相同的值。那么反向版本的范围是多少?:
L = ( ( V + 0.099 ) / 1.099 ) ^ (1/0.45)    for  1 >= V >= ?
L = V / 4.5000 for ? > V >= 0

sRGB 也有同样的问题,但修改为 0.0031308 更准确。我记得有人为 sRGB 设计了一个精确表示它的分数,但我找不到了...

我目前正在使用以下内容:
double cutoff = 1.099 * pow( 0.018, 0.45 ) - 0.099;
v = ( v < cutoff ) ? 1.0/4.5 * v : pow( (v+0.099)/1.099, 1.0/0.45 );
v = ( v <= 0.0031308 ) ? 12.92 * v : 1.055*pow( v, 1.0/2.4 ) - 0.055;

最佳答案

对于从线性 sRGB 到非线性 sRGB(压缩过程)和反向过程(逆压缩)的正确转换,我使用以下函数:

public double Companding(double channel)
{
double v = channel;
double V = v <= 0.0031308 ? 12.92 * v : 1.055 * Math.Pow(v, 1 / 2.4d) - 0.055;
return V;
}

public double InverseCompanding(double channel)
{
double V = channel;
double v = V <= 0.04045 ? V / 12.92 : Math.Pow((V + 0.055) / 1.055, 2.4);
return v;
}

注:v 是线性的,V 是非线性的。

这些函数基于此处找到的等式:
http://www.brucelindbloom.com/index.html?Eqn_RGB_to_XYZ.html

还可以选择使用带有压缩扩展函数 v = V ^ gamma 的简化 sRGB,其中 gamma 为 2.2,如网站上所述。

关于image-processing - 从rec的正确转换。 709转sRGB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17536417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com