图像 锐化处理代码_第1页
图像 锐化处理代码_第2页
图像 锐化处理代码_第3页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VisualC++实现数字图像增强处理图像处理/OpenCV2012-12-1017:08266评论(1)前言果这阶段处理不好,后面的工作根本无法展开。一、图像的直方图图像直方图是图像处理中一种十分重要的图像分析工具"ZFT"的(2001年在天极网上发表的一篇VC实现数字图像处理的文章):[cpp]viewplaincopyprint?11//////////////////////////////////直方图对话框构造函数;ZFT::ZFT(CWnd*pParent/*=NULL*/):CDialog(ZFT::IDD,为定义的用来显示直方图的对话框类;4.{5.Width=Height=0;//对话框初始化阶段设置图像的宽和高为"0";6.}7////////////////////////对话框重画函数;8.voidZFT::OnPaint()9.{CRect矩形区域对象;CWnd得到图片框的窗口指针;pWnd=GetDlgItem(IDC_Graphic);//ZFT对话框内的"Frame"控件的指针;file://(IDC_Graphic为放置在对话框上的一个"Picture""Frame")。pWnd->GetClientRect(&rect);//"Frame"控件窗口的"视"区域;inti;CPaintDC"Frame"控件的设备上下文;file://、y轴;dc.MoveTo(0,rect.Height());dc.LineTo(rect.Width(),rect.Height());dc.MoveTo(0,rect.Height());dc.LineTo(0,0);file://是的内部数组变量,存放的是图像各个灰度级出现的概率;该数组的各个分量在 示具体图像的直方图时设置;根据图像上的各个灰度级出现出现概率的直线构成了图像的直方图;24. {25. dc.MoveTo(i+1,rect.Height());26.dc.LineTo(i+1,(rect.Height()-rect.Height()*num[i]*30));27. num"30"是为了放大个灰度级上对应的出现概率直线,增强显示效果;28. }29. }30. ////////////////////////////////////////////////////////voidZFT::OnMouseMove(UINTnFlags,CPointpoint){//OnMouseMove函数处理鼠标消息,显示当前鼠标所在直方图上的灰度值等信息;CWnd定义两个窗口对象;CPoint定义个一个点对象;point1=point;//存放当前鼠标的位置信息;CRect矩形对象;CStringstring;字符串对象;pWnd=GetDlgItem(IDC_Graphic);//得到显示直方图的框架窗口对象指针;框对象窗口的指针;pWnd->GetWindowRect(&rect);//获取pWnd窗口对象窗口区域位置;file://屏幕坐标转换为客户区坐标;ScreenToClient(&rect);file://判断当前鼠标是否指在直方图内;if(rect.PtInRect(point))45. {intx=point1.x-rect.left;当前鼠标位置减去区域的起始位置恰好为当前鼠标所指位置所表示的灰度级;string.Format("%d",x);显示当前位置对应的图像的灰度级;pWndText->SetWindowText((LPCTSTR)string);51. }52. CDialog::OnMouseMove(nFlags,point);53. }54. ////////////////////////////////////////voidCDibView::OnImagehorgm()57.{58.CDibDoc*pDoc=GetDocument();59.HDIBhdib;60.hdib=pDoc->GetHDIB();57.{58.CDibDoc*pDoc=GetDocument();59.HDIBhdib;60.hdib=pDoc->GetHDIB();61.BITMAPINFOHEADER位图信息头结构指针;62. BYTE指向位图像素灰度值的指针;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;file://a[]数组用来存放各个灰度级出现的概率;floata[256];72. for(i=0;i<256;i++)//初始化数组;73. {74. a[i]=0;75. }file://统计各个灰度级出现的次数;for(i=0;i {for(j=0;j {a[*(lpDIBBits+WIDTHBYTES(wImgWidth*8)*i+j)]++;80. }81. 统计各个灰度级出现的概率;82. for(i=0;i<256;i++)83. {84. a[i]=a[i]/(wImgHeight*wImgWidth);//得到每个灰度级的出现概率;85.memcpy(dialog.num,a,256*sizeof(float));86. }87. }88. dialog.DoModal();//显示直方图对话框;89. }return;91. }图一上图为LENA的原始图像和其对应的直方图,在图中的135135灰度级上,在低灰度级上图像的像素数几乎为零。二、图像增强影响系统图像清晰程度的因素很多中;由摄像头)获得的图像经过A/D(数/模转换,该功能在图像系统中由数字采集卡来实现转换、线路传送都会产生噪声污染等等。因此图像质量不可避免的降低了DCT变换等的系数,灰度变换简单的说灰度变换就是指对图像上各个像素点的灰度值x按某个函数变换到例如为了提高图像的清晰度,需要将图像的灰度级整个范围或其中某一段扩展或压缩到,B);需要显示出图像的细节部分等都要求采用灰度变换方法。灰度变换有时又被称为图像的对比度增强或对比度拉伸假定输入图像中的一个像素的灰度级为经过T(Z)函数变换后输出图像对应的灰度级为Z 其中要求Z和Z 都要在图像的灰度范围之内根据T()形式可以将灰度变换分为线性变换和非线性变换具体应用中采用何种需要根据变换的要求而定。的取值动态范围。若像素点的原灰度为R,变换后的灰度为S,需要注意的是RS是归一化后的灰度值,其灰度变换函数T()为:是第j是图像中j是图像中灰度级的S效果图:[cpp]viewplaincopyprint?voidCDibView::OnZftJh()2.{CClientDCHDC获取当前设备上下文的句柄;SetStretchBltMode(hDC,COLORONCOLOR);CDibDoc*pDoc=GetDocument();HDIBhdib;hdib=pDoc->GetHDIB();BITMAPINFOHEADER位图信息头结构指针;BYTE指向位图像素灰度值的指针;lpDIBHdr=(BITMAPINFOHEADER*)GlobalLock(hdib);//得到图像的位图头信息lpDIBBits=(BYTE*)lpDIBHdr+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);file://获取图像像素值14. floatp[256],p1[256],num[256];15. inti,j,k;16. for(i=0;i<256;i++)//;17. {num[i]=0.0f;18. p[i]=0.0f;19. p1[i]=0.0f;20. }file://num[];intHeight=lpDIBHdr->biHeight;intWidth=lpDIBHdr->biWidth;for(i=0;i for(j=30;j {num[*(lpDIBBits+WIDTHBYTES(Width*8)*i+j)]++;26. }27. file://p[]存放图像各个灰度级的出现概率;28. for(i=0;i<256;i++)29. {30. p[i]=num[i]/(Width*Height);31. }32. 存放各个灰度级之前的概率和,用于直方图变换;33. for(i=0;i<256;i++)34. {35. for(k=0;k<=i;k++)36. p1[i]+=p[k];37. }38. 直方图变换;39.for(i=0;ifor(j=30;j{*(lpDIBBits+WIDTHBYTES(Width*8)*i+j)=(BYTE)(p1[*(lpDIBBits+WIDTHBYTES(Width*8)*i+j)]*255+0.5);40. }41.StretchDIBits(hDC,0,0,lpDIBHdr->biWidth,lpDIBHdr->biHeight,0,0,42.43.lpDIBBits,(LPBITMAPINFO)lpDIBHdr,45.46. }

SRCCOPY);//显示图像;图二后的LENA的图像直方图分布更均匀了,在每个灰度级上图像都有像素点。但是直方图均衡化存在着两个缺点:变换后图像的灰度级减少,某些细节消失;某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。为此M.KamelLianGuan等人从图像相邻像素一般高度相关这一事实出发,将灰度图像平滑n*n"0"的像素点扩展图像的边缘。下面给出了采用加权均值滤波的图像平滑函数代码和效果图:[cpp]viewplaincopyprint?1.1.void2.{CDibView::OnImagePh()CClientDCHDC获取当前设备上下文的句柄;SetStretchBltMode(hDC,COLORONCOLOR);HANDLEdata1handle;LPBITMAPINFOHEADERlpBi;CDibDoc*pDoc=GetDocument();HDIBhdib;unsignedchar*hData;unsignedchar*data;hdib=pDoc->GetHDIB();14.lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);15.hData=(unsignedchar*)FindDIBBits((LPSTR)lpBi);16. 17.data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight);18.data=(unsignedchar*)GlobalLock((HGLOBAL)data1handle);AfxGetApp()->BeginWaitCursor();inti,j,s,t,ms=1;intsum=0,sumw=0;22.intmask[3][3]={{1,1,1},{1,2,1},{1,1,1}};//定义3x3加权平滑模板;23.for(i=0;ibiHeight;i++)24.for(j=0;jbiWidth;j++)25.{26.sumw=0;sum=0;27.28.

for(s=(-ms);s<=ms;s++)for(t=(-ms);t<=ms;t++) ((j+t)>=0)&&((i+s)biHeight)&&((j+t)biWidth))29. {30. sumw+=mask[1+s][1+t];31.sum+=*(hData+(i+s)*WIDTHBYTES(lpBi->biWidth*8)+(j+t))*mask[1+s][1+t];32. }if(sumw==0)sumw=1;sum/=sumw;35. if(sum>255)sum=255;36. 37.*(data+i*WIDTHBYTES(lpBi->biWidth*8)+j)=sum;38. }39. for(j=0;jbiHeight;j++)40.for(i=0;ibiWidth;i++) *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)=*(data+i*WIDTHBYTES(lpBi->biWidth*8)+j);41.StretchDIBits(hDC,0,0,lpBi->biWidth,lpBi->biHeight,0,0,42.lpBi->biWidth,lpBi->biHeight,43.hData,(LPBITMAPINFO)lpBi,44.DIB_RGB_COLORS,45.SRCCOPY);//显示图像;46.}图三晰又能消除噪声的方法,其算法如图四所示:图像锐化

图四图像平滑模板(如微分运算为了要把图像中间任何方向伸展的的边缘和轮廓线变得清晰算是各向同性的。可以证明偏导平方和的运算是各向同性的,既:的基础上开方得到的。图像点的梯度值:较,如果大于阈值,该像素点的灰度用梯度值表示,否则用一个固定的灰度值表示。我们在对图像增强的过程中,采用的是一种简单的高频滤波增强方法:式中f,g表示对图像f进行二可以用下面的模板来近似。在具体实现时,上述模板H这个系数的选择也很重要,太大了2-8之间往往可以达到比较满意的效果。下面给出kτ4的情况下的实现代码和效果图:[cpp]viewplaincopyprint?voidCDibView::OnMenuitem32785()2.{CClientDCHDChDC=pDC.GetSafeHdc();//获取当前设备上下文的句柄;SetStretchBltMode(hDC,COLORONCOLOR);CDibDoc*pDoc=GetDocument();HDIBhdib;hdib=pDoc->GetHDIB();BITMAPINFOHEADER位图信息头结构指针;BYTE指向位图像素灰度值的指针;lpDIBHdr=(BITMAPINFOHEADER*)GlobalLock(hdib);//得到图像的位图头信息lpDIBBits=(BYTE*)lpDIBHdr+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);//获取图像像素值BYTE*pData1;13. staticinta[3][3]={{1,4,1},{4,-20,4},{1,4,1}};//拉普拉斯算子模板;intm,n,i,j,sum;intWidth=lpDIBHdr->biWidth;intH

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论