我正在尝试制作高斯模糊图像滤镜的移动快速版本。
我读过其他问题,例如:Fast Gaussian blur on unsigned char image-ARM Neon Intrinsics-iOS Dev
出于我的目的,我只需要一个固定大小(7x7)固定西格玛(2)高斯滤波器。
因此,在针对 ARM NEON 进行优化之前,我正在 C++ 中实现一维高斯内核,并直接在移动环境(带有 NDK 的 Android)中将性能与 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;
}