(转自:http://blog.csdn.net/vincentzhao2009/article/details/4565601)
这篇文章用到的中值滤波的算法如下:
首先确定一个windowSize*windowSize大小的窗口,这里的windowSize是一个奇数,因此这个窗口一定会有一个中心的像素,中值滤波的过程就是不断的移动这个窗口,然后对窗口内的所有像素的像素值按照灰度级来排序,最后把排序后中间那个像素的灰度级赋值给窗口中心那个像素。这个就是中值滤波的意义。
举个例子,例如是3*3的窗口(数字表示灰度级):
122 34 100
20 18 201
128 79 25
排序后,就成了18,20,25,34,79,100,122,128,201,可以看到79就是中间那个数,因此这个3*3的窗口就变成了如下:
122 34 100
20 79 201
128 79 25
这个就是中值滤波的基本思想。
说了这么多,贴代码吧:
windowSize = 3;
//windowSize是指窗口的长度。
v = (char *)calloc(windowSize*windowSize,sizeof(char));
//v存储的是窗口内所有像素的灰度级。
for(i=(windowSize-1)/2;i<height-(windowSize-1)/2;i++){
for(j=(windowSize-1)/2;j<width-(windowSize-1)/2;j++){
//这个嵌套的for循环是为了让窗口在整个如想nei进行移动,i和j就是这个窗口的中心像素在整幅图像中坐标位置
k=0;
for(l=0;l<windowSize;l++){
for(m=0;m<windowSize;m++){
v[k]=h[i-(windowSize-1)/2+l][j-(windowSize-1)/2+m];
k++;
}
}
//这个嵌套的for循环式获取这个窗口内的所有像素的灰度级,存储在v中
BubbleSort(v,windowSize*windowSize);
//对v内的元素进行排序
h[i][j]=v[windowSize*windowSize/2];
//把排序后中间的那个数赋值给窗口的中心像素。
}
}
效果图(因为图像很小,所以窗口大小我设置成了3):
处理之后的图像:
在over前需要说的是这篇文章讲的中值滤波仅仅是最基础的思想,在进行滤波的时候可以加一些判断,来决定是否赋值,怎样赋值,等等。就说这么多吧。over。