均值滤波的快速解法

均值滤波的快速解法

均值滤波是一种非常常见的滤波方法,本身算法难度并不大,但是想当然的算法复杂度都是width*height*size的复杂度。下面我试着写了下一个height*width复杂度算法,当然算法并不是我原创,只不过我写了出来而已。

这个快速算法的精髓是采用一个数组代替滑动窗口。

下面以5*5的图像进行3*3的均值滤波为例。(height=width=5;size=3)

首先创建一个列和数组cur_rowSum,初始化为前size(3)行像素的列和。

0

5

7

9

0

(1)       列和数组为1*width

0

0

0

0

0

0

1

2

3

0

0

4

5

6

0

0

7

8

9

0

0

0

0

0

0

(2)       原始图像,周围pad为0

下面进行第一行的计算:

计算第一个像素的值,P=cur_rowSum[0..size-1],之后下一个像素的值刚好为p-最左一列的列和值加上最右一列的列和值。

 

0

5

7

9

0

 

0

0

0

0

0

0

12

2

3

0

0

4

5

6

0

0

7

8

9

0

0

0

0

0

0

由于在计算下一行的像素值时,也需要cur_rowSum。因此在第一行计算列和的时候同时计算下一个”cur_rowSum”,为了确保不影响本行的计算,因此采用另外一个数组存储。

计算时的方式为一个列和减去所在列的第一个像素,加上所在列的下一行像素。

0

12

7

9

0

 

0

0

0

0

0

0

1

2

3

0

0

4

5

6

0

0

7

8

9

0

0

0

0

0

0

如图,12=5-0+7;

如此进行循环进行,直到计算完毕,期间注意不要数组越界。

下面是代码。

#include
#include
using namespace std;
void avg_filter(int *src_pad,int height,int width,int size=3){
	int *src_pad1=src_pad;
	int *temp_src=src_pad1;
	vector cur_sumRow(width,0);
	//初始化cur_sumRow为前size行元素的和,也就列和。
	for(int i=0;i temp_sumRow(width,0);
	for(int i=size/2;i=size/2&&j


你可能感兴趣的:(图像处理)