2

我正在做一些静态图像处理,GPUImage 是一个非常棒的框架(感谢 Brad Larson!)。

我明白那个 :

  • 某些过滤器只需 1 个组件即可完成。在这种情况下,图像应该是 YUV(YCbCr),我们只使用 Y(luma = 图像灰度级)。
  • 其他滤镜需要来自 3 个组件(R、G 和 B)的所有颜色信息。
  • 提供 YUV -> RGB 转换(在 中GPUVideoCamera),RGB -> YUV 可以硬编码到片段着色器中(例如GPUImageChromaKeyFilter:)

我有很多图像处理步骤,有些可以基于 YUV,有些可以基于 RGB。基本上,我想混合 RGB 和 YUV 滤镜,所以我的一般问题是:

这种连续转换的成本/信息损失是多少,您会推荐任何设计吗?

谢谢!

(PS:iPhone4 YUV->RGB 转换和AVCaptureStillImageOutput像素格式有什么问题?)

4

1 回答 1

7

在 GPUImage 中使用 YUV 是一个相当新的补充,我仍在尝试。我想引入 YUV 来尝试提高过滤器性能,减少内存使用,并可能提高色彩保真度。到目前为止,我的修改只实现了这三个之一。

如您所见,我从相机中提取 YUV 帧,然后决定在过滤器管道的后续阶段如何处理它们。如果相机输入目标的所有过滤器都只需要单色输入,则相机输入将仅在管道上发送未处理的 Y 通道纹理。如果任何滤镜需要 RGB 输入,相机输入将执行从 YUV->RGB 的基于着色器的转换。

对于采用单色的滤镜,这可以通过消除 RGB 转换阶段(由 AV Foundation 在请求 BGRA 数据时或在我的转换着色器中完成)以及将 RGB 冗余转换回亮度。在 iPhone 4 上,在 720p 帧上运行的 Sobel 边缘检测滤波器的性能从 RGB 输入的每帧 36.0 ms 到使用直接 Y 通道的 15.1 ms。这也避免了由于从将 YUV 转换为 RGB 并返回到亮度的舍入而导致的轻微信息丢失。8 位颜色通道只有这么多的动态范围。

即使在使用 RGB 输入时,这种转换从 AV Foundation 转移到我的着色器中也会带来性能上的提升。在 iPhone 4S 上,使用我的转换着色器而不是 AV Foundation 的内置 BGRA 输出,针对 1080p 输入运行饱和过滤器从每帧 2.2 毫秒下降到每帧 1.5 毫秒。

两种 RGB 方法的内存消耗几乎相同,因此我正在尝试一种改进方法。对于单色输入,由于输入的纹理尺寸较小,内存使用量显着下降。

实现全 YUV 管道更具挑战性,因为您需要为 Y 和 UV 平面维护并行渲染路径和着色器,并为两者提供单独的输入和输出纹理。从 RGB 中提取平面 YUV 很棘手,因为您需要以某种方式从一个输入中提取两个输出,而 OpenGL ES 本身并不支持这些输出。您需要进行两次渲染通道,这是相当浪费的。交错的 YUV444 作为多级管道的颜色格式可能更实用,但我还没有玩过这个。

再说一次,我才刚刚开始修补这个。

于 2013-02-23T00:12:30.283 回答