您好,欢迎访问三七文档
VisualC++实现数字图像增强处理分类:图像处理/OpenCV2012-12-1017:08266人阅读评论(1)收藏举报前言对于一个图像处理系统来说,可以将流程分为三个阶段,在获取原始图像后,首先是图像预处理阶段、第二是特征抽取阶段、第三是识别分析阶段。图像预处理阶段尤为重要,如果这阶段处理不好,后面的工作根本无法展开。在实际应用中,我们的系统获取的原始图像不是完美的,例如对于系统获取的原始图像,由于噪声、光照等原因,图像的质量不高,所以需要进行预处理,以有利于提取我们感兴趣的信息。图像的预处理包括图像增强、平滑滤波、锐化等内容。图像的预处理既可以在空间域实现,也可以在频域内实现,我们主要介绍在空间域内对图像进行点运算,它是一种既简单又重要的图像处理技术,它能让用户改变图像上像素点的灰度值,这样通过点运算处理将产生一幅新图像。下面我们开始介绍与图像点运算的相关知识。一、图像的直方图图像直方图是图像处理中一种十分重要的图像分析工具,它描述了一幅图像的灰度级内容,任何一幅图像的直方图都包含了丰富的信息,它主要用在图象分割,图像灰度变换等处理过程中。从数学上来说图像直方图是图像各灰度值统计特性与图像灰度值的函数,它统计一幅图像中各个灰度级出现的次数或概率;从图形上来说,它是一个二维图,横坐标表示图像中各个像素点的灰度级,纵坐标为各个灰度级上图像各个像素点出现的次数或概率。如果不特别说明,本讲座中的直方图的纵坐标都对应着该灰度级在图像中出现的概率。我们的例子是在一个对话框中显示一个图像的直方图,为实现该目的,我们定义了一个名为ZFT的对话框类用来显示图像的直方图,具体实现代码和效果图如下(关于代码实现部分可以参考笔者2001年在天极网上发表的一篇VC实现数字图像处理的文章):[cpp]viewplaincopyprint?1.//////////////////////////////////直方图对话框构造函数;2.ZFT::ZFT(CWnd*pParent/*=NULL*/)3.:CDialog(ZFT::IDD,pParent)//ZFT为定义的用来显示直方图的对话框类;4.{5.Width=Height=0;//对话框初始化阶段设置图像的宽和高为0;6.}7.////////////////////////对话框重画函数;8.voidZFT::OnPaint()9.{10.CRectrect;//矩形区域对象;11.CWnd*pWnd;//得到图片框的窗口指针;12.pWnd=GetDlgItem(IDC_Graphic);//得到ZFT对话框内的Frame控件的指针;13.file://(IDC_Graphic为放置在对话框上的一个Picture控件,并讲类型设置为Frame)。14.pWnd-GetClientRect(&rect);//得到Frame控件窗口的视区域;15.inti;16.CPaintDCdc(pWnd);//得到Frame控件的设备上下文;17.file://画直方图的x、y轴;18.dc.MoveTo(0,rect.Height());19.dc.LineTo(rect.Width(),rect.Height());20.dc.MoveTo(0,rect.Height());21.dc.LineTo(0,0);22.file://画直方图,num[]是ZFT的内部数组变量,存放的是图像各个灰度级出现的概率;该数组的各个分量在显示具体图像的直方图时设置;23.for(i=0;i256;i++)//根据图像上的各个灰度级出现的概率,在坐标上对应的画出一根直线,从而各个表示各灰度级出现概率的直线构成了图像的直方图;24.{25.dc.MoveTo(i+1,rect.Height());26.dc.LineTo(i+1,(rect.Height()-rect.Height()*num[i]*30));27.file://此处num分量乘以30是为了放大个灰度级上对应的出现概率直线,增强显示效果;28.}29.}30.////////////////////////////////////////////////////////31.voidZFT::OnMouseMove(UINTnFlags,CPointpoint)32.{//OnMouseMove函数处理鼠标消息,显示当前鼠标所在直方图上的灰度值等信息;33.CWnd*pWnd,*pWndText;//定义两个窗口对象;34.CPointpoint1;//定义个一个点对象;35.point1=point;//存放当前鼠标的位置信息;36.CRectrect;//矩形对象;37.CStringstring;//字符串对象;38.pWnd=GetDlgItem(IDC_Graphic);//得到显示直方图的框架窗口对象指针;39.pWndText=GetDlgItem(IDC_NUM);//得到指向文本框对象(IDC_NUM)窗口的指针;40.pWnd-GetWindowRect(&rect);//获取pWnd窗口对象窗口区域位置;41.file://屏幕坐标转换为客户区坐标;42.ScreenToClient(&rect);43.file://判断当前鼠标是否指在直方图内;44.if(rect.PtInRect(point))45.{46.intx=point1.x-rect.left;47.file://当前鼠标位置减去区域的起始位置恰好为当前鼠标所指位置所表示的灰度级;48.string.Format(%d,x);49.file://显示当前位置对应的图像的灰度级;50.pWndText-SetWindowText((LPCTSTR)string);51.}52.CDialog::OnMouseMove(nFlags,point);53.}54.////////////////////////////////////////55.voidCDibView::OnImagehorgm()56.file://在程序的视类对象内处理显示图像直方图的函数;57.{58.CDibDoc*pDoc=GetDocument();59.HDIBhdib;60.hdib=pDoc-GetHDIB();61.BITMAPINFOHEADER*lpDIBHdr;//位图信息头结构指针;62.BYTE*lpDIBBits;//指向位图像素灰度值的指针;63.lpDIBHdr=(BITMAPINFOHEADER*)GlobalLock(hdib);//得到图像的位图头信息64.lpDIBBits=(BYTE*)lpDIBHdr+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);65.file://获取图像像素值66.ZFTdialog;//直方图对话框模板对象;67.inti,j;68.intwImgWidth=lpDIBHdr-biWidth;69.intwImgHeight=lpDIBHdr-biHeight;70.file://a[]数组用来存放各个灰度级出现的概率;71.floata[256];72.for(i=0;i256;i++)//初始化数组;73.{74.a[i]=0;75.}76.file://统计各个灰度级出现的次数;77.for(i=0;i{78.for(j=0;j{79.a[*(lpDIBBits+WIDTHBYTES(wImgWidth*8)*i+j)]++;80.}81.file://统计各个灰度级出现的概率;82.for(i=0;i256;i++)83.{84.a[i]=a[i]/(wImgHeight*wImgWidth);//得到每个灰度级的出现概率;85.memcpy(dialog.num,a,256*sizeof(float));86.}87.}88.dialog.DoModal();//显示直方图对话框;89.}90.return;91.}图一上图为LENA的原始图像和其对应的直方图,在(b)图中的135表示当前鼠标在直方图中所指的位置对应的灰度级为135。从该直方图可以看出,LENA图像的灰度主要分布在中高灰度级上,在低灰度级上图像的像素数几乎为零。二、图像增强影响系统图像清晰程度的因素很多,例如室外光照度不够均匀就会造成图像灰度过于集中;由CCD(摄像头)获得的图像经过A/D(数/模转换,该功能在图像系统中由数字采集卡来实现)转换、线路传送都会产生噪声污染等等。因此图像质量不可避免的降低了,轻者表现为图像不干净,难于看清细节;重者表现为图像模糊不清,连概貌也看不出来。因此,在对图像进行分析之前,必须要对图像质量进行改善,一般情况下改善的方法有两类:图像增强和图像复原。图像增强不考虑图像质量下降的原因,只将图像中感兴趣的特征有选择的突出,而衰减不需要的特征,它的目的主要是提高图像的可懂度。图像增强的方法分为空域法和频域法两类,空域法主要是对图像中的各个像素点进行操作;而频域法是在图像的某个变换域内,对图像进行操作,修改变换后的系数,例如付立叶变换、DCT变换等的系数,然后再进行反变换得到处理后的图像。图像复原技术与增强技术不同,它需要了解图像质量下降的原因,首先要建立降质模型,再利用该模型,恢复原始图像。本期讲座我们主要介绍各种增强技术在图象处理系统中的实际应用。1.灰度变换简单的说,灰度变换就是指对图像上各个像素点的灰度值x按某个函数T()变换到y。例如为了提高图像的清晰度,需要将图像的灰度级整个范围或其中某一段(A,B)扩展或压缩到(A,B);需要显示出图像的细节部分等都要求采用灰度变换方法。灰度变换有时又被称为图像的对比度增强或对比度拉伸。假定输入图像中的一个像素的灰度级为Z,经过T(Z)函数变换后输出图像对应的灰度级为Z,其中要求Z和Z都要在图像的灰度范围之内。根据T()形式,可以将灰度变换分为线性变换和非线性变换。具体应用中采用何种T(),需要根据变换的要求而定。对于图像的灰度变换,我们这里介绍一种稍微复杂一点的方法,既直方图均衡化。直方图均衡化是灰度变换的一个重要应用,广泛应用在图像增强处理中,它是以累计分布函数变换为基础的直方图修正法,可以产生一幅灰度级分布具有均匀概率密度的图像,扩展了像素的取值动态范围。若像素点的原灰度为R,变换后的灰度为S,需要注意的是R、S是归一化后的灰度值,其灰度变换函数T()为:式中,Pr(Rj)是第j级灰度值的概率,nj是图像中j级灰度的像素总数,l是图像中灰度级的总数目,n是图象中像素的总数。对变换后的S值取最靠近的一个灰度级的值,建立灰度级变换表,将原图像变换为直方图均衡的图像。下面是实现图像直方图均衡化函数的源代码和效果图:[cpp]viewplaincopyprint?1.voidCDibView::OnZftJh()2.{3.CClientDCpDC(this);4.HDChDC=pDC.GetSafeHdc();//获取当前设备上下文的句柄;5.SetStretchBltMode(hDC,COLORONCOLOR);6.CDibDoc*pDoc=GetDocument();7.HDIBhdib;8.hdib=pDoc-GetHDIB();9.BITMAPINFOHEADER*lpDIBHdr;//位图信息头结构指针;10.BYTE*lpDIBBits;//指向位图像素灰度值的指针;11.lpDIBHdr=(BITMAPINFOHEADER*)GlobalLock(hdib);//得到图像的位图头信息12.lpDIBBits=(BYTE*)lpDIBHdr+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);13.file://获取图像像素值14.floatp[256],p1[256],num[256];15.inti,j,k;16.for(i=0;i256;i
本文标题:图像 锐化处理代码
链接地址:https://www.777doc.com/doc-3141276 .html