|
5.4.4 中值滤波(2)
4.函数调用
在视图类CDemoView中映射“中值平滑”事件的处理函数OnMiddleSmooth()。以下是CDemoView::OnMiddleSmooth()函数的代码实现。
|
void CDemoView::OnMiddleSmooth() { CMedianDialog *dlg=new CMedianDialog(); dlg->DoModal(); int modal; switch(dlg->m_nIndex) { case 0: modal=3;break; case 1: modal=5;break; case 2: modal=7;break; default: break; } CDemoDoc *pDoc=GetDocument(); ImgCenterDib *pDib=pDoc->GetPDib();
if(pDib->m_nBitCount!=8&{ ::MessageBox(0,"只处理灰度图像",MB_OK,0); return ; }
CImgEnhance imgnoise(pDib->GetDimensions(),pDib->m_nBitCount, pDib->m_lpColorTable, pDib->m_pImgData); int iFilterH=modal; int iFilterW=modal; int iFilterCX=(modal-1)/2; int iFilterCY=(modal-1)/2; imgnoise.MedianFilter(iFilterH, iFilterW, iFilterCX, iFilterCY);
CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd); pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
CDemoView* pView=(CDemoView*)pFrame->MDIGetActive()->GetActiveView(); CDemoDoc* pDocNew=pView->GetDocument(); ImgCenterDib *dibNew=pDocNew->GetPDib();
dibNew->ReplaceDib(imgnoise.GetDimensions(),imgnoise.m_nBitCountOut,imgnoise.m_lpColorTable, imgnoise.m_pImgDataOut); pDocNew->SetModifiedFlag(TRUE); pDocNew->UpdateAllViews(pView);
Invalidate(); } |
5.实验结果与分析
如图5-7(a)所示为含有椒盐噪声的图像,图5-7(b)所示为利用中值滤波方法处理后的图像。从处理结果可以看出,此方法能够非常好地将椒盐噪声去除掉,可见中值滤波方法对于椒盐噪声或脉冲式干扰具有很强的滤除作用。因为这些干扰值与其邻近像素的灰度值有很大的差异,经过排序后取中值的结果就将此干扰强制变成与其邻近的某些像素值一样,从而达到去除干扰的效果。但是由于中值滤波方法在处理过程中会带来图像模糊,所以对于细节丰富,特别是点、线和尖顶细节较多的图像不适用。
|
| 图5-7 中值滤波的平滑结果 |
【责任编辑: 夏书 TEL:(010)68476606】
|