GPUImage:YUV或RGBA对性能的影响?

Vin*_*zzz 2 image-processing ios gpuimage

我正在进行一些静态图像处理,而GPUImage是一个非常棒的框架(谢谢Brad Larson!).

我明白那个 :

  • 一些过滤器只能用1个组件完成.在这种情况下,图像应为YUV(YCbCr),并且我们仅使用Y(亮度=图像灰度级).
  • 其他过滤器需要来自3个组件的所有颜色信息--R,G和B.
  • YUV - > RGB转换设置(在GPUVideoCamera),RGB - > YUV可以硬编码到片段着色器(例如:GPUImageChromaKeyFilter)

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

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

谢谢!

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

Bra*_*son 6

在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 ms降至每帧1.5 ms.

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

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

再一次,我只是开始修补这个.