实用文库汇编之数字图像处理实验三中值滤波和均值滤波实验报告文档格式.docx
- 文档编号:22177913
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:28
- 大小:390.56KB
实用文库汇编之数字图像处理实验三中值滤波和均值滤波实验报告文档格式.docx
《实用文库汇编之数字图像处理实验三中值滤波和均值滤波实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《实用文库汇编之数字图像处理实验三中值滤波和均值滤波实验报告文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
实验均值滤波采用的是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()
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:
实现文件
作者:
座殿角
stdafx.h"
HistDemoA.h"
HistDemoADlg.h"
afxdialogex.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
#definePoint(x,y)lpPoints[(x)+(y)*nWidth]
#definePoint1(x,y)lpPoints1[(x)+(y)*nWidth]
//用于应用程序“关于”菜单项的CAboutDlg对话框
classCAboutDlg:
CAboutDlg();
enum{IDD=IDD_ABOUTBOX};
CAboutDlg:
:
CAboutDlg():
CDialogEx(CAboutDlg:
IDD)
}
voidCAboutDlg:
DoDataExchange(CDataExchange*pDX)
CDialogEx:
DoDataExchange(pDX);
BEGIN_MESSAGE_MAP(CAboutDlg,CDialogEx)
END_MESSAGE_MAP()
CHistDemoADlg:
CHistDemoADlg(CWnd*pParent/*=NULL*/)
:
CDialogEx(CHistDemoADlg:
IDD,pParent)
m_hIcon=AfxGetApp()->
LoadIcon(IDR_MAINFRAME);
lpBitmap=0;
lpBackup=0;
voidCHistDemoADlg:
BEGIN_MESSAGE_MAP(CHistDemoADlg,CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_OPEN,&
OnOpen)
ON_BN_CLICKED(IDC_HIST,&
OnHist)
ON_BN_CLICKED(IDCLOSE,&
OnBnClickedClose)
ON_BN_CLICKED(IDC_MEANFILTER,&
OnBnClickedMeanfilter)
ON_BN_CLICKED(IDC_MEDIANFILTER,&
OnBnClickedMedianfilter)
//CHistDemoADlg消息处理程序
BOOLCHistDemoADlg:
OnInitDialog()
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);
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
OnSysCommand(UINTnID,LPARAMlParam)
if((nID&
0xFFF0)==IDM_ABOUTBOX)
CAboutDlgdlgAbout;
dlgAbout.DoModal();
else
CDialogEx:
OnSysCommand(nID,lParam);
//如果向对话框添加最小化按钮,则需要下面的代码
//来绘制该图标。
对于使用文档/视图模型的MFC应用程序,
//这将由框架自动完成。
OnPaint()
if(IsIconic())
CPaintDCdc(this);
//用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND,reinterpret_cast<
WPARAM>
(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);
OnPaint();
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSORCHistDemoADlg:
OnQueryDragIcon()
returnstatic_cast<
HCURSOR>
(m_hIcon);
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->
=8)//位深度不为8
AfxMessageBox(L"
无效位图"
);
deletelpBitmap;
lpBitmap=0;
return;
//位深度为8
unsignedintPaletteSize=1<
<
pInfo->
biBitCount;
//左移8位,PaletteSize调色板尺寸
biClrUsed!
=0&
&
pInfo->
biClrUsed<
PaletteSize)PaletteSize=pInfo->
biClrUsed;
//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->
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<
nHeight;
y++)
for(x=0;
x<
nWidth;
x++)
{
p1=y*nBWidth+x;
p2=y*nByteWidth+x*3;
if(lpBits[p1]<
PaletteSize)Palette=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);
OnOpen()//点击打开文件之后,对应的事件处理函数
在此添加控件通知处理程序代码
CFileFile;
CFileDialogdlg(TRUE,0,0,OFN_HIDEREADONLY,L"
位图文件|*.bmp|所有文件|*.*||"
this);
//新建文件选择对话框
if(dlg.DoModal()==IDOK)
FileName=dlg.GetPathName();
//得到文件的路径
File.Open(FileName,CFile:
modeRead))return;
//以只读方式打开文件
//TODO:
addloadingcodehere
if(lpBitmap)deletelpBitmap;
//保证lpBitmap为空
nLen=(int)File.GetLength();
//得到文件的长度
//为lpBitmap分配空间
File.Read(lpBitmap,nLen);
//将文件的内容读入到lpBitmap所指向的内存区域
LoadBitmap();
//调用LoadBitmap(),加载位图图像
if(lpBitmap)source.SetImage(nWidth,nHeight,lpBits);
OnHist()
HistogramEq();
voidGetPoints(intnWidth,intnHeight,BYTE*lpBits,BYTE*lpPoints)
intx,y,p;
intnByteWidth=nWidth*3;
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进行赋值
intx,y,p,p1;
p1=x+y*nWidth;
lpBits[p]=lpPoints[p1];
lpBits[p+1]=lpPoints[p1];
lpBits[p+2]=lpPoints[p1];
HistogramEq(void)
if(lpBitmap==0)return;
BYTE*lpOutput=newBYTE[nByteWidth*nHeight];
HistogramEq1(nWidth,nHeight,lpBits,lpOutput);
dest.SetImag
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实用 文库 汇编 数字图像 处理 实验 中值 滤波 均值 报告