自适应中值滤波

算法:

(自适应中值滤波)

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);			
			}
		}
	}



 

你可能感兴趣的:(自适应中值滤波)