中值滤波是一种非线性的图像平滑方法,与均值滤波器以及其他线性滤波器相比,它能够很好地滤除脉冲噪声,同时又能够保护目标图像边缘。它是一种邻域运算,类似于卷积,但计算的不是加权求和,而是把邻域中的像素按灰度级进行排序,然后选择该组的中间值作为输出像素值,中值滤波可定义为:
式中:g(x,y)和f(x-i,y-i)分别为输出和输入像素灰度值,W为模板窗口。窗W可以取线状、方形、十字形、圆形、菱形等。
中值滤波实现过程如上图所示。标准的中值滤波器都是由一个奇数大小尺寸的滑动窗组成,通常为3x3窗或5x5窗等。以3x3窗为例,该窗沿着图像数据的行方向逐像素滑动,在每一次滑动期间内,方形窗中的所有像素按照灰度值被排序,这组数据中的中值作为输出,替代原来窗函数的中心位置像素的灰度值。
C语言基础实现如下:
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循环是为了让窗口在整个图像内进行移动,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):
处理之后的图像:
参考链接:
http://blog.csdn.net/vincentzhao2009/article/details/4565601