扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:刘涛 来源:yesky 2007年11月16日
关键字: Visual C++ 数字图像增强 处理
//////////////////////////////////直方图对话框构造函数; ZFT::ZFT(CWnd* pParent /*=NULL*/) : CDialog(ZFT::IDD, pParent)//ZFT为定义的用来显示直方图的对话框类; { Width=Height=0;//对话框初始化阶段设置图像的宽和高为"0"; } ////////////////////////对话框重画函数; void ZFT::OnPaint() { CRect rect;//矩形区域对象; CWnd *pWnd;//得到图片框的窗口指针; 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.LineTo(0,0); file://画直方图,num[]是"ZFT"的内部数组变量,存放的是图像各个灰度级出现的概率;该数组的各个分量在 显示具体图像的直方图时设置; for(i=0;i<256;i++)//根据图像上的各个灰度级出现的概率,在坐标上对应的画出一根直线,从而各个表示各灰度级出现概率的直线构成了图像的直方图; { dc.MoveTo(i+1,rect.Height()); dc.LineTo (i+1,(rect.Height()-rect.Height()*num[i]*30)); file://此处num分量乘以"30"是为了放大个灰度级上对应的出现概率直线,增强显示效果; } } //////////////////////////////////////////////////////// void ZFT::OnMouseMove(UINT nFlags, CPoint point) {//OnMouseMove函数处理鼠标消息,显示当前鼠标所在直方图上的灰度值等信息; CWnd *pWnd,*pWndText;//定义两个窗口对象; CPoint point1;//定义个一个点对象; point1=point;//存放当前鼠标的位置信息; CRect rect;//矩形对象; CString string ;//字符串对象; pWnd=GetDlgItem(IDC_Graphic);//得到显示直方图的框架窗口对象指针; pWndText=GetDlgItem(IDC_NUM);//得到指向文本框对象(IDC_NUM)窗口的指针; pWnd->GetWindowRect(&rect);//获取pWnd窗口对象窗口区域位置; file://屏幕坐标转换为客户区坐标; ScreenToClient(&rect); file://判断当前鼠标是否指在直方图内; if(rect.PtInRect (point)) { int x=point1.x-rect.left; file://当前鼠标位置减去区域的起始位置恰好为当前鼠标所指位置所表示的灰度级; string.Format("%d",x); file://显示当前位置对应的图像的灰度级; 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=( BITMAPINFOHEADER *)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 a[256]; for(i=0;i<256;i++)//初始化数组; { a[i]=0; } file://统计各个灰度级出现的次数; for(i=0;i for(j=0;j a[*(lpDIBBits+WIDTHBYTES(wImgWidth*8)*i+j)]++; } file://统计各个灰度级出现的概率; for(i=0;i<256;i++) { a[i]=a[i]/(wImgHeight*wImgWidth);//得到每个灰度级的出现概率; memcpy(dialog.num,a,256*sizeof(float)); } } dialog.DoModal();//显示直方图对话框; } return; } |
(a)LENA图像 |
(b)直方图 |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者