【发布时间】:2011-07-24 02:28:49
【问题描述】:
我正在寻找一种将YUV 数组转换为RGBA 数组的最快方法。例如,给定一个 YCbYCr 数组,它是一个字节序列:
YCbYCr = Luma0, Cb0, Luma1, Cr0, Luma2, ...
其中 8 位蓝色和 8 位红色差色度分量以周期 2 进行采样,但 8 位亮度以周期 1 进行采样。例如:
- 图像像素(0,0)有luma0,Cr0红差色度,Cb0蓝差色度
- 图像像素(0,1)有luma1,Cr0红差色度,Cb0蓝差色度
- 图像像素(0,2)有luma2,Cr1红差色度,Cb1蓝差色度
- 图像像素(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