image-processing - 这个 YUV420P 到 RGB 着色器的转换从何而来?

标签 image-processing opengl matrix video glsl

我试图理解 OpenGL 片段着色器上 YUV420P 到 RGB 转换的这些计算。上https://en.wikipedia.org/wiki/YUV有很多计算,但没有一个像下面的那样。为什么在第一部分中采用 0.06250.50.5 ?第二部分从哪里来?

yuv.r = texture(tex_y, TexCoord).r - 0.0625;
yuv.g = texture(tex_u, TexCoord).r - 0.5;
yuv.b = texture(tex_v, TexCoord).r - 0.5;

rgba.r = yuv.r + 1.596 * yuv.b
rgba.g = yuv.r - 0.813 * yuv.b - 0.391 * yuv.g;
rgba.b = yuv.r + 2.018 * yuv.g;

这可能是针对某些特定 YUV 配色方案的特殊颜色转换,但我在互联网上找不到任何内容。

最佳答案

为什么在第一部分中采用 [...] 0.5 和 0.5?

UV 存储在纹理的绿色和蓝色 channel 中。颜色 channel 中的值存储在 [0.0, 1.0] 范围内。对于计算,值必须映射到范围 [-0.5, 0.5]:

yuv.g = texture(tex_u, TexCoord).r - 0.5;
yuv.b = texture(tex_v, TexCoord).r - 0.5;

从红色 channel 中减去0.0625只是一种优化。因此,以后不必在每个表达式中单独减去它。

该算法与 How to convert RGB -> YUV -> RGB (both ways) 中的算法相同或各种书籍。

关于image-processing - 这个 YUV420P 到 RGB 着色器的转换从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62846954/

相关文章:

python - 如何分别旋转多个四边形? (Pygame、PyOpengl)

opengl - OpenGL中的对象、世界、相机和投影空间

algorithm - IA 阵列的稀疏矩阵 CRS 逻辑

c++ - matlab中的对象生成

java - 颜色偏移图像以匹配调色板

c++ - 旋转播放器模型以指向一个点

Scala 矩阵库计算大斐波那契数

Matlab忽略矩阵中的NaN

machine-learning - 局部二元模式直方图的特征?

java - 遍历图像的每个像素