设为首页 加入收藏

TOP

Visual C++实现数字图像增强处理(三)
2012-11-03 14:46:02 来源: 作者: 【 】 浏览:776
Tags:Visual 实现 数字 图像 增强 处理
  2.图像平滑

  图像平滑主要是为了消除噪声。噪声并不限于人眼所能看的见的失真和变形,有些噪声只有在进行图像处理时才可以发现。图像的常见噪声主要有加性噪声、乘性噪声和量化噪声等。图像中的噪声往往和信号交织在一起,尤其是乘性噪声,如果平滑不当,就会使图像本身的细节如边界轮廓、线条等变的模糊不清,如何既平滑掉噪声有尽量保持图像细节,是图像平滑主要研究的任务。

  一般来说,图像的能量主要集中在其低频部分,噪声所在的频段主要在高频段,同时系统中所要提取的汽车边缘信息也主要集中在其高频部分,因此,如何去掉高频干扰又同时保持边缘信息,是我们研究的内容。为了去除噪声,有必要对图像进行平滑,可以采用低通滤波的方法去除高频干扰。图像平滑包括空域法和频域法两大类,在空域法中,图像平滑的常用方法是采用均值滤波或中值滤波,对于均值滤波,它是用一个有奇数点的滑动窗口在图像上滑动,将窗口中心点对应的图像像素点的灰度值用窗口内的各个点的灰度值的平均值代替,如果滑动窗口规定了在取均值过程中窗口各个像素点所占的权重,也就是各个像素点的系数,这时候就称为加权均值滤波;对于中值滤波,对应的像素点的灰度值用窗口内的中间值代替。实现均值或中值滤波时,为了简便编程(www.cppentry.com)工作,可以定义一个n*n的模板数组。另外,读者需要注意一点,在用窗口扫描图像过程中,对于图像的四个边缘的像素点,可以不处理;也可以用灰度值为"0"的像素点扩展图像的边缘。下面给出了采用加权均值滤波的图像平滑函数代码和效果图:

void CDibView::OnImagePh()
{
 CClientDC pDC(this);
 HDC hDC=pDC.GetSafeHdc();//获取当前设备上下文的句柄;
 SetStretchBltMode(hDC,COLORONCOLOR);
 HANDLE data1handle;
 LPBITMAPINFOHEADER lpBi;
 CDibDoc *pDoc=GetDocument();
 HDIB hdib;
 unsigned char *hData;
 unsigned char *data;
 hdib=pDoc->GetHDIB();
 BeginWaitCursor();
 lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
 hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
 pDoc->SetModifiedFlag(TRUE);
 data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight);
 data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);
 AfxGetApp()->BeginWaitCursor();
 int i,j,s,t,ms=1;
 int sum=0,sumw=0;
 int mask[3][3]={{1,1,1},{1,2,1},{1,1,1}};//定义的3x3加权平滑模板;
 for(i=0; ibiHeight; i++)
 for(j=0; jbiWidth; j++)
 {
  sumw=0; sum=0;
  for(s=(-ms); s<=ms; s++)
  for(t=(-ms); t<=ms; t++)     if(((i+s)>=0)&&((j+t)>=0)&&((i+s)biHeight)&&((j+t)biWidth))
 {
  sumw += mask[1+s][1+t];   
  sum+=*(hData+(i+s)*WIDTHBYTES(lpBi->biWidth*8)+(j+t))*mask[1+s][1+t];
  }
  if(sumw==0) sumw=1;
   sum/=sumw;
  if(sum>255)sum=255;
  if(sum<0)sum=0;
  *(data+i*WIDTHBYTES(lpBi->biWidth*8)+j)=sum;
 }
 for( j=0; jbiHeight; j++)
 for(i=0;ibiWidth;i++)  *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)=*(data+i*WIDTHBYTES(lpBi->biWidth*8)+j);
  StretchDIBits (hDC,0,0,lpBi->biWidth,lpBi->biHeight,0,0,
         lpBi->biWidth,lpBi->biHeight,
         hData,(LPBITMAPINFO)lpBi,
         DIB_RGB_COLORS,
         SRCCOPY);//显示图像;
}


(a)LENA原图

(b)平滑后的效果图

                     图三

  中值或均值平滑有时处理图像的效果并不是很好,它虽然去除了一定的噪声,但同时使图像中的边缘变的模糊,这主要和所选取的窗口大小有关,为此下面介绍了一种既能保持边缘清晰又能消除噪声的方法,其算法如图四所示:


(a)

(b)

(c)

                 图 四 图像平滑模板

  上图的含义是在图像中取5*5的区域,包含点(i,j)的五边形和六边形各四个,3*3的区域一个,计算这九个区域的标准差和灰度的平均值,取标准差最小区域的灰度平均值作为点(i,j)的灰度。由于该算法的实现代码和上述代码大同小异,所以代码部分就不再赘述。

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Visual C++实现视频图像处理技术 下一篇Visual C++6.0开发灰度位图处理

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: