数理统计实验报告————直方图

实验名称:  Excel画直方图(实验一)            指导教师:       

实验时数:    4         实验设备:安装了VC++mathematicamatlab的计算机

实验日期:        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++编程结果:

相关推荐