1

有人可以告诉我使用 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++ 中的任何其他快速实现,那就太好了。

4

2 回答 2

6

在使用 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/

于 2012-02-06T11:00:39.037 回答
4
  1. 如 Paul R 所述,分离你的内核。
  2. 不要重新发明轮子。使用 vImage,它是 Accelerate 框架的一部分,它为您实现了一个矢量化的多线程卷积。具体来说,您似乎想要该功能vImageConvolve_Planar8
于 2012-02-06T18:18:04.010 回答