1、数字图像处理实验报告 直方图均衡化课 程 设 计课程名称 数字图像处理 题目名称 直方图均衡化 学生学院 信息工程学院 专业班级 08级电信2班 学 号 3208002664 学生姓名 陈慕仪 指导教师 曹江中 2011 年 7 月 1 日设计题目:直方图均衡化1、直方图的理论基础:(1)直方图概念:灰度直方图表示图像中每种灰度出现的频率。(2)直方图的作用: 反映一幅图像的灰度分布特性(3)直方图的计算:式中:nk为图像中出现rk级灰度的像素数,n是图像像素总数,而nk/n即为频数。2、设计目的: 产生一幅灰度级分布具有均匀概率密度的图像,扩展像素取值的动态范围,达到了图象增强的目的。3、直
2、方图均衡化的效果 : 1)变换后直方图趋向平坦,灰级减少,灰度合并。 2)原始象含有象素数多的几个灰级间隔被拉大了,压缩的只是象素数少的几个灰度级,实际视觉能够接收的信息量大大地增强了,增加了图象的反差。同时,也增加了图象的可视粒度。 4、离散情况下的直方图均衡化的算法:A、列出原始图像的灰度级 B、统计各灰度级的像素数目C、计算原始图像直方图各灰度级的频数D、计算累积分布函数F、应用以下公式计算映射后的输出图像的灰度级,P为输出图像灰度级的个数,其中INT为取整符号:G、用的映射关系修改原始图像的灰度级,从而获得直方图近似为均匀分布的输出图像。3、源程序代码 / cqxhistView.cp
3、p : implementation of the CCqxhistView class#include stdafx.h#include cqxhist.h#include cqxhistDoc.h#include cqxhistView.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CCqxhistViewIMPLEMENT_DYNCREATE(CCqxhistView, CView)BEGIN_MESSAGE_MAP(CCqxhistView, CView
4、) /AFX_MSG_MAP(CCqxhistView) ON_COMMAND(ID_OPEN_IMAGE, OnOpenImage) ON_COMMAND(ID_HIST_IMAGE, OnHistImage) /AFX_MSG_MAP / Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPre
5、view)END_MESSAGE_MAP()/ CCqxhistView construction/destructionCCqxhistView:CCqxhistView() / TODO: add construction code hereCCqxhistView:CCqxhistView()BOOL CCqxhistView:PreCreateWindow(CREATESTRUCT& cs) / TODO: Modify the Window class or styles here by modifying / the CREATESTRUCT cs return CView:Pre
6、CreateWindow(cs);/ CCqxhistView drawingvoid CCqxhistView:OnDraw(CDC* pDC) CCqxhistDoc* 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(); / 显示图像(具体的参数见CDIB类的该函数说明) m
7、_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 nh=m_dib.GetDIBHeight(); int i; / 画坐标轴 / 绘制坐标轴 pDC-MoveTo(410,nh+20); /(410,nh+20 )是直方图的左上角坐标 / 垂直轴 pDC-LineTo(410,nh+200);/(41
8、0,nh+200 )是直方图的左下角坐标 / 水平轴 pDC-LineTo(710,nh+200);/(710,nh+200 )是直方图的右下角坐标 / 写X轴刻度值 str.Format(0); pDC-TextOut(410, nh+200+10, str); str.Format(50); pDC-TextOut(460, nh+200+10, str); str.Format(100); pDC-TextOut(510, nh+200+10, str); str.Format(150); pDC-TextOut(560, nh+200+10, str); str.Format(200)
9、; pDC-TextOut(610, nh+200+10, str); str.Format(255); pDC-TextOut(665, nh+200+10, str); / 绘制X轴刻度 for ( i = 0; i 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(705,nh+200-5); pDC-LineTo(710,nh+200); p
10、DC-LineTo(705,nh+200+5); / 绘制y轴箭头 pDC-MoveTo(410,nh+20); pDC-LineTo(405,nh+20+5); pDC-MoveTo(410,nh+20); pDC-LineTo(415,nh+20+5); int max=0; for(i=0;imax) max=m_yuani; for(i=0;iMoveTo(410+i,nh+200); pDC-LineTo(410+i,nh+200-(m_yuani*160/max); if(m_bHist=true) /绘画直方图 CString str; int nh=m_dib.GetDIBHe
11、ight(); int i; / 画坐标轴 / 绘制坐标轴 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(10
12、0); 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); / 绘制X轴刻度 for ( i = 0; i MoveTo(i + 10, nh+200-2); pDC-LineTo(i + 10, nh+200+2); else / 10的倍数 pDC-MoveTo(i + 1
13、0, 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); int max=0; for(i=0;imax) max=m_histi; for(i=0;iMoveTo(10+i,nh+200); pDC
14、-LineTo(10+i,nh+200-(m_histi*160/max); / CCqxhistView printingBOOL CCqxhistView:OnPreparePrinting(CPrintInfo* pInfo) / default preparation return DoPreparePrinting(pInfo);void CCqxhistView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) / TODO: add extra initialization before printingvoid CCqxh
15、istView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) / TODO: add cleanup after printing/ CCqxhistView diagnostics#ifdef _DEBUGvoid CCqxhistView:AssertValid() const CView:AssertValid();void CCqxhistView:Dump(CDumpContext& dc) const CView:Dump(dc);CCqxhistDoc* CCqxhistView:GetDocument() / non-de
16、bug version is inline ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CCqxhistDoc); return (CCqxhistDoc*)m_pDocument;#endif /_DEBUG/ CCqxhistView message handlersvoid CCqxhistView:OnOpenImage() / TODO: Add your command handler code here / TODO: Add your command handler code here static char szFilter=BMP文件
17、(*.bmp)|*.bmp|; /定义过滤文件的类型 CFileDialog dlg(TRUE,bmp,NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);/定义文件对话框对象 CString filename; int ret=dlg.DoModal(); /运行打开文件对方框 if(ret=IDOK) filename=dlg.GetFileName(); /获取所选择图像的路径 m_dib.LoadFromFile(filename); /加载图像 if(!m_dib.m_bLoaded) /判断是否加载图像成功 AfxMessage
18、Box(图像打不开); return; for(int i=0;i256;i+) /初始化直方图数组 m_histi=0; m_yuani=0; m_bHist=false; int nw=m_dib.GetDIBWidth(); int nh=m_dib.GetDIBHeight(); for(int j=0;jnh;j+) for(int i=0;inw;i+) BYTE temp=m_dib.m_pdataj*nw+i; m_yuantemp+; Invalidate(1); /刷新屏幕void CCqxhistView:OnHistImage() / TODO: Add your co
19、mmand handler code here /功能:实现直方图均衡化 / /判断图像是否打开,没打开,则弹出提示框并退出函数 if(!m_dib.m_bLoaded) AfxMessageBox(图像还打开,请先打开图像!); return; /获取图像宽和高 int nw=m_dib.GetDIBWidth(); int nh=m_dib.GetDIBHeight(); int i,j,k; int count256=0;/定义一个数组,用于存放灰度级个数 float p256;/定义一个数组,用于存放灰度级出现频率 /对图像进行直方图均衡化处理 for(i=0;inh;i+) for(
20、j=0;jnw;j+) k=m_dib.m_pdatai*nw+j;/计算灰度级个数 countk+; for(k=0;k256;k+) pk=countk/(nw*nh*1.0f); float c256=0; float sum=0.0; int ngray256;/新的灰度级 for(k=0;k256;k+)/计算累积频率 sum+=pk; ck=sum; ngrayk=(int)(255.0*ck+0.5); for(i=0;inh;i+) for(j=0;jnw;j+) k=m_dib.m_pdatai*nw+j; m_dib.m_pdatai*nw+j=ngrayk; int nw=m_dib.GetDIBWidth(); int nh=m_dib.GetDIBHeight(); for(int j=0;jnh;j+) for(int i=0;inw;i+) BYTE temp=m_dib.m_pdataj*nw+i; m_histtemp+; /将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果 m_dib.UpdateData(); m_bHist=true; /将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果 m_dib.UpdateData(); /刷新屏幕 Invalidate(); 4、实验结果C+编程结果:
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2