数字图像处理实验三中值滤波和均值滤波实验报告.docx

上传人:b****3 文档编号:11571307 上传时间:2023-06-01 格式:DOCX 页数:32 大小:468.26KB
下载 相关 举报
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第1页
第1页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第2页
第2页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第3页
第3页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第4页
第4页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第5页
第5页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第6页
第6页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第7页
第7页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第8页
第8页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第9页
第9页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第10页
第10页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第11页
第11页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第12页
第12页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第13页
第13页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第14页
第14页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第15页
第15页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第16页
第16页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第17页
第17页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第18页
第18页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第19页
第19页 / 共32页
数字图像处理实验三中值滤波和均值滤波实验报告.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数字图像处理实验三中值滤波和均值滤波实验报告.docx

《数字图像处理实验三中值滤波和均值滤波实验报告.docx》由会员分享,可在线阅读,更多相关《数字图像处理实验三中值滤波和均值滤波实验报告.docx(32页珍藏版)》请在冰点文库上搜索。

数字图像处理实验三中值滤波和均值滤波实验报告.docx

数字图像处理实验三中值滤波和均值滤波实验报告

数字图像处理实验三中值滤波和均值滤波实验报告

数字图像处理实验三

均值滤波、中值滤波的计算机实现

12281166崔雪莹计科1202班

一、实验目的:

1)熟悉均值滤波、中值滤波处理的理论基础;

2)掌握均值滤波、中值滤波的计算机实现方法;

3)学习VC++6。

0的编程方法;

4)验证均值滤波、中值滤波处理理论;

5)观察均值滤波、中值滤波处理的结果。

二、实验的软、硬件平台:

硬件:

微型图像处理系统,包括:

主机,PC机;摄像机;

软件:

操作系统:

WINDOWS2000或WINDOWSXP应用软件:

VC++6.0

三、实验内容:

1)握高级语言编程技术;

2)编制均值滤波、中值滤波处理程序的方法;

3)编译并生成可执行文件;

4)考察处理结果。

四、实验要求:

1)学习VC++确6。

0编程的步骤及流程;

2)编写均值滤波、中值滤波的程序;

3)编译并改错;

4)把该程序嵌入试验二给出的界面中(作适当修改);

5)提交程序及文档;

6)写出本次实验的体会。

五、实验结果截图

实验均值滤波采用的是3X3的方块,取周围的像素点取得其均值代替原像素点。

边缘像素的处理方法是复制边缘的像素点,增加一个边框,计算里面的像素值得均值滤波。

 

六、实验体会

本次实验在前一次的实验基础上增加均值滤波和中值滤波,对于椒盐噪声的处理,发现中值滤波的效果更为好一点,而均值滤波是的整个图像变得模糊了一点,效果差异较大。

本次实验更加增加了对数字图像处理的了解与学习。

七、实验程序代码注释及分析

//HistDemoADlg.h:

头文件

//

#include"ImageWnd.h"

#pragmaonce

 

//CHistDemoADlg对话框

classCHistDemoADlg:

publicCDialogEx

{

//构造

public:

CHistDemoADlg(CWnd*pParent=NULL);//标准构造函数

intnWidth;

intnHeight;

intnLen;

intnByteWidth;

BYTE*lpBackup;

BYTE*lpBitmap;

BYTE*lpBits;

CStringFileName;

CImageWndsource,dest;

//对话框数据

enum{IDD=IDD_HISTDEMOA_DIALOG};

protected:

virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持

 

//实现

protected:

HICONm_hIcon;

//生成的消息映射函数

virtualBOOLOnInitDialog();

afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);

afx_msgvoidOnPaint();

afx_msgHCURSOROnQueryDragIcon();

DECLARE_MESSAGE_MAP()

public:

voidLoadBitmap(void);

afx_msgvoidOnOpen();

afx_msgvoidOnHist();

voidHistogramEq(void);

voidNoColor(void);

voidHistogramEq1(intnWidth,intnHeight,BYTE*lpInput,BYTE*lpOutput);

voidMeanFilter(intnWidth,intnHeight,BYTE*lpInput,BYTE*lpOutput);

voidMedianFilter(intnWidth,intnHeight,BYTE*lpInput,BYTE*lpOutput);

afx_msgvoidOnBnClickedClose();

afx_msgvoidOnBnClickedMeanfilter();

afx_msgvoidOnBnClickedMedianfilter();

};

 

HistDemoADlg.cpp对HistDemoADlg.h进行具体的实现,OnOpen()函数响应ID为IDC_OPEN的按钮事件,而且会调取文件选择对话框,选取文件之后,会显示在原始图像区域显示对应的位图图像,OnHist()函数会响应ID为IDC_HIST的按钮事件,调用HistogramEq()进行直方图均衡化的处理,HistogramEq()会调用HistogramEq1()进行直方图均衡化的处理,并用dst.setImage()显示处理之后的图像,以及NoColor()函数,对原始图像转化为灰度图像之后再显示。

 

//HistDemoADlg.cpp:

实现文件

//

#include"stdafx.h"

#include"HistDemoA.h"

#include"HistDemoADlg.h"

#include"afxdialogex.h"

#ifdef_DEBUG

#definenewDEBUG_NEW

#endif

#definePoint(x,y)lpPoints[(x)+(y)*nWidth]

#definePoint1(x,y)lpPoints1[(x)+(y)*nWidth]

 

//用于应用程序“关于”菜单项的CAboutDlg对话框

classCAboutDlg:

publicCDialogEx

{

public:

CAboutDlg();

//对话框数据

enum{IDD=IDD_ABOUTBOX};

protected:

virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持

//实现

protected:

DECLARE_MESSAGE_MAP()

};

CAboutDlg:

:

CAboutDlg():

CDialogEx(CAboutDlg:

:

IDD)

{

}

voidCAboutDlg:

:

DoDataExchange(CDataExchange*pDX)

{

CDialogEx:

:

DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CAboutDlg,CDialogEx)

END_MESSAGE_MAP()

 

//CHistDemoADlg对话框

 

CHistDemoADlg:

:

CHistDemoADlg(CWnd*pParent/*=NULL*/)

:

CDialogEx(CHistDemoADlg:

:

IDD,pParent)

{

m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);

lpBitmap=0;

lpBackup=0;

}

voidCHistDemoADlg:

:

DoDataExchange(CDataExchange*pDX)

{

CDialogEx:

:

DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CHistDemoADlg,CDialogEx)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_OPEN,&CHistDemoADlg:

:

OnOpen)

ON_BN_CLICKED(IDC_HIST,&CHistDemoADlg:

:

OnHist)

ON_BN_CLICKED(IDCLOSE,&CHistDemoADlg:

:

OnBnClickedClose)

ON_BN_CLICKED(IDC_MEANFILTER,&CHistDemoADlg:

:

OnBnClickedMeanfilter)

ON_BN_CLICKED(IDC_MEDIANFILTER,&CHistDemoADlg:

:

OnBnClickedMedianfilter)

END_MESSAGE_MAP()

 

//CHistDemoADlg消息处理程序

BOOLCHistDemoADlg:

:

OnInitDialog()

{

CDialogEx:

:

OnInitDialog();

//将“关于...”菜单项添加到系统菜单中。

//IDM_ABOUTBOX必须在系统命令范围内。

ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX<0xF000);

CMenu*pSysMenu=GetSystemMenu(FALSE);

if(pSysMenu!

=NULL)

{

BOOLbNameValid;

CStringstrAboutMenu;

bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX);

ASSERT(bNameValid);

if(!

strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);

}

}

//设置此对话框的图标。

当应用程序主窗口不是对话框时,框架将自动

//执行此操作

SetIcon(m_hIcon,TRUE);//设置大图标

SetIcon(m_hIcon,FALSE);//设置小图标

//TODO:

在此添加额外的初始化代码

source.Create(0,L"Source",WS_CHILD|WS_VISIBLE,CRect(40,40,360,280),this,10000);

dest.Create(0,L"Destination",WS_CHILD|WS_VISIBLE,CRect(400,40,720,280),this,10001);

returnTRUE;//除非将焦点设置到控件,否则返回TRUE

}

voidCHistDemoADlg:

:

OnSysCommand(UINTnID,LPARAMlParam)

{

if((nID&0xFFF0)==IDM_ABOUTBOX)

{

CAboutDlgdlgAbout;

dlgAbout.DoModal();

}

else

{

CDialogEx:

:

OnSysCommand(nID,lParam);

}

}

//如果向对话框添加最小化按钮,则需要下面的代码

//来绘制该图标。

对于使用文档/视图模型的MFC应用程序,

//这将由框架自动完成。

voidCHistDemoADlg:

:

OnPaint()

{

if(IsIconic())

{

CPaintDCdc(this);//用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND,reinterpret_cast(dc.GetSafeHdc()),0);

//使图标在工作区矩形中居中

intcxIcon=GetSystemMetrics(SM_CXICON);

intcyIcon=GetSystemMetrics(SM_CYICON);

CRectrect;

GetClientRect(&rect);

intx=(rect.Width()-cxIcon+1)/2;

inty=(rect.Height()-cyIcon+1)/2;

//绘制图标

dc.DrawIcon(x,y,m_hIcon);

}

else

{

CDialogEx:

:

OnPaint();

}

}

//当用户拖动最小化窗口时系统调用此函数取得光标

//显示。

HCURSORCHistDemoADlg:

:

OnQueryDragIcon()

{

returnstatic_cast(m_hIcon);

}

voidCHistDemoADlg:

:

LoadBitmap()

{

//位图文件:

BITMAPFILEHEADER+BITMAPINFOHEADER+有效信息部分

BITMAPINFOHEADER*pInfo;//位图文件的头部信息指针pInfo

pInfo=(BITMAPINFOHEADER*)(lpBitmap+sizeof(BITMAPFILEHEADER));//pInfo指向位图文件的头部信息

nWidth=pInfo->biWidth;//图片宽度

nByteWidth=nWidth*3;//字节宽度

if(nByteWidth%4)nByteWidth+=4-(nByteWidth%4);//使字节宽度为4的整数倍

nHeight=pInfo->biHeight;//图片高度

if(pInfo->biBitCount!

=24)//位图的位深度不为24

{

if(pInfo->biBitCount!

=8)//位深度不为8

{

AfxMessageBox(L"无效位图");

deletelpBitmap;

lpBitmap=0;

return;

}

//位深度为8

unsignedintPaletteSize=1<biBitCount;//左移8位,PaletteSize调色板尺寸

if(pInfo->biClrUsed!

=0&&pInfo->biClrUsedbiClrUsed;//biClrUsed位图实际使用的颜色表中的颜色数

lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);//lpBits指向有效信息部分

RGBQUAD*pPalette=(RGBQUAD*)lpBits;//颜色表部分

/*

typedefstructtagRGBQUAD{

BYTErgbBlue;

BYTErgbGreen;

BYTErgbRed;

BYTErgbReserved;

}RGBQUAD;

*/

lpBits+=sizeof(RGBQUAD)*PaletteSize;//lpBits指向图像有效信息部分

nLen=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nByteWidth*nHeight;//整个位图文件的长度

BYTE*lpTemp=lpBitmap;

lpBitmap=newBYTE[nLen];

BITMAPFILEHEADERbmh;

BITMAPINFOHEADERbmi;

bmh.bfType='B'+'M'*256;

bmh.bfSize=nLen;

bmh.bfReserved1=0;

bmh.bfReserved2=0;

bmh.bfOffBits=54;

bmi.biSize=sizeof(BITMAPINFOHEADER);

bmi.biWidth=nWidth;

bmi.biHeight=nHeight;

bmi.biPlanes=1;

bmi.biBitCount=24;

bmi.biCompression=BI_RGB;

bmi.biSizeImage=0;

bmi.biXPelsPerMeter=0;

bmi.biYPelsPerMeter=0;

bmi.biClrUsed=0;

bmi.biClrImportant=0;

intnBWidth=pInfo->biWidth;

if(nBWidth%4)nBWidth+=4-(nBWidth%4);

memset(lpBitmap,0,nLen);

memcpy(lpBitmap,&bmh,sizeof(BITMAPFILEHEADER));//位图文件头部

memcpy(lpBitmap+sizeof(BITMAPFILEHEADER),&bmi,sizeof(BITMAPINFOHEADER));//位图信息头部

BYTE*lpBits2=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);//位图图像信息部分

intx,y,p1,p2,Palette;

for(y=0;y

{

for(x=0;x

{

p1=y*nBWidth+x;

p2=y*nByteWidth+x*3;

if(lpBits[p1]

elsePalette=0;

lpBits2[p2]=pPalette[Palette].rgbBlue;

lpBits2[p2+1]=pPalette[Palette].rgbGreen;

lpBits2[p2+2]=pPalette[Palette].rgbRed;

}

}

deletelpTemp;

}

lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

if(lpBackup)deletelpBackup;

lpBackup=newBYTE[nLen];

memcpy(lpBackup,lpBitmap,nLen);

}

 

voidCHistDemoADlg:

:

OnOpen()//点击打开文件之后,对应的事件处理函数

{

//TODO:

在此添加控件通知处理程序代码

CFileFile;

CFileDialogdlg(TRUE,0,0,OFN_HIDEREADONLY,L"位图文件|*.bmp|所有文件|*.*||",this);//新建文件选择对话框

if(dlg.DoModal()==IDOK)

{

FileName=dlg.GetPathName();//得到文件的路径

if(!

File.Open(FileName,CFile:

:

modeRead))return;//以只读方式打开文件

//TODO:

addloadingcodehere

if(lpBitmap)deletelpBitmap;//保证lpBitmap为空

nLen=(int)File.GetLength();//得到文件的长度

lpBitmap=newBYTE[nLen];//为lpBitmap分配空间

File.Read(lpBitmap,nLen);//将文件的内容读入到lpBitmap所指向的内存区域

LoadBitmap();//调用LoadBitmap(),加载位图图像

if(lpBitmap)source.SetImage(nWidth,nHeight,lpBits);

}

}

 

voidCHistDemoADlg:

:

OnHist()

{

//TODO:

在此添加控件通知处理程序代码

HistogramEq();

}

voidGetPoints(intnWidth,intnHeight,BYTE*lpBits,BYTE*lpPoints)

{

intx,y,p;

intnByteWidth=nWidth*3;

if(nByteWidth%4)nByteWidth+=4-(nByteWidth%4);

for(y=0;y

{

for(x=0;x

{

p=x*3+y*nByteWidth;

lpPoints[x+y*nWidth]=(BYTE)(0.299*(float)lpBits[p+2]+0.587*(float)lpBits[p+1]+0.114*(float)lpBits[p]+0.1);//三种颜色的比例计算对应点的颜色值,并且强制转换成BYTE

}

}

}

voidPutPoints(intnWidth,intnHeight,BYTE*lpBits,BYTE*lpPoints)//逐个对lpBits进行赋值

{

intnByteWidth=nWidth*3;

if(nByteWidth%4)nByteWidth+=4-(nByteWidth%4);

intx,y,p,p1;

for(y=0;y

{

for(x=0;x

{

p=x*3+y*nByteWidth;

p1=x+y*nWidth;

lpBits[p]=lpPoints[p1];

lpBits[p+1]=lpPoints[p1];

lpBits[p+2]=lpPoints[p1];

}

}

}

voidCHistDemoADlg:

:

HistogramEq(void)

{

if(lpBitmap==0)return;

BYTE*lpOutput=newBYTE[nByteWidth*nHeight];

HistogramEq1(nWidth,nHeight,lpBits,lpOutput);

dest.SetImage(nWidth,nHeight,lpOutput);//在直方图均衡化的区域显示结果

deletelpOutput;

NoColor();//将原始图像转换成灰度图像

}

voidCHistDemoADlg:

:

NoColor()

{

if(lpBitmap==0)return;

intx,y,p;

BYTEPoint;

for(y=0;y

{

for(x=0;x

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2