Image processing 无符号字符图像上的快速高斯模糊-ARM Neon Intrinsics-iOS开发
有人能告诉我一个快速的函数,用一个5x5的遮罩找到图像的高斯模糊。我需要它的iOS应用程序开发。我的工作直接在内存中的图像定义为Image processing 无符号字符图像上的快速高斯模糊-ARM Neon Intrinsics-iOS开发,image-processing,ios5,arm,gaussian,neon,Image Processing,Ios5,Arm,Gaussian,Neon,有人能告诉我一个快速的函数,用一个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;
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;
}
}
unsigned char*image\u sqr\u Baseaaddr=(unsigned char*)malloc(noOfPixels);
对于(行=2;行 对于(rowOffset=-2;rowOffset在使用NEON进行SIMD优化之前,您应该首先改进标量实现。目前代码的最大问题是,它的实现方式好像是一个不可分离的过滤器,而高斯核是可分离的。通过切换到可分离的实现方式,可以减少数量从N^2到2N的运算量,在5x5内核的情况下,这将是从25个乘法相加减少到10个,也就是说,只需很少的努力,就可以将速度提高2.5倍
可能充分优化的标量实现可以满足您的需求,而无需借助SIMD。如果不需要,则您至少可以将这些标量优化带到矢量化实现中
在使用NEON进行SIMD优化之前,您应该首先改进标量实现。目前代码的最大问题是,它的实现方式好像它是一个不可分离的过滤器,而高斯核是可分离的。通过切换到可分离的实现方式,您可以减少操作的数量orm N^2到2N,在5x5内核的情况下,这将是从25乘加减少到10,也就是说,只需很少的努力就可以将速度提高2.5倍
可能充分优化的标量实现可以满足您的需求,而无需借助SIMD。如果不需要,则您至少可以将这些标量优化带到矢量化实现中
分离内核,如paulr所述
不要重新发明轮子。使用vImage,它是Accelerate框架的一部分,并为您实现向量化的多线程卷积。具体来说,似乎您需要函数vImageConvolve\u Planar8
分离内核,如paulr所述
不要重新发明轮子。使用vImage,它是Accelerate框架的一部分,并为您实现向量化的多线程卷积。具体来说,似乎您需要函数vImageConvolve\u Planar8
那么,我如何将我的5x5 2D掩码转换为两个1D掩码呢?我在上面添加了一些有用的链接,那么我如何将我的5x5 2D掩码转换为两个1D掩码呢?我在vImage+1上面添加了一些有用的链接,如果这只需要是一个iOS(可能是OS X)解决方案,那么vImage+1就是一个iOS(可能是OS X)解决方案