【问题标题】:Fastest approximative methods to convert YUV to RGBA?将 YUV 转换为 RGBA 的最快近似方法?
【发布时间】:2011-07-24 02:28:49
【问题描述】:

我正在寻找一种将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)有luma2,Cr1红差色度,Cb1蓝差色度
  4. 图像像素(0,3)有luma3,Cr1红差色度,Cb1蓝差色度

RGBA 数组应该是:

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

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

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

【问题讨论】:

  • 您需要多精确?请注意,您可以改为以定点方式进行所有计算,而准确度不会明显下降。
  • @Oli:可能不准确。
  • @psihodelia:不准确可能意味着很多事情。我可以做 R=G=B=0.5,这和你可能得到的一样快,但非常不准确。答案还取决于您使用的平台等因素。例如,您可以通过移位和加法来近似矩阵系数,但这可能比在许多平台上的乘法要慢。
  • @Oli:我需要一些关于像素颜色的信息,但不要太多。 RGB 的每个颜色分量可能 3-4 位就足够了。矩阵 muls 或 shift-adds 很慢。我正在寻找一种智能的近似方法,我相信应该存在。
  • 这是尝试优化算法可能不会让您走得很远的那些(罕见)地方之一,但实现的“微”优化可能会。特别是,您真的希望实现它以在 GPU 而不是 CPU 上运行。这正是 GPU 的设计问题。即使是最微不足道的实现也会大大击败 CPU。

标签: c algorithm video image-processing


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2015-05-24
    • 2019-06-23
    • 2012-03-10
    相关资源
    最近更新 更多