2012-02-06 28 views
1

有人可以告訴我一個快速函數,使用5x5掩模來查找圖像的高斯模糊。我需要它的iOS應用程序開發。我直接在圖像的內存上定義爲無符號char字符上的快速高斯模糊image-ARM霓虹Intrinsics- iOS Dev

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 intrinsics代碼或者C/C++中的其他快速實現,那將是非常棒的。

回答

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/

+0

那麼如何將我的5x5 2D面具轉換成兩個1D面具​​? – shreyas253 2012-02-06 15:51:39

+0

如果只需要iOS(也可能是OS X)解決方案,我已經在vImage上爲 – 2012-02-06 16:11:18

4
  1. 獨立的內核,由Paul R.描述
  2. 不要重新發明輪子。使用vImage是Accelerate框架的一部分,併爲您實現矢量化的多線程卷積。具體來說,它好像你想要的功能vImageConvolve_Planar8
+0

+1添加了一些有用鏈接 – 2012-02-06 21:45:49