实验名称: 用Excel画直方图(实验一) 指导教师:
实验时数: 4 实验设备:安装了VC++、mathematica、matlab的计算机
实验日期: 20## 年 3 月 20 日 实验地点:第五教学楼北902
学生: 学号:
实验目的:
1.学会利用Excel画直方图的方法;
2.应用这种方法解决一些实际问题。
实验准备:
1. 在开始本实验之前,请回顾教科书的相关内容;
2. 需要一台安装有Windows XP Professional操作系统和完整安装office2003的计算机。
实验内容及要求:
40种刊物的月发行量如下(单位:百册):
5954 5022 14667 6582 6870 1840 2662 4508
1208 3852 618 3008 1268 1978 7963 2048
3077 993 353 14263 1714 11127 6926 2047
714 5923 6006 14267 1697 13876 4001 2280
1223 12579 13588 7315 4538 13304 1615 8612
(1)求该批数据的平均值,最大值,最小值,样本标准差,中位数;
(2)建立该批数据的频数分布表,取组距为1700百册,并应用Excel画频数直方图,频率直方图,单位频率直方图;
(3)由Excel自行确定组距,画出频数直方图。
实验过程:(程序代码及运行结果)
一·
最大值:依次在单元格中输入数据,在A6中输入最大值,选定B6,输入函数MAX,选定区域(A1:H5)然后确定,即可得出。
最小值:在中A7输入最小值,选B7,输入函数MIN,选定区域(A1:H5),然后确定,即可得出最小值。
平均值:在A8中输入平均值,选定B8,输入函数AVERAGE, 选定区域(A1:H5),然后确定,即可得出平均值。
样本标准差:在A9中输入平均值,选定B9,输入函数STDEVA, 选定区域(A1:H5),然后确定,即可得出样本标准差。
中位数:在A10中输入平均值,选定B10,输入函数MEDIAN, 选定区域(A1:H5),然后确定,即可得出中位数。
二. 频数直方图
1.极差:在A11中输入平均值,选定B11,输入函数DATAL, 选定区域(A1:H5),然后确定,即可得出最小值。
2.定组数为10,吧这40 个数据分成10 个小组。
3.有题定组距为1700,然后定组限,吧这40个数据从小到大分成10份,,每等份宽为1700,选定区域(E6:E15),在编辑-填充-序列,步长值输入1700,然后得到分组结果(E6:E15)。
4点击工具-数据分析-直方图,在输入区域选定(A1:H5),接受区域选定(E6:E15),输出区域选定(D17:I32),选定图表输出。
5.双击图中的矩形条,选择重叠比例,分类间距都设为0.
得到如图:
频率直方图:
1.选定B35,在函数中输入=(B18)/40,然后回车,得到的一个频率值,依次得到频率值区域(B35:B44)。
2.点击插入-图表,选定簇形柱形图,数据区域选定(B35:B44),系列产生在-列,网格线取消主要网格线,取消显示图例,即可得到频率直方图。
3.双击矩形条,选择重叠比例,分类间距都设为0。
得到如图:
单位频率直方图:
单位频率直方图就是频率直方图。
三.自行定组距。
1.在F6中输入组距,在G6中输入函数=(B10)/(B12),回车得到1431.4。
2,。定组限,选定G7中输入=MIN(A1:H5),点击编辑-填充-序列,步长值输入1431.4,得到分组结果。
3. 点击工具-数据分析-直方图,在输入区域选定(A1:H5),接受区域选定(G7:G16),输出区域选定(D49:I65),选定图表输出
3.自行设定组距
实验总结(由学生填写): 首次接触用excel画直方图,各方面都很不熟悉,有时到某一步时不知道下一步该怎么办,完全按照图析来操作,与图形结合起来感到很陌生,在一些细节方面有事会有些小问题,一步错步步错,应该尽量熟悉操作步骤,熟悉各图形及方法,一些功能的运用,做到熟能生巧。
课程设计
课程名称 数字图像处理
题目名称 直方图均衡化
学生学院 信息工程学院
专业班级 08级电信2班
学 号 3208002664
学生姓名 陈慕仪
指导教师 曹江中
2011 年 7 月 1 日
设计题目:直方图均衡化
1、直方图的理论基础:
(1)直方图概念:灰度直方图表示图像中每种灰度出现的频率。
(2)直方图的作用: 反映一幅图像的灰度分布特性
(3)直方图的计算:
式中:nk为图像中出现rk级灰度的像素数,n是图像像素总数,而nk/n即为频数。
2、设计目的: 产生一幅灰度级分布具有均匀概率密度的图像,扩展像素取值的动态范围,达到了图象增强的目的。
3、直方图均衡化的效果 :
1)变换后直方图趋向平坦,灰级减少,灰度合并。
2)原始象含有象素数多的几个灰级间隔被拉大了,压缩的只是象素数少的几个灰度级,实际视觉能够接收的信息量大大地增强了,增加了图象的反差。同时,也增加了图象的可视粒度。
4、离散情况下的直方图均衡化的算法:
A、列出原始图像的灰度级
B、统计各灰度级的像素数目
C、计算原始图像直方图各灰度级的频数
D、计算累积分布函数
F、应用以下公式计算映射后的输出图像的灰度级,P为输出图像灰度级的个数,其中INT为取整符号:
G、用的映射关系修改原始图像的灰度级,从而获得直方图近似为均匀分布的输出图像。
3、源程序代码
// cqxhistView.cpp : 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_FILE
static char THIS_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
// 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::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCqxhistView construction/destruction
CCqxhistView::CCqxhistView()
{
// TODO: add construction code here
}
CCqxhistView::~CCqxhistView()
{
}
BOOL CCqxhistView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CCqxhistView drawing
void 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_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);//(410,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");
pDC->TextOut(610, nh+200+10, str);
str.Format("255");
pDC->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);
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);
pDC->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;i<256;i++)
if(m_yuan[i]>max)
max=m_yuan[i];
for(i=0;i<256;i++)
{
pDC->MoveTo(410+i,nh+200);
pDC->LineTo(410+i,nh+200-(m_yuan[i]*160/max));
}
}
if(m_bHist==true)
{
//绘画直方图
CString str;
int nh=m_dib.GetDIBHeight();
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("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);
// 绘制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);
int max=0;
for(i=0;i<256;i++)
if(m_hist[i]>max)
max=m_hist[i];
for(i=0;i<256;i++)
{
pDC->MoveTo(10+i,nh+200);
pDC->LineTo(10+i,nh+200-(m_hist[i]*160/max));
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CCqxhistView printing
BOOL CCqxhistView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CCqxhistView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CCqxhistView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CCqxhistView diagnostics
#ifdef _DEBUG
void CCqxhistView::AssertValid() const
{
CView::AssertValid();
}
void CCqxhistView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CCqxhistDoc* CCqxhistView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCqxhistDoc)));
return (CCqxhistDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CCqxhistView message handlers
void CCqxhistView::OnOpenImage()
{
// TODO: Add your command handler code here
// TODO: Add your command handler code here
static char szFilter[]="BMP文件(*.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) //判断是否加载图像成功
{
AfxMessageBox("图像打不开");
return;
}
for(int i=0;i<256;i++) //初始化直方图数组
{ m_hist[i]=0;
m_yuan[i]=0;
}
m_bHist=false;
}
{
int nw=m_dib.GetDIBWidth();
int nh=m_dib.GetDIBHeight();
for(int j=0;j<nh;j++)
for(int i=0;i<nw;i++)
{
BYTE temp=m_dib.m_pdata[j*nw+i];
m_yuan[temp]++;
}
}
Invalidate(1); //刷新屏幕
}
void CCqxhistView::OnHistImage()
{
// TODO: Add your command 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 count[256]={0};//定义一个数组,用于存放灰度级个数
float p[256];//定义一个数组,用于存放灰度级出现频率
//对图像进行直方图均衡化处理
for(i=0;i<nh;i++)
for(j=0;j<nw;j++)
{
k=m_dib.m_pdata[i*nw+j];//计算灰度级个数
count[k]++;
}
for(k=0;k<256;k++)
p[k]=count[k]/(nw*nh*1.0f);
float c[256]={0};
float sum=0.0;
int ngray[256];//新的灰度级
for(k=0;k<256;k++)//计算累积频率
{
sum+=p[k];
c[k]=sum;
ngray[k]=(int)(255.0*c[k]+0.5);
}
for(i=0;i<nh;i++)
for(j=0;j<nw;j++)
{
k=m_dib.m_pdata[i*nw+j];
m_dib.m_pdata[i*nw+j]=ngray[k];
}
{
int nw=m_dib.GetDIBWidth();
int nh=m_dib.GetDIBHeight();
for(int j=0;j<nh;j++)
for(int i=0;i<nw;i++)
{
BYTE temp=m_dib.m_pdata[j*nw+i];
m_hist[temp]++;
}
}
//将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果
m_dib.UpdateData();
m_bHist=true;
//将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果
m_dib.UpdateData();
//刷新屏幕
Invalidate();
}4、实验结果
C++编程结果:
实验名称用Excel画直方图实验一指导教师实验时数4实验设备安装了VCmathematicamatlab的计算机实验日期20xx年…
概率论与数理统计实验报告学生姓名学生班级学生学号指导教师学年学期1实验报告五23456实验报告六7间的线性关系不显著或不存在线性关…
高等数理统计课程实验摘要本实验报告描述了用最小二成估计算法解决实际问题中参数估计的过程包括引言实验原理实验过程实验结果及分析同时给…
内江师范学院数理统计实验报告编制王凡彬审定牟廉明专业数学与应用数学班级20xx级3班学号姓名数学与信息科学学院20xx年5月实验名…
实验课程数理统计实验地点数学专业实验室时间20xx1130班级姓名学号成绩指导老师太原工业学院理学系实验一描述性统计实验目的熟悉E…
电子31JL21405106杨路生概率论与数理统计实验报告1n个人中至少有两人生日相同的概率是多少通过计算机模拟此结果n个人生日的…
目录目录一实验目的二实验环境三实验内容实验一数据分组一采集的样本数据二组距数列的编制方法三实验结果数据分组数列表四实验结论实验二统…
概率论与数理统计实验报告学生姓名学生班级学生学号指导教师学年学期1实验报告五23456实验报告六7间的线性关系不显著或不存在线性关…
高等数理统计课程实验摘要本实验报告描述了用最小二成估计算法解决实际问题中参数估计的过程包括引言实验原理实验过程实验结果及分析同时给…
内江师范学院数理统计实验报告编制王凡彬审定牟廉明专业数学与应用数学班级20xx级3班学号姓名数学与信息科学学院20xx年5月实验名…