我正在試圖製作高斯模糊圖像濾波器的移動快速版本。ARM NEON的快速高斯模糊圖像濾波器
我讀過其他的問題,比如:Fast Gaussian blur on unsigned char image- ARM Neon Intrinsics- iOS Dev
對於我的目的,我只有一個固定大小(7×7)固定西格馬(2)高斯濾波器需要。因此,在針對ARM NEON進行優化之前,我正在C++中實現一維高斯內核,並直接在移動環境(Android with NDK)中將性能與OpenCV gaussianBlur()方法進行比較。這樣就會導致更簡單的代碼進行優化。
但是結果是我的實現比OpenCV4Android版本慢了10倍。我讀過OpenCV4 Tegra已經優化了GaussianBlur的實現,但我不認爲標準的OpenCV4Android有這樣的優化,那麼爲什麼我的代碼如此之慢?
這裏是我的執行(注:近邊界應用過濾器時reflect101用於像素反射):
Mat myGaussianBlur(Mat src){
Mat dst(src.rows, src.cols, CV_8UC1);
Mat temp(src.rows, src.cols, CV_8UC1);
float sum, x1, y1;
// coefficients of 1D gaussian kernel with sigma = 2
double coeffs[] = {0.06475879783, 0.1209853623, 0.1760326634, 0.1994711402, 0.1760326634, 0.1209853623, 0.06475879783};
//Normalize coeffs
float coeffs_sum = 0.9230247873f;
for (int i = 0; i < 7; i++){
coeffs[i] /= coeffs_sum;
}
// filter vertically
for(int y = 0; y < src.rows; y++){
for(int x = 0; x < src.cols; x++){
sum = 0.0;
for(int i = -3; i <= 3; i++){
y1 = reflect101(src.rows, y - i);
sum += coeffs[i + 3]*src.at<uchar>(y1, x);
}
temp.at<uchar>(y,x) = sum;
}
}
// filter horizontally
for(int y = 0; y < src.rows; y++){
for(int x = 0; x < src.cols; x++){
sum = 0.0;
for(int i = -3; i <= 3; i++){
x1 = reflect101(src.rows, x - i);
sum += coeffs[i + 3]*temp.at<uchar>(y, x1);
}
dst.at<uchar>(y,x) = sum;
}
}
return dst;
}
編輯:在反射101中可能有一個小錯誤,它們的參數應該是(src.cols,y + i)和(src.rows,x + i)。 –