1、Visual+C+实现数字图像增强处理前言对于一个图像处理系统来说,可以将流程分为三个阶段,在获取原始图像后,首先是图像预处理阶段、第二是特征抽取阶段、第三是识别分析阶段。图像预处理阶段尤为重要,如果这阶段处理不好,后面的工作根本无法展开。在实际应用中,我们的系统获取的原始图像不是完美的,例如对于系统获取的原始图像,由于噪声、光照等原因,图像的质量不高,所以需要进行预处理,以有利于提取我们感兴趣的信息。图像的预处理包括图像增强、平滑滤波、锐化等内容。图像的预处理既可以在空间域实现,也可以在频域内实现,我们主要介绍在空间域内对图像进行点运算,它是一种既简单又重要的图像处理技术,它能让用户改变图像
2、上像素点的灰度值,这样通过点运算处理将产生一幅新图像。下面我们开始介绍与图像点运算的相关知识。一、图像的直方图图像直方图是图像处理中一种十分重要的图像分析工具,它描述了一幅图像的灰度级内容,任何一幅图像的直方图都包含了丰富的信息,它主要用在图象分割,图像灰度变换等处理过程中。从数学上来说图像直方图是图像各灰度值统计特性与图像灰度值的函数,它统计一幅图像中各个灰度级出现的次数或概率;从图形上来说,它是一个二维图,横坐标表示图像中各个像素点的灰度级,纵坐标为各个灰度级上图像各个像素点出现的次数或概率。如果不特别说明,本讲座中的直方图的纵坐标都对应着该灰度级在图像中出现的概率。我们的例子是在一个对话
3、框中显示一个图像的直方图,为实现该目的,我们定义了一个名为ZFT的对话框类用来显示图像的直方图,具体实现代码和效果图如下(关于代码实现部分可以参考笔者2001年在天极网上发表的一篇VC实现数字图像处理的文章):/直方图对话框构造函数;ZFT:ZFT(CWnd* pParent /*=NULL*/): CDialog(ZFT:IDD, pParent)/ZFT为定义的用来显示直方图的对话框类;Width=Height=0;/对话框初始化阶段设置图像的宽和高为0;/对话框重画函数;void ZFT:OnPaint() CRect rect;/矩形区域对象;CWnd *pWnd;/得到图片框的窗口指
4、针;pWnd=GetDlgItem(IDC_Graphic);/得到ZFT对话框内的Frame控件的指针;file:/(IDC_Graphic为放置在对话框上的一个Picture控件,并讲类型设置为Frame)。pWnd-GetClientRect(&rect);/得到Frame控件窗口的视区域;int i;CPaintDC dc(pWnd);/得到Frame控件的设备上下文;file:/画直方图的x、y轴;dc.MoveTo(0,rect.Height();dc.LineTo(rect.Width(),rect.Height();dc.MoveTo(0,rect.Height();dc.Li
5、neTo(0,0);file:/画直方图,num是ZFT的内部数组变量,存放的是图像各个灰度级出现的概率;该数组的各个分量在显示具体图像的直方图时设置;for(i=0;iGetWindowRect(&rect);/获取pWnd窗口对象窗口区域位置;file:/屏幕坐标转换为客户区坐标;ScreenToClient(&rect);file:/判断当前鼠标是否指在直方图内;if(rect.PtInRect (point)int x=point1.x-rect.left;file:/当前鼠标位置减去区域的起始位置恰好为当前鼠标所指位置所表示的灰度级;string.Format(%d,x);file:
6、/显示当前位置对应的图像的灰度级;pWndText-SetWindowText(LPCTSTR)string);CDialog:OnMouseMove(nFlags, point);/void CDibView:OnImagehorgm()file:/在程序的视类对象内处理显示图像直方图的函数;CDibDoc *pDoc=GetDocument();HDIB hdib;hdib=pDoc-GetHDIB();BITMAPINFOHEADER *lpDIBHdr;/位图信息头结构指针;BYTE *lpDIBBits;/指向位图像素灰度值的指针;lpDIBHdr=( BITMAPINFOHEADE
7、R *)GlobalLock(hdib);/得到图像的位图头信息lpDIBBits=(BYTE*)lpDIBHdr+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);file:/获取图像像素值 ZFT dialog;/直方图对话框模板对象;int i,j;int wImgWidth=lpDIBHdr-biWidth;int wImgHeight=lpDIBHdr-biHeight;file:/a数组用来存放各个灰度级出现的概率;float a256;for(i=0;i256;i+)/初始化数组; ai=0; file:/统计各个灰度级出现的次数;for(
8、i=0;iWIMGHEIGHT;I+)for(j=0;jWIMGWIDTH;J+)a*(lpDIBBits+WIDTHBYTES(wImgWidth*8)*i+j)+;file:/统计各个灰度级出现的概率;for(i=0;iGetHDIB();BITMAPINFOHEADER *lpDIBHdr;/位图信息头结构指针;BYTE *lpDIBBits;/指向位图像素灰度值的指针;lpDIBHdr=( BITMAPINFOHEADER *)GlobalLock(hdib);/得到图像的位图头信息lpDIBBits=(BYTE*)lpDIBHdr+sizeof(BITMAPINFOHEADER)+2
9、56*sizeof(RGBQUAD);file:/获取图像像素值 float p256,p1256,num256;int i,j,k;for(i=0;ibiHeight;int Width=lpDIBHdr-biWidth;for(i=0;iHEIGHT;I+)for(j=30;jWIDTH-20;J+)num*(lpDIBBits+WIDTHBYTES(Width*8)*i+j)+;file:/p存放图像各个灰度级的出现概率;for(i=0;i256;i+)pi=numi/(Width*Height);file:/p1存放各个灰度级之前的概率和,用于直方图变换;for(i=0;i256;i+
10、) for(k=0;k=i;k+)p1i+=pk;file:/直方图变换;for(i=0;iHEIGHT;I+)for(j=30;jbiWidth,lpDIBHdr-biHeight,0,0,lpDIBHdr-biWidth,lpDIBHdr-biHeight,lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY);/显示图像;(a)LENA原图 (b)直方图均衡化后的效果图 (c)原始图象的直方图(d)均衡化后的直方他图 图 二从上述效果图可以看出,经过直方图均衡化处理后,图像变的清晰了,从直方图来看,处理后的LENA的图像直方图分布
11、更均匀了,在每个灰度级上图像都有像素点。但是直方图均衡化存在着两个缺点:1)变换后图像的灰度级减少,某些细节消失;2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。为此M.Kamel和Lian Guan等人从图像相邻像素一般高度相关这一事实出发,将灰度概率分布和空间相关性联系在一起,提出了用二维条件概率密度函数取代一维概率密度函数作为均衡化条件,很好的解决了这个问题,有兴趣的朋友可以参阅一些图像处理书籍和资料。2图像平滑图像平滑主要是为了消除噪声。噪声并不限于人眼所能看的见的失真和变形,有些噪声只有在进行图像处理时才可以发现。图像的常见噪声主要有加性噪声、乘性噪声和量化噪声等。图像
12、中的噪声往往和信号交织在一起,尤其是乘性噪声,如果平滑不当,就会使图像本身的细节如边界轮廓、线条等变的模糊不清,如何既平滑掉噪声有尽量保持图像细节,是图像平滑主要研究的任务。一般来说,图像的能量主要集中在其低频部分,噪声所在的频段主要在高频段,同时系统中所要提取的汽车边缘信息也主要集中在其高频部分,因此,如何去掉高频干扰又同时保持边缘信息,是我们研究的内容。为了去除噪声,有必要对图像进行平滑,可以采用低通滤波的方法去除高频干扰。图像平滑包括空域法和频域法两大类,在空域法中,图像平滑的常用方法是采用均值滤波或中值滤波,对于均值滤波,它是用一个有奇数点的滑动窗口在图像上滑动,将窗口中心点对应的图像
13、像素点的灰度值用窗口内的各个点的灰度值的平均值代替,如果滑动窗口规定了在取均值过程中窗口各个像素点所占的权重,也就是各个像素点的系数,这时候就称为加权均值滤波;对于中值滤波,对应的像素点的灰度值用窗口内的中间值代替。实现均值或中值滤波时,为了简便编程工作,可以定义一个n*n的模板数组。另外,读者需要注意一点,在用窗口扫描图像过程中,对于图像的四个边缘的像素点,可以不处理;也可以用灰度值为0的像素点扩展图像的边缘。下面给出了采用加权均值滤波的图像平滑函数代码和效果图:void CDibView:OnImagePh() CClientDC pDC(this);HDC hDC=pDC.GetSafe
14、Hdc();/获取当前设备上下文的句柄;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(
15、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 mask33=1,1,1,1,2,1,1,1,1;/定义的3x3加权平滑模板;for(i=0; ibiHeight; i+)f
16、or(j=0; jbiWidth; j+) sumw=0; sum=0;for(s=(-ms); s=ms; s+)for(t=(-ms); t=0)&(j+t)=0)&(i+s)biHeight)&(j+t)biWidth)sumw += mask1+s1+t; sum+=*(hData+(i+s)*WIDTHBYTES(lpBi-biWidth*8)+(j+t)*mask1+s1+t;if(sumw=0) sumw=1;sum/=sumw;if(sum255)sum=255;if(sumbiWidth*8)+j)=sum;for( j=0; jbiHeight; j+)for(i=0;ib
17、iWidth;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)平滑后的效果图 图三中值或均值平滑有时处理图像的效果并不是很好,它虽然去除了一定的噪声,但同时使图像中的边缘变的模糊,这主
18、要和所选取的窗口大小有关,为此下面介绍了一种既能保持边缘清晰又能消除噪声的方法,其算法如图四所示:(a)(b) (c) 图 四 图像平滑模板上图的含义是在图像中取5*5的区域,包含点(i,j)的五边形和六边形各四个,3*3的区域一个,计算这九个区域的标准差和灰度的平均值,取标准差最小区域的灰度平均值作为点(i,j)的灰度。由于该算法的实现代码和上述代码大同小异,所以代码部分就不再赘述。3图像锐化图像平滑往往使图像中的边界、轮廓变的模糊,为了减少这类不利效果的影响,这就需要利用图像鋭化技术,使图像的边缘变的清晰。图像銳化处理的目的是为了使图像的边缘、轮廓线以及图像的细节变的清晰,经过平滑的图像变
19、得模糊的根本原因是因为图像受到了平均或积分运算,因此可以对其进行逆运算(如微分运算)就可以使图像变的清晰。从频率域来考虑,图像模糊的实质是因为其高频分量被衰减,因此可以用高通滤波器来使图像清晰。为了要把图像中间任何方向伸展的的边缘和轮廓线变得清晰,我们希望对图像的某种运算是各向同性的。可以证明偏导平方和的运算是各向同性的,既:式中( )是图像旋转前的坐标,( )是图像旋转后的坐标。梯度运算就是在这个式子的基础上开方得到的。图像(x,y)点的梯度值:为了突出物体的边缘,常常采用梯度值的改进算法,将图像各个点的梯度值与某一阈值作比较,如果大于阈值,该像素点的灰度用梯度值表示,否则用一个固定的灰度值
20、表示。我们在对图像增强的过程中,采用的是一种简单的高频滤波增强方法:式中f,g分别为锐化前后的图像, 是与扩散效应有关的系数。 表示对图像f进行二次微分的拉普拉斯算子。这表明不模糊的图像可以由模糊的图像减去乘上系数的模糊图像拉普拉斯算子来得到。 可以用下面的模板H=1,4,1,4,-20,4,1,4,1来近似。在具体实现时,上述模板H中的各个系数可以改变, 这个系数的选择也很重要,太大了会使图像的轮廓过冲,太小了则图像锐化不明显。实验表明, 选取2-8之间往往可以达到比较满意的效果。下面给出 等于4的情况下的实现代码和效果图:void CDibView:OnMenuitem32785() CClientDC pDC(this);HDC hDC=pDC.GetSafeHdc();/获取当前设备上下文的句柄;SetStretchBltMode(hDC,COLORONCOLOR);CDibDoc *pDoc=GetDocument();HDIB hdib;hdib=pDoc-GetHDIB();BITMAPINFOHEADER *lpDIBHdr;/位图信息头结构指针;BYTE *lpD
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1