有人能告诉我快速功能,使用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内在函数可用于在一个周期内进行多次操作。也许这是要走的路?
问题在于我不是很熟悉,目前没有足够的时间学习汇编语言。因此,如果有人能够针对上述问题发布Neon内在函数代码或者在C / C ++中发布任何其他快速实现,那就太棒了。
答案 0 :(得分:5)
在使用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/
答案 1 :(得分:4)
vImageConvolve_Planar8
。