如何在iOS平台上实现快速图像滤镜

2023-11-24

我正在开发 iOS 应用程序,用户可以在其中应用一组特定的照片滤镜。每个滤镜基本上都是一组具有特定参数的 Photoshop 操作。这些行动是:

  • 级别调整
  • 亮度/对比度
  • 色相饱和度
  • 单个和多个叠加

我在代码中使用循环遍历图像中所有像素的算术表达式重复了所有这些操作。但是当我在 iPhone 4 上运行我的应用程序时,每个过滤器需要大约 3-4 秒才能应用,这对于用户来说需要等待相当长的时间。图像尺寸为 640 x 640 px,这是我的视图尺寸的 2 倍,因为它显示在 Retina 显示屏上。我发现我的主要问题是级别修改,每次我需要调整伽玛时都会调用 pow() C 函数。当然,我使用浮点数而不是双精度数,因为 ARMv6 和 ARMv7 使用双精度数很慢。尝试启用和禁用 Thumb 并得到相同的结果。

我的应用程序中最简单的过滤器示例,运行速度相当快(2 秒)。其他过滤器包含更多表达式和 pow() 调用,从而使它们变慢。

https://gist.github.com/1156760

我见过一些使用 Accelerate Framework vDSP 矩阵转换来快速修改图像的解决方案。我也见过 OpenGL ES 解决方案。我不确定他们是否能够满足我的需求。但可能这只是将我的一组更改转换为一些好的卷积矩阵的问题?

任何意见将是有益的。

Thanks,
Andrey.


对于示例代码中的过滤器,您可以使用查找表来使其更快。我假设您的输入图像是每种颜色 8 位,并且您在将其传递给此函数之前将其转换为浮点数。对于每种颜色,这只给出 256 个可能的值,因此只有 256 个可能的输出值。您可以预先计算这些并将它们存储在数组中。这将避免pow()计算和边界检查,因为您可以将它们纳入预计算中。

它看起来像这样:

unsigned char table[256];
for(int i=0; i<256; i++) {
    float tmp = pow((float)i/255.0f, 1.3f) * 255.0; 
    table[i] = tmp > 255 ? 255 : (unsigned char)tmp;
}

for(int i=0; i<length; ++i)
    m_OriginalPixelBuf[i] = table[m_OriginalPixelBuf[i]];

在这种情况下,您只需执行pow()256 次而不是 3*640*640 次。您还可以避免主图像循环中的边界检查引起的分支,这可能会带来高昂的代价。您也不必转换为浮动。

甚至更快的方法可能是在程序外部预先计算表格,然后将 256 个系数放入代码中。

您在那里列出的所有操作都不需要卷积甚至矩阵乘法。它们都是逐像素操作,这意味着每个输出像素仅取决于单个相应的输入像素。您需要考虑对模糊或锐化等操作进行卷积,其中多个输入像素影响单个输出像素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在iOS平台上实现快速图像滤镜 的相关文章

随机推荐