无符号字符图像上的快速高斯模糊 - 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的主要内容,如果未能解决你的问题,请参考以下文章

MKMapKit 上的高斯模糊

OpenGL es 2.0 三角形上的高斯模糊

边缘处的高斯模糊截止

将负双精度转换为无符号整数的行为是不是在 C 标准中定义? ARM 与 x86 上的不同行为

详析数字图像中高斯模糊理论及实现

jQuery 动画高斯模糊