Accelerate 的 vImage 与 vDSP
Posted
技术标签:
【中文标题】Accelerate 的 vImage 与 vDSP【英文标题】:Accelerate's vImage vs. vDSP 【发布时间】:2012-01-24 02:54:56 【问题描述】:我正在尝试使用 ios 上的 Accelerate 框架来绕过 iOS 上的 Core Image 不支持自定义过滤器/内核的事实。我正在开发一个边缘检测过滤器,它使用两个带有Sobel kernel 的卷积,但是从一个简单的高斯模糊开始来掌握它的窍门。我知道 vImage 适合作为矩阵进行图像处理,而 vDSP 专注于使用傅里叶变换处理数字信号。但是虽然我开始使用 vImage 函数(vImageConvolve_XXXX 等),但我听到很多人在讨论使用 vDSP 的函数(vDSP_conv、vDSP_imgfir 等)来做卷积之类的事情。所以这让我想到了手头的问题:我什么时候应该使用一个而不是另一个?它们在卷积操作方面有什么区别?我到处寻找,但找不到明确的答案。有人可以解释一下吗,或者指出我正确的方向?
谢谢!
【问题讨论】:
作为一个仅供参考,我有一个非常快速的 GPU 加速 Sobel 边缘检测过滤器作为我的GPUImage 框架的一部分。它可以在 iPhone 4 上在 2.5 毫秒内处理 640x480 帧的视频,这看起来甚至比基于 Accelerate 的卷积要快得多。 @Brad-Larson 哇!这个看起来很有前途!它几乎就像 iOS 的 OpenCL :) 感谢框架和基准测试。我怀疑 OpenGL 路线会在性能方面产生更好的结果。但是由于内存限制(以及随之而来的图像大小限制)CPU 处理(通过 Accelerate、CoreImage 等)仍然是处理大图像的首选方式,例如。存储在图像库中(因为它们可能大于 2048x2048 像素),即使它更慢。一旦我提高了我的 GLSL 技能,我就会试一试! 基于 A5 的设备(iPhone 4S、iPad 2、Retina iPad)都支持 4096x4096 纹理,但您说得对,我们需要某种平铺实现来处理这些较大的图像。我知道如何做到这一点,但这需要一些工作。 【参考方案1】:如果 vImage 提供了您需要的操作,通常使用它是最简单的。 vImage 会为您缓存阻塞和线程,vDSP 不会。 vImage 提供对交错格式和整数格式的操作,这通常对图像处理很有用。
【讨论】:
谢谢斯蒂芬!在我的测试中,我发现 vImage 的运行速度也比使用 vDSP 的相同算法快一点(关于矩阵变换和卷积)。还有人指出我在另一个论坛上 vImage 在版本 5 之前的 iOS 上不可用!【参考方案2】:上次我进行实验时,这两个框架都没有利用内核可分离性,这在空间域中进行卷积时提供了巨大的性能提升 - 比矢量化指令所能获得的性能提升要大得多你。尤其是 Sobel 内核是可分离的,因此如果您使用 vDSP
或 vImage
(而不是 OpenCV
),请务必自行分离内核。
【讨论】:
如果您认为 vImage 自动检测内核可分离性会很有用,请提交错误报告以请求该功能。 @StephenCanon 很确定我做到了。坦率地说,归档雷达有点令人沮丧,考虑到编写它们需要付出的努力,完全缺乏可见性(我宁愿自己找到副本并 +1),而且每一个总是 作为副本关闭。存在的无意义是浮现在脑海中的短语。我希望不是这样。 即使它们作为副本关闭,也会被阅读,并且反馈非常有用。如果不出意外,这算作对“这个特定问题很重要,请给它更多资源”的额外投票。以上是关于Accelerate 的 vImage 与 vDSP的主要内容,如果未能解决你的问题,请参考以下文章
来自 UIImage 或来自文件的 vImage - Swift 和 Accelerate 框架
如何将 Accelerate Framework 与 Core Graphics 一起使用?
iOS - 将 UIImage 转换为 vImage 内存处理
将 vImage_Scale 与 kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange 一起使用