图|源自网络
文|凡古一往
平滑滤波器
· ·
· 1 什么是滤波
用书本上的话来说,滤波就是接受或拒绝(过滤)一定的频率部分(波)
我个人的理解是:滤波是一个二维函数(映射),它对一个假象的二维平面上的对象进行某种变换,这个变换可以是线性的也可以是非线性的。
(由于目前我还没学过频率域滤波(嘿嘿),所以这里只讨论空间域滤波。)
· ·
· 2 空间滤波机理
滤波最直接的应用就是滤波器,空间滤波器又称掩膜、核、模板和窗口,用一张图来说明比较形象:
如图所示,空间滤波器将目标邻域(一个小矩形)的所有像素值通过模板给出的系数(图中w(0,0)等等权重就可以看成系数)运算后,生成一个新像素(滤波结果)覆盖模板的中间像素的值。
前面说过,可以把这个(滤波器)模板看成一个函数,所以对应不同功能有很多,目前我对几种平滑滤波器和锐化滤波器比较了解,所以这篇先讨论平滑滤波器。
· ·
· 3平滑滤波器
15x15均值滤波器的效果
两种均值滤波器(这俩都是3x3模板,还可以有5x5、15x15等等)
不同尺寸均值滤波器的模糊效果
中值滤波器的降噪效果(对椒盐噪声)
· ·
· 4 核心代码
C语言,VS2010,24位bitmap
1)3x3均值滤波
for(w=1;w<width-1;w++)
for(l=1;l<length-1;l++)
{
int sum1=(int)source[w-1][l-1]+(int)source[w][l-1]+(int)source[w+1][l-1];
int sum2=(int)source[w-1][l] +(int)source[w][l] +(int)source[w+1][l];
int sum3=(int)source[w-1][l+1]+(int)source[w][l+1]+(int)source[w+1][l+1];
int avarage=(sum1+sum2+sum3)/9;
result[w][l]=(char)avarage;
}
2)3x3中值滤波
unsigned char**result= new unsigned char*[width];
for(w=1;w<width-1;w++)
{
for(l=1;l<length-1;l++)
{
int i=0;
int j,k,temp;
int arr[9];
int m,n;
for(m=w-1;m<w+2;m++)
{
for(n=l-1;n<l+2;n++)
{
arr[i]=(int)source[m][n];//把9个滤波器像素值传入排序数组
i++;
}
}
//排序
for(j=0;j<9;j++)
{
for(k=0;k<j;k++)
{
if(arr[j]<arr[k])
{
temp=arr[j];
arr[j]=arr[k];
arr[k]=temp;
}
}
}
result[w][l]=(char)arr[4];//将3x3模板中位数写入二维数组
}
}
作者:凡古一往 95后普通大学生
梦想成为一个真实、多面、有温度的互联网人
我的其他文章👇
“童年向往世界,长大怀念故乡”