数字图像处理实验报告 直方图均衡化Word文档格式.docx
《数字图像处理实验报告 直方图均衡化Word文档格式.docx》由会员分享,可在线阅读,更多相关《数字图像处理实验报告 直方图均衡化Word文档格式.docx(12页珍藏版)》请在冰点文库上搜索。
产生一幅灰度级分布具有均匀概率密度的图像,扩展像素取值的动态范围,达到了图象增强的目的。
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();
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;
inti;
//绘制坐标轴
pDC->
MoveTo(10,nh+20);
//(10,nh+20)是直方图的左上角坐标
//垂直轴
LineTo(10,nh+200);
//(10,nh+200)是直方图的左下角坐标
//水平轴
LineTo(310,nh+200);
//(310,nh+200)是直方图的右下角坐标
//写X轴刻度值
str.Format("
0"
);
TextOut(10,nh+200+10,str);
50"
TextOut(60,nh+200+10,str);
100"
TextOut(110,nh+200+10,str);
150"
TextOut(160,nh+200+10,str);
200"
TextOut(210,nh+200+10,str);
255"
TextOut(265,nh+200+10,str);
原图直方图归一化"
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);
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);
intmax=0;
for(i=0;
i<
256;
i++)
if(m_yuantu[i]>
max)
max=m_yuantu[i];
pDC->
MoveTo(10+i,nh+200);
LineTo(10+i,nh+200-(m_yuantu[i]*160/max));
/*********
*********/
//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,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_hist[i]>
max=m_hist[i];
MoveTo(415+i,nh+200);
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);
}
/////////////////////////////////////////////////////////////////////
直方图均衡化及直方图归一化坐标轴赋值程序/////////////////////////////////////////////////////////////////////
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++)//初始化直方图数组
m_yuantu[i]=0;
if
(1)//m_dib.m_nImType==24)
{
for(j=0;
j<
nh;
j++)
for(i=0;
nw;
BYTEtemp=pdata[j*nw+i];
m_yuantu[temp]++;
m_bHist=true;
//直方图归一化计算
i++)
{
for(j=0;
j++)
n[m_dib.m_pdata[i*nw+j]]++;
}
(float)p[i]=(float)n[i]/(float)(nw*nh);
//归一化后累计计算
for(i=0;
=i;
c[i]+=p[j];
}
//找到灰度值最大值最小值
intmax=m_dib.m_pdata[0],min=m_dib.m_pdata[0];
if(max<
m_dib.m_pdata[i*nw+j])
max=m_dib.m_pdata[i*nw+j];
elseif(min>
min=m_dib.m_pdata[i*nw+j];
//套公式直方图均衡化计算赋值给arr[]一维数组
arr[i*nw+j]=int(c[m_dib.m_pdata[i*nw+j]]*(max-min)+min+0.5);
//一维数组arr[]赋值给新图像
for(j=0;
j++){
i++){
m_dib.m_pdata[j*nw+i]=arr[j*nw+i];
//将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果
m_dib.UpdateData();
//刷新屏幕
Invalidate();
m_hist[i]=0;
m_hist[temp]++;
Addyourcommandhandlercodehere
6、实验结果