第三节--一种改进的中值滤波策略的实现



//----------------------------------------【一种改进的中值滤波策略的实现】------------------------------------
//1--传统的中值滤波器的缺点:中值滤波的效果依赖于--滤波窗口的大小,太大会使边沿模糊,太小了,则去噪效果不佳。因为
//-------噪声点和边缘点同样是灰度变化较为剧烈的像素,普通的中值滤波在改变噪声点灰度值时,会一定程度的改变边缘像素的
//-------灰度值。但是,噪声点几乎都是邻域像素的极值,而边缘往往不是,因此可以利用这个特性,来限制中值滤波。
//2--具体的改进方法如下:逐行扫描,当处理每一个像素时,判断该像素是否是滤波窗口覆盖下邻域像素的极大值和极小值。如果是
//-------则采用正常的中值滤波处理该像素;如果不是,则不处理。
//3--自适应中值滤波的效果:在实践中,这种方法,能够非常有效的除去突发的噪声点,尤其是辣椒盐噪声,并且几乎不影响边缘
//4--自适应中值滤波的由来--由于算法可以根据邻域的具体情况而自行选择执行不同的操作,因此改进的中指滤波也称为自适应中
//-------值滤波
//-----------------------------------------------------------------------------------------------------------
/**********************************************************************************************************************
*函数原型:void CImgProcess::AdaptiveMedianFilter(CImgProcess* pTo,int nFilterH,int nFilterW,int nFilterMY,int nFilterMX)
*功能:改进的中指滤波算法---自适应中值滤波
*函数参数:1--CImgProcess* pTo--源图像的指针
*        2--int nFilterH-------滤波器的高度
*        3--int nFilterW-------滤波器的宽度
*        4--int nFilterMY------滤波器的中心元素Y的坐标
*        5--int nFilterMX------滤波器的中心元素X的坐标
*函数的返回值:
*        无
***********************************************************************************************************************/
void CImgProcess::AdaptiveMedianFilter(CImgProcess* pTo,int nFilterH,int nFilterW,int nFilterMY,int nFilterMX)
{
 //[1]初始化目标图像
 pTo->InitPixels(0);
 //[2]循环变量的定义
 int i,j,k,l;
 int nGray;
 //[3]得到元素图片的长,宽,单位--像素(Pixel)
 int nHeight=GetHeight();
 int nWidth=GetWidthPixel();
 //[4]邻域图像数组
 int* pAryGray;
 pAryGray=new int[nFilterH*nFilterW];
 //[3]逐行扫描图像,进行中值滤波,行,除去边缘几行
 for(i=nFilterMY;i<nHeight-nFilterH+nFilterMY+1;i++)
 {
  //[4]列--除去边缘几行
  for(j=nFilterMX;j<nWidth-nFilterW+nFilterMX+1;j++)
  {
   //[5]读取滤波器数组
   for(k=0;k<nFilterH;k++)
   {
    for(l=0;l<nFilterW;i++)
    {
     //[6]原图像第i+k-nFilterMY行,第j+1-nFilterMX列的像素值
     nGray=GetGray(j+1-nFilterMX,i+k-nFilterMY);
     //[7]保存像素值
     pAryGray[k*nFilterW+1]=nGray;
    }//l
   }//k
   //[8]通过排序获取中指
         nGray=GetMedianValue(pAryGray,nFilterH*nFilterW);
   //[9]判断当前像素是否是邻域的极大值或极小值
   if(GetGray(j,i)==pAryGray[0]||GetGray(j,i)==pAryGray[nFilterH*nFilterW-1])
   {
    //[10]如果是极值,以中值作为相应
    pTo->SetPixel(j,i,RGB(nGray,nGray,nGray));
   }
   else
   {
    //[11]不是极值,则不改变原图像的值
    pTo->SetPixel(j,i,GetGray(j,i));
   }
  }//j
 }//i
 delete[] pAryGray;

}      

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值