您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 数字图像处理实验报告-直方图均衡化
课程设计课程名称数字图像处理题目名称直方图均衡化学生学院信息工程学院专业班级10级电信2班学号学生姓名指导教师曹江中2013年1月日设计题目:直方图均衡化1、直方图的理论基础:(1)直方图概念:灰度直方图表示图像中每种灰度出现的频率。(2)直方图的作用:反映一幅图像的灰度分布特性(3)直方图的计算:式中:nk为图像中出现rk级灰度的像素数,n是图像像素总数,而nk/n即为频数。2、设计目的:产生一幅灰度级分布具有均匀概率密度的图像,扩展像素取值的动态范围,达到了图象增强的目的。3、直方图均衡化的效果:1)变换后直方图趋向平坦,灰级减少,灰度合并。2)原始象含有象素数多的几个灰级间隔被拉大了,压缩的只是象素数少的几个灰度级,实际视觉能够接收的信息量大大地增强了,增加了图象的反差。同时,也增加了图象的可视粒度。4、离散情况下的直方图均衡化的算法:A、列出原始图像的灰度级B、统计各灰度级的像素数目C、计算原始图像直方图各灰度级的频数D、计算累积分布函数F、应用以下公式计算映射后的输出图像的灰度级,P为输出图像灰度级的个数,其中INT为取整符号:G、用的映射关系修改原始图像的灰度级,从而获得直方图近似为均匀分布的输出图像。5、主要代码///////////////////////////////////////////////////////////////////画两个直方图坐标轴///////////////////////////////////////////////////////////////////voidCImageView::OnDraw(CDC*pDC){1,,1,0,Ljfj1,,1,0,Ljnj1,,1,0,/)(LjnnfPjjf1,,,1,0,)()(0LkjfPfCkjjf]5.0)()[(minminmaxgfCggINTginnrpkk)(1,,2,1,010lkrkCImageDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahereif(m_dib.m_bLoaded==true)//判断是否加载图像{//获取图像宽和高intnw=m_dib.GetDIBWidth();intnh=m_dib.GetDIBHeight();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahereif(m_dib.m_bLoaded==true){intnw=m_dib.GetDIBWidth();intnh=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){//绘画直方图CStringstr;intnh=m_dib.GetDIBHeight();inti;//绘制坐标轴pDC-MoveTo(10,nh+20);//(10,nh+20)是直方图的左上角坐标//垂直轴pDC-LineTo(10,nh+200);//(10,nh+200)是直方图的左下角坐标//水平轴pDC-LineTo(310,nh+200);//(310,nh+200)是直方图的右下角坐标//写X轴刻度值str.Format(0);pDC-TextOut(10,nh+200+10,str);str.Format(50);pDC-TextOut(60,nh+200+10,str);str.Format(100);pDC-TextOut(110,nh+200+10,str);str.Format(150);pDC-TextOut(160,nh+200+10,str);str.Format(200);pDC-TextOut(210,nh+200+10,str);str.Format(255);pDC-TextOut(265,nh+200+10,str);str.Format(原图直方图归一化);pDC-TextOut(100,nh+230+10,str);//绘制X轴刻度for(i=0;i256;i+=25){if((i&1)==0){//10的倍数pDC-MoveTo(i+10,nh+200-2);pDC-LineTo(i+10,nh+200+2);}else{//10的倍数pDC-MoveTo(i+10,nh+200-2);pDC-LineTo(i+10,nh+200+2);}}//绘制X轴箭头pDC-MoveTo(305,nh+200-5);pDC-LineTo(310,nh+200);pDC-LineTo(305,nh+200+5);//绘制y轴箭头pDC-MoveTo(10,nh+20);pDC-LineTo(5,nh+20+5);pDC-MoveTo(10,nh+20);pDC-LineTo(15,nh+20+5);intmax=0;for(i=0;i256;i++)if(m_yuantu[i]max)max=m_yuantu[i];for(i=0;i256;i++){pDC-MoveTo(10+i,nh+200);pDC-LineTo(10+i,nh+200-(m_yuantu[i]*160/max));}}/******************///TEST第二个直方图if(m_bHist==true){//绘画直方图CStringstr;intnh=m_dib.GetDIBHeight();inti;//绘制坐标轴pDC-MoveTo(160+nw,nh+20);//(10,nh+20)是直方图的左上角坐标//垂直轴pDC-LineTo(160+nw,nh+200);//(10,nh+200)是直方图的左下角坐标//水平轴pDC-LineTo(460+nw,nh+200);//(310,nh+200)是直方图的右下角坐标//写X轴刻度值str.Format(0);pDC-TextOut(415,nh+200+10,str);str.Format(50);pDC-TextOut(465,nh+200+10,str);str.Format(100);pDC-TextOut(515,nh+200+10,str);str.Format(150);pDC-TextOut(565,nh+200+10,str);str.Format(200);pDC-TextOut(615,nh+200+10,str);str.Format(255);pDC-TextOut(670,nh+200+10,str);str.Format(直方图均衡化后归一化);pDC-TextOut(505,nh+230+10,str);//绘制X轴刻度for(i=0;i256;i+=25){if((i&1)==0){//10的倍数pDC-MoveTo(i+420,nh+200-2);pDC-LineTo(i+415,nh+200+2);}else{//10的倍数pDC-MoveTo(i+420,nh+200-2);pDC-LineTo(i+420,nh+200+2);}}//绘制X轴箭头pDC-MoveTo(710,nh+200-5);pDC-LineTo(715,nh+200);pDC-LineTo(710,nh+200+5);//绘制y轴箭头pDC-MoveTo(415,nh+20);pDC-LineTo(410,nh+20+5);pDC-MoveTo(415,nh+20);pDC-LineTo(420,nh+20+5);intmax=0;for(i=0;i256;i++)if(m_hist[i]max)max=m_hist[i];for(i=0;i256;i++){pDC-MoveTo(415+i,nh+200);pDC-LineTo(415+i,nh+200-(m_hist[i]*160/max));}}/*************///显示图像(具体的参数见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);}}/////////////////////////////////////////////////////////////////////直方图均衡化及直方图归一化坐标轴赋值程序/////////////////////////////////////////////////////////////////////voidCImageView::OnZhifangtu(){//判断图像是否打开,没打开,则弹出提示框并退出函数if(!m_dib.m_bLoaded){AfxMessageBox(图像还打开,请先打开图像!);return;}//获取图像宽和高及定义成员变量intnw=m_dib.GetDIBWidth();intnh=m_dib.GetDIBHeight();inti,j;int*arr=newint[nw*nh];intn[256]={0};floatp[256]={0.0},c[256]={0.0};BYTE*pdata=m_dib.m_pdata;for(i=0;i256;i++)//初始化直方图数组m_yuantu[i]=0;if(1)//m_dib.m_nImType==24){for(j=0;jnh;j++)for(i=0;inw;i++){BYTEtemp=pdata[j*nw+i];m_yuantu[temp]++;}}m_bHist=true;//直方图归一化计算for(i=0;inh;i++){for(j=0;jnw;j++){n[m_dib.m_pdata[i*nw+j]]++;}}for(i=0;i256;i++){(float)p[i]=(float)n[i]/(float)(nw*nh);}//归一化后累计计算for(i=0;i256;i++){for(j=0;j=i;j++){c[i]+=p[j];}}//找到灰度值最大值最小值intmax=m_dib.m_pdata[0],min=m_dib.m_pdata[0];for(i=0;inh;i++){for(j=0;jnw;j++){if(maxm_dib.m_pdata[i*nw+j]){max=m_dib.m_pdata[i*nw+j];}elseif(minm_dib.m_pdata[i*nw+j]){min=m_dib.m_pdata[i*nw+j];}}}//套公式直方图均衡化计算赋值给arr[]一维数组for(i=0;inh;i++){for(j=0;jnw;j++){arr[i*nw+j]=int(c[m_dib.m_pdata[i*nw+j]]*(max-min)+min+0.5);}}//一维数组arr[]赋值给新图像for(j=0;jnh;j++){for(i=0;inw;i++){m_dib.m_pdata[j*nw+i]=arr[j*nw+i];}}//将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果m_dib.UpdateData();//刷新屏幕Invalidate();for(i=0;i256;i++)//初始化直方图数组m_hist[i]=0;if(1)//m_
本文标题:数字图像处理实验报告-直方图均衡化
链接地址:https://www.777doc.com/doc-5283793 .html