将YUV转换为RGBA的最快近似方法?

时间:2011-03-27 22:38:52

标签: c algorithm video image-processing

我正在寻找一种将YUV数组转换为RGBA数组的最快方法。例如,给定一个YCbYCr数组,它是一个字节序列:

YCbYCr = Luma0, Cb0, Luma1, Cr0, Luma2, ...

其中8位蓝色和8位红色差分色度分量采用周期2进行采样,但8位亮度采用周期1进行采样。例如:

  1. 图像像素(0,0)具有luma0,Cr0红差色度,Cb0蓝差色度
  2. 图像像素(0,1)具有luma1,Cr0红差色度,Cb0蓝差色度
  3. 图像像素(0,2)具有亮度2,Cr1红色差色度,Cb1蓝色差色度
  4. 图像像素(0,3)具有亮度3,Cr1红色差色度,Cb1蓝色差色度
  5. 应该生成RGBA数组:

    RGBA = R0, G0, B0, A0, R1, G1, ...
    

    其中所有元素都是无符号字符,每个A#的所有位都为零。

    YCbYCr中的Luma分量为0..255无符号字符,Cb和Cr为-127 .. + 126个有符号字符。有一种标准的方法---矩阵乘法,但它对于实时应用来说非常慢,并且它使用浮点数运算。我正在寻找一种快速近似数值方法。

1 个答案:

答案 0 :(得分:3)

您可能获得的最大单一计算节省仅仅是通过定点计算而不是浮点计算。它可能会快一个数量级(猜测)。

您还可以利用二次采样色度贡献中的冗余。鉴于完整矩阵乘法的形式如下:

R     a b c   Y
G  =  d e f . Cb
B     g h i   Cr

您可以经常计算色度偏半和:

R'    b c   
G' =  e f . Cb
B'    h i   Cr

然后简单地以全输出率将其添加到亮度贡献中:

R     R'     a
G  =  G'  +  d . Y
B     B'     g