无符号字符图像上的快速高斯模糊 - ARM Neon Intrinsics - iOS Dev
Posted
技术标签:
【中文标题】无符号字符图像上的快速高斯模糊 - ARM Neon Intrinsics - iOS Dev【英文标题】:Fast Gaussian blur on unsigned char image- ARM Neon Intrinsics- iOS Dev 【发布时间】:2012-02-06 10:36:58 【问题描述】:谁能告诉我使用 5x5 蒙版查找图像的高斯模糊的快速函数。我需要它用于 ios 应用程序开发。我正在直接处理定义为的图像的内存
unsigned char *image_sqr_Baseaaddr = (unsigned char *) malloc(noOfPixels);
for (row = 2; row < H-2; row++)
for (col = 2; col < W-2; col++)
newPixel = 0;
for (rowOffset=-2; rowOffset<=2; rowOffset++)
for (colOffset=-2; colOffset<=2; colOffset++)
rowTotal = row + rowOffset;
colTotal = col + colOffset;
iOffset = (unsigned long)(rowTotal*W + colTotal);
newPixel += (*(imgData + iOffset)) * gaussianMask[2 + rowOffset][2 + colOffset];
i = (unsigned long)(row*W + col);
*(imgData + i) = newPixel / 159;
这显然是可能的最慢的功能。我听说 iOS 上的 ARM Neon 内部函数可用于在 1 个周期内进行多个操作。也许这就是要走的路?
问题是我不是很熟悉,目前没有足够的时间学习汇编语言。因此,如果有人可以针对上述问题发布 Neon 内部代码或任何其他 C/C++ 中的快速实现,那就太好了。
【问题讨论】:
【参考方案1】:在使用 NEON 进行 SIMD 优化之前,您应该首先改进您的标量实现。就目前而言,您的代码的最大问题是它被实现为好像它是一个不可分离的滤波器,而高斯内核是可分离的。通过切换到可分离的实现,您可以将操作数从 N^2 减少到 2N,在您的 5x5 内核的情况下,这将是从 25 次乘加减少到 10 次,即只需很少的努力即可将速度提高 2.5 倍。
充分优化的标量实现可能会满足您的需求,而无需求助于 SIMD。如果没有,那么您至少可以将这些标量优化转移到矢量化实现中。
http://en.wikipedia.org/wiki/Gaussian_blur
http://blogs.mathworks.com/steve/2006/11/28/separable-convolution-part-2/
【讨论】:
那么如何将我的 5x5 2D 蒙版转换为两个 1D 蒙版?? 我在上面添加了一些有用的链接【参考方案2】:-
如 Paul R 所述,分离您的内核。
不要重新发明***。使用 vImage,它是 Accelerate 框架的一部分,并为您实现矢量化的多线程卷积。具体来说,您似乎想要函数
vImageConvolve_Planar8
。
【讨论】:
+1 for vImage 如果这只是一个 iOS(可能还有 OS X)解决方案以上是关于无符号字符图像上的快速高斯模糊 - ARM Neon Intrinsics - iOS Dev的主要内容,如果未能解决你的问题,请参考以下文章