算法:
(自适应中值滤波)
Layer A:
A1=zmed-zmin
A2=zmax-zmed
If A1>0 and A2>0, goto Layer B
Else enlarge Sxy, goto Layer A (if Sxy exceeds the boundary, out zxy)
Layer B:
B1=zxy-zmin
B2=zxy-zmax
If B1>0 and B2<0 输出zxy,否则,输出zmed
代码mfc+opencv实现:
int MAX=8; //设定最大的滤波半径为8
int W[400]; //定义一个数组,用于存放临时灰度值
int r;
int k;
int Temp;
for(int i=0;i<400;++i)
W[i]=0;
for(int i=0;i<(image->width);++i)
{
for(int j=0;(j<image->height);++j)
{
r=1;//设置初始滤波半径为1
while(r<MAX)
{
k=0;
for(int m=i-r;m<=i+r;++m)
{
for(int n=j-r;n<j+r;++n)
{
if(m>=0&&m<(image->width)&&n>=0&&n<(image->height))
{
W[k]=cvGet2D(image, n, m).val[0];
k++;
}
}
}
//对获得的点的灰度值进行由小到大的排序
for(int u=0;u<k;++u)
{
for(int v=u+1;v<k;++v)
{
if(W[v]<W[u])
{
Temp=W[u];
W[u]=W[v];
W[v]=Temp;
}
}
}
if(W[0]<W[(k-1)/2]&&W[(k-1)/2]<W[k-1])//发现椒盐噪声点,跳出
break;
else
r++;
r++;
}
//替换掉椒盐噪声点
if(W[0]>=cvGet2D(image, j, i).val[0]||cvGet2D(image, j, i).val[0]>=W[k-1])
{
CvScalar pixel;
pixel.val[0]=W[(k-1)/2];
cvSet2D(image,j,i,pixel);
}
}
}