Я пытаюсь сделать мобильную быструю версию фильтра изображений Gaussian Blur.
Я читал другие вопросы, например: Быстрое размытие по Гауссу на беззнаковом символьном изображении - ARM Neon Intrinsics - iOS Dev
Для моей цели мне нужен только фильтр Гаусса с фиксированной сигмой (2) фиксированного размера (7x7).
Итак, перед оптимизацией для ARM NEON я реализую 1D Gaussian Kernel на C ++ и сравниваю производительность с методом OpenCV GaussianBlur () непосредственно в мобильной среде (Android с NDK). Таким образом, будет намного проще оптимизировать код.
Однако в результате моя реализация в 10 раз медленнее, чем версия OpenCV4Android. Я читал, что OpenCV4 Tegra оптимизировал реализацию GaussianBlur, но я не думаю, что в стандартном OpenCV4Android есть такая оптимизация, так почему же мой код такой медленный?
Вот моя реализация (примечание: рефлекс101 используется для отражения пикселей при применении фильтра около границ):
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;
}