【问题标题】:yuv to rgb conversion columns not alignedyuv 到 rgb 转换列未对齐
【发布时间】:2014-04-01 15:42:21
【问题描述】:

我正在将 YUV422 帧转换为 PPM 文件 - (RGB888)。

图像大部分都在转换。颜色很好。但似乎每一行都是歪斜的,好像多余的

这里是帧转换函数:

BYTE* CYUV::toRGB()
{
    BYTE*   rgb = new BYTE[m_width*m_height*3];
    BYTE*   rgb_ret = rgb;
    BYTE*   p_yuv = m_yuv_frame;

    for (int i=m_width*m_height/2; i--;)
    {
        BYTE    y, u, v, y2;
        BYTE    r,g, b;

        y2 = *p_yuv++;
        v = *p_yuv++;
        y = *p_yuv++;
        u = *p_yuv++;

        r = (y + 1.370705 * (v - 128));
        g = (y - (0.698001 * (v - 128)) - (0.337633 * (u - 128)));
        b = (y + (1.732446 * (u - 128)));
        *rgb++ = b < 0 ? 0 : b > 255 ? 255 : b;
        *rgb++ = g < 0 ? 0 : g > 255 ? 255 : g;
        *rgb++ = r < 0 ? 0 : r > 255 ? 255 : r;


        r = (y2 + 1.370705 * (v - 128));
        g = (y2 - (0.698001 * (v - 128)) - (0.337633 * (u - 128)));
        b = (y2 + (1.732446 * (u - 128)));
        *rgb++ = b < 0 ? 0 : b > 255 ? 255 : b;
        *rgb++ = g < 0 ? 0 : g > 255 ? 255 : g;
        *rgb++ = r < 0 ? 0 : r > 255 ? 255 : r;


    }
    return rgb_ret;
}

我相信实际的 yuv 到 rgb 像素转换是正确的,因为我尝试了许多其他公式,结果颜色失真。

对于 PPM 文件,这也很好,因为所有图像阅读器都会处理它。

至于原始的 YUV4222 帧,它很好 - 我使用 SDL 显示它而没有这种失真。

有什么建议吗?

TIA

【问题讨论】:

    标签: rgb pixels yuv distortion ppm


    【解决方案1】:

    好的:解决了这个问题。

    这很简单:在y2 之前写出y 转换后的像素。

    那里有很多解决方案,但似乎很少有完全正确的。

    仅供参考:这确实有效,但仅适用于 yuv 4:2:2 格式。这似乎是最常见的一种,带有YUYV 的fourcc 标签。 yuv 4:2:0 的转换要复杂得多。 yuv 4:4:4 应该与这个解决方案相同,只获取 1 个y 组件,并且只写出一个 rgb 三元组。 (无法验证,但我是这个解决方案的评论。

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-01-25
      • 2021-05-28
      • 2012-11-25
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 2014-09-18
      相关资源
      最近更新 更多