【发布时间】:2013-07-03 09:18:55
【问题描述】:
我正在尝试制作高斯模糊图像滤镜的移动快速版本。
我读过其他问题,例如:Fast Gaussian blur on unsigned char image- ARM Neon Intrinsics- iOS Dev
出于我的目的,我只需要一个固定大小 (7x7) 固定 sigma (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;
}
【问题讨论】:
-
编辑:reflect101 可能有一点错误,他们的参数应该是 (src.cols, y+i) 和 (src.rows, x+i)。
标签: opencv image-processing gaussian neon imagefilter