数字图像处理实验报告 直方图均衡化.docx
- 文档编号:6612584
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:12
- 大小:124.66KB
数字图像处理实验报告 直方图均衡化.docx
《数字图像处理实验报告 直方图均衡化.docx》由会员分享,可在线阅读,更多相关《数字图像处理实验报告 直方图均衡化.docx(12页珍藏版)》请在冰点文库上搜索。
数字图像处理实验报告直方图均衡化
课程设计
课程名称数字图像处理
题目名称直方图均衡化
学生学院信息工程学院
专业班级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)
{
CImageDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
if(m_dib.m_bLoaded==true)//判断是否加载图像
{
//获取图像宽和高
intnw=m_dib.GetDIBWidth();
intnh=m_dib.GetDIBHeight();ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
if(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;i<256;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;i<256;i++)
if(m_yuantu[i]>max)
max=m_yuantu[i];
for(i=0;i<256;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;i<256;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;i<256;i++)
if(m_hist[i]>max)
max=m_hist[i];
for(i=0;i<256;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;i<256;i++)//初始化直方图数组
m_yuantu[i]=0;
if
(1)//m_dib.m_nImType==24)
{
for(j=0;j for(i=0;i { BYTEtemp=pdata[j*nw+i]; m_yuantu[temp]++; } } m_bHist=true; //直方图归一化计算 for(i=0;i { for(j=0;j { n[m_dib.m_pdata[i*nw+j]]++; } } for(i=0;i<256;i++) { (float)p[i]=(float)n[i]/(float)(nw*nh); } //归一化后累计计算 for(i=0;i<256;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;i { for(j=0;j { if(max { max=m_dib.m_pdata[i*nw+j]; } elseif(min>m_dib.m_pdata[i*nw+j]) { min=m_dib.m_pdata[i*nw+j]; } } } //套公式直方图均衡化计算赋值给arr[]一维数组 for(i=0;i { for(j=0;j { arr[i*nw+j]=int(c[m_dib.m_pdata[i*nw+j]]*(max-min)+min+0.5); } } //一维数组arr[]赋值给新图像 for(j=0;j for(i=0;i m_dib.m_pdata[j*nw+i]=arr[j*nw+i]; } } //将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果 m_dib.UpdateData(); //刷新屏幕 Invalidate(); for(i=0;i<256;i++)//初始化直方图数组 m_hist[i]=0; if (1)//m_dib.m_nImType==24) { for(j=0;j for(i=0;i { BYTEtemp=pdata[j*nw+i]; m_hist[temp]++; } } m_bHist=true; //TODO: Addyourcommandhandlercodehere } 6、实验结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字图像处理实验报告 直方图均衡化 数字图像 处理 实验 报告 直方图 均衡
![提示](https://static.bingdoc.com/images/bang_tan.gif)