1、 产生一幅灰度级分布具有均匀概率密度的图像,扩展像素取值的动态范围,达到了图象增强的目的。3、直方图均衡化的效果 : 1)变换后直方图趋向平坦,灰级减少,灰度合并。 2)原始象含有象素数多的几个灰级间隔被拉大了,压缩的只是象素数少的几个灰度级,实际视觉能够接收的信息量大大地增强了,增加了图象的反差。同时,也增加了图象的可视粒度。4、离散情况下的直方图均衡化的算法:A、列出原始图像的灰度级 B、统计各灰度级的像素数目C、计算原始图像直方图各灰度级的频数D、计算累积分布函数F、应用以下公式计算映射后的输出图像的灰度级,P为输出图像灰度级的个数,其中INT为取整符号:G、用的映射关系修改原始图像的灰
2、度级,从而获得直方图近似为均匀分布的输出图像。5、主要代码/画两个直方图坐标轴void CImageView:OnDraw(CDC* pDC) CImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here if(m_dib.m_bLoaded=true) /判断是否加载图像 /获取图像宽和高int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight(); if(m_dib.m_bLoaded=true) int nw=m
3、_dib.GetDIBWidth(); int nh=m_dib.GetDIBHeight(); m_dib.ShowDIB(pDC,10,10,nw,nh,m_dib.m_pDIBData,m_dib.m_pBMI); m_dib.ShowDIB(pDC,400,10,nw,nh,m_dib.m_pDumpDIBData,m_dib.m_pBMI); if(m_bHist=true) /绘画直方图 CString str; int i; / 绘制坐标轴 pDC-MoveTo(10,nh+20); /(10,nh+20 )是直方图的左上角坐标 / 垂直轴LineTo(10,nh+200);/(
4、10,nh+200 )是直方图的左下角坐标 / 水平轴LineTo(310,nh+200);/(310,nh+200 )是直方图的右下角坐标 / 写X轴刻度值 str.Format(0);TextOut(10, nh+200+10, str);50TextOut(60, nh+200+10, str);100TextOut(110, nh+200+10, str);150TextOut(160, nh+200+10, str);200TextOut(210, nh+200+10, str);255TextOut(265, nh+200+10, str);原图直方图归一化TextOut(100,
5、 nh+230+10, str); / 绘制X轴刻度 for ( i = 0; i MoveTo(i + 10, nh+200-2);LineTo(i + 10, nh+200+2); else / 绘制X轴箭头MoveTo(305,nh+200-5);LineTo(305,nh+200+5); / 绘制y轴箭头LineTo(5,nh+20+5);LineTo(15,nh+20+5); int max=0; for(i=0;imax) max=m_yuantui; pDC-MoveTo(10+i,nh+200);LineTo(10+i,nh+200-(m_yuantui*160/max);/*
6、/TEST 第二个直方图if(m_bHist=true)MoveTo(160+nw,nh+20);LineTo(160+nw,nh+200);LineTo(460+nw,nh+200);TextOut(415, nh+200+10, str);TextOut(465, nh+200+10, str);TextOut(515, nh+200+10, str);TextOut(565, nh+200+10, str);TextOut(615, nh+200+10, str);TextOut(670, nh+200+10, str);直方图均衡化后归一化TextOut(505, nh+230+10,
7、 str);MoveTo(i + 420, nh+200-2);LineTo(i + 415, nh+200+2);LineTo(i + 420, nh+200+2);MoveTo(710,nh+200-5);LineTo(715,nh+200);LineTo(710,nh+200+5);MoveTo(415,nh+20);LineTo(410,nh+20+5);LineTo(420,nh+20+5); if(m_histi max=m_histi;MoveTo(415+i,nh+200);LineTo(415+i,nh+200-(m_histi*160/max);/*/ 显示图像(具体的参数
8、见CDIB类的该函数说明)m_dib.ShowDIB(pDC,10,10,nw,nh,m_dib.m_pDIBData,m_dib.m_pBMI);m_dib.ShowDIB(pDC,400,10,nw,nh,m_dib.m_pDumpDIBData,m_dib.m_pBMI);/直方图均衡化及直方图归一化坐标轴赋值程序/OnZhifangtu() /判断图像是否打开,没打开,则弹出提示框并退出函数 if(!m_dib.m_bLoaded) AfxMessageBox(图像还打开,请先打开图像! return; /获取图像宽和高及定义成员变量 int nw=m_dib.GetDIBWidth(
9、); int nh=m_dib.GetDIBHeight(); int i,j; int *arr=new int nw*nh; int n256=0; float p256=0.0,c256=0.0; BYTE* pdata=m_dib.m_pdata; for(i=0;i+) /初始化直方图数组 m_yuantui=0; if(1)/m_dib.m_nImType=24) for(j=0;jnh;j+) for(i=0;nw; BYTE temp=pdataj*nw+i; m_yuantutemp+; m_bHist=true;/直方图归一化计算i+) for(j=0;j+) nm_dib
10、.m_pdatai*nw+j+; (float)pi=(float)ni/(float)(nw*nh);/归一化后累计计算for(i=0;=i; ci+=pj; /找到灰度值最大值最小值int max=m_dib.m_pdata0,min=m_dib.m_pdata0; if(max min=m_dib.m_pdatai*nw+j;/套公式直方图均衡化计算赋值给arr一维数组 arri*nw+j=int(cm_dib.m_pdatai*nw+j*(max-min)+min+0.5);/一维数组arr赋值给新图像 for( j=0;j+)i+) m_dib.m_pdataj*nw+i=arrj*nw+i; /将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果 m_dib.UpdateData(); /刷新屏幕 Invalidate(); m_histi=0; m_histtemp+; Add your command handler code here6、实验结果
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2