前言
在阅读ImageShop的 https://www.cnblogs.com/Imageshop/p/4441972.html 这篇文章后,逐渐对图像处理中的滤波算法的加速理解得更加深刻一些了,如何做出与半径无关的滤波算法似乎成为了众多优化算法的目标,ImageShop开源了他部分利用直方图技巧加速的滤波算法处理框架,我通过研究原理和他的代码使得这个框架可以应用到自己的代码中,接下来以最大值滤波为例子来分享一下这个框架的原理以及加速手段。
传统的最大值滤波
Mat MaxFilter(Mat src, int radius) {
int row = src.rows;
int col = src.cols;
int border = (radius - 1) / 2;
Mat dst(row, col, CV_8UC3);
for (int i = border; i + border < row; i++) {
for (int j = border; j + border < col; j++) {
for (int k = 0; k < 3; k++) {
int val = src.at<Vec3b>(i, j)[k];
for (int x = -border; x <= border; x++) {
for (int y = -border; y <= border; y++) {
val = max(val, (int)src.at<Vec3b>(i + x, j + y)[k]);
}
}
dst.at<Vec3b>(i, j)[k] = val;
}
}
}
return dst;
}
可以看出直接使用C语言实现,复杂度是 O ( H i g h t ∗ W i d t h ∗ C h a n n e l ∗ ( 2 ∗ R + 1 ) ∗ ( 2 ∗ R + 1 ) ) O(Hight*Width*Channel*(2*R+1)*(2*R+1)) O(Hight∗Width