数字图像处理实验报告 直方图均衡化Word格式文档下载.docx
- 文档编号:4417755
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:15
- 大小:261.15KB
数字图像处理实验报告 直方图均衡化Word格式文档下载.docx
《数字图像处理实验报告 直方图均衡化Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数字图像处理实验报告 直方图均衡化Word格式文档下载.docx(15页珍藏版)》请在冰点文库上搜索。
4、离散情况下的直方图均衡化的算法:
A、列出原始图像的灰度级
B、统计各灰度级的像素数目
C、计算原始图像直方图各灰度级的频数
D、计算累积分布函数
F、应用以下公式计算映射后的输出图像的灰度级,P为输出图像灰度级的个数,其中INT为取整符号:
G、用的映射关系修改原始图像的灰度级,从而获得直方图近似为均匀分布的输出图像。
3、源程序代码
//cqxhistView.cpp:
implementationoftheCCqxhistViewclass
#include"
stdafx.h"
cqxhist.h"
cqxhistDoc.h"
cqxhistView.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CCqxhistView
IMPLEMENT_DYNCREATE(CCqxhistView,CView)
BEGIN_MESSAGE_MAP(CCqxhistView,CView)
//{{AFX_MSG_MAP(CCqxhistView)
ON_COMMAND(ID_OPEN_IMAGE,OnOpenImage)
ON_COMMAND(ID_HIST_IMAGE,OnHistImage)
//}}AFX_MSG_MAP
//Standardprintingcommands
ON_COMMAND(ID_FILE_PRINT,CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,CView:
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView:
OnFilePrintPreview)
END_MESSAGE_MAP()
//CCqxhistViewconstruction/destruction
CCqxhistView:
CCqxhistView()
{
//TODO:
addconstructioncodehere
}
~CCqxhistView()
BOOLCCqxhistView:
PreCreateWindow(CREATESTRUCT&
cs)
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnCView:
PreCreateWindow(cs);
//CCqxhistViewdrawing
voidCCqxhistView:
OnDraw(CDC*pDC)
CCqxhistDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
adddrawcodefornativedatahere
if(m_dib.m_bLoaded==true)//判断是否加载图像
{
//获取图像宽和高
intnw=m_dib.GetDIBWidth();
intnh=m_dib.GetDIBHeight();
//显示图像(具体的参数见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);
}
if(m_bHist==true)
//绘制原图像的直方图
CStringstr;
inti;
//画坐标轴
//绘制坐标轴
pDC->
MoveTo(410,nh+20);
//(410,nh+20)是直方图的左上角坐标
//垂直轴
LineTo(410,nh+200);
//(410,nh+200)是直方图的左下角坐标
//水平轴
LineTo(710,nh+200);
//(710,nh+200)是直方图的右下角坐标
//写X轴刻度值
str.Format("
0"
);
TextOut(410,nh+200+10,str);
50"
TextOut(460,nh+200+10,str);
100"
TextOut(510,nh+200+10,str);
150"
TextOut(560,nh+200+10,str);
200"
TextOut(610,nh+200+10,str);
255"
TextOut(665,nh+200+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(705,nh+200-5);
LineTo(705,nh+200+5);
//绘制y轴箭头
LineTo(405,nh+20+5);
LineTo(415,nh+20+5);
intmax=0;
for(i=0;
i<
256;
i++)
if(m_yuan[i]>
max)
max=m_yuan[i];
pDC->
MoveTo(410+i,nh+200);
LineTo(410+i,nh+200-(m_yuan[i]*160/max));
if(m_bHist==true)
//绘画直方图
MoveTo(10,nh+20);
//(10,nh+20)是直方图的左上角坐标
LineTo(10,nh+200);
//(10,nh+200)是直方图的左下角坐标
LineTo(310,nh+200);
//(310,nh+200)是直方图的右下角坐标
TextOut(10,nh+200+10,str);
TextOut(60,nh+200+10,str);
TextOut(110,nh+200+10,str);
TextOut(160,nh+200+10,str);
TextOut(210,nh+200+10,str);
TextOut(265,nh+200+10,str);
MoveTo(305,nh+200-5);
LineTo(305,nh+200+5);
LineTo(5,nh+20+5);
LineTo(15,nh+20+5);
if(m_hist[i]>
max=m_hist[i];
MoveTo(10+i,nh+200);
LineTo(10+i,nh+200-(m_hist[i]*160/max));
//CCqxhistViewprinting
OnPreparePrinting(CPrintInfo*pInfo)
//defaultpreparation
returnDoPreparePrinting(pInfo);
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
addextrainitializationbeforeprinting
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
addcleanupafterprinting
//CCqxhistViewdiagnostics
AssertValid()const
CView:
AssertValid();
Dump(CDumpContext&
dc)const
Dump(dc);
CCqxhistDoc*CCqxhistView:
GetDocument()//non-debugversionisinline
ASSERT(m_pDocument->
IsKindOf(RUNTIME_CLASS(CCqxhistDoc)));
return(CCqxhistDoc*)m_pDocument;
#endif//_DEBUG
//CCqxhistViewmessagehandlers
OnOpenImage()
Addyourcommandhandlercodehere
staticcharszFilter[]="
BMP文件(*.bmp)|*.bmp||"
;
//定义过滤文件的类型
CFileDialogdlg(TRUE,"
bmp"
NULL,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);
//定义文件对话框对象
CStringfilename;
intret=dlg.DoModal();
//运行打开文件对方框
if(ret==IDOK)
filename=dlg.GetFileName();
//获取所选择图像的路径
m_dib.LoadFromFile(filename);
//加载图像
if(!
m_dib.m_bLoaded)//判断是否加载图像成功
AfxMessageBox("
图像打不开"
return;
for(inti=0;
i++)//初始化直方图数组
{m_hist[i]=0;
m_yuan[i]=0;
m_bHist=false;
intnw=m_dib.GetDIBWidth();
intnh=m_dib.GetDIBHeight();
for(intj=0;
j<
nh;
j++)
for(inti=0;
nw;
{
BYTEtemp=m_dib.m_pdata[j*nw+i];
m_yuan[temp]++;
}
Invalidate
(1);
//刷新屏幕
OnHistImage()
//功能:
实现直方图均衡化
//////////////////////////
//判断图像是否打开,没打开,则弹出提示框并退出函数
if(!
m_dib.m_bLoaded)
AfxMessageBox("
图像还打开,请先打开图像!
"
return;
//获取图像宽和高
intnw=m_dib.GetDIBWidth();
inti,j,k;
intcount[256]={0};
//定义一个数组,用于存放灰度级个数
floatp[256];
//定义一个数组,用于存放灰度级出现频率
//对图像进行直方图均衡化处理
for(i=0;
for(j=0;
k=m_dib.m_pdata[i*nw+j];
//计算灰度级个数
count[k]++;
for(k=0;
k<
k++)
p[k]=count[k]/(nw*nh*1.0f);
floatc[256]={0};
floatsum=0.0;
intngray[256];
//新的灰度级
for(k=0;
k++)//计算累积频率
sum+=p[k];
c[k]=sum;
ngray[k]=(int)(255.0*c[k]+0.5);
m_dib.m_pdata[i*nw+j]=ngray[k];
m_hist[temp]++;
//将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果
m_dib.UpdateData();
m_bHist=true;
Invalidate();
}4、实验结果
C++编程结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字图像处理实验报告 直方图均衡化 数字图像 处理 实验 报告 直方图 均衡