1. 程式人生 > >第三節--一種改進的中值濾波策略的實現

第三節--一種改進的中值濾波策略的實現



//----------------------------------------【一種改進的中值濾波策略的實現】------------------------------------
//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;

}