数字图像处理实验三中值滤波和均值滤波实验报告材料Word下载.docx
《数字图像处理实验三中值滤波和均值滤波实验报告材料Word下载.docx》由会员分享,可在线阅读,更多相关《数字图像处理实验三中值滤波和均值滤波实验报告材料Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
;
//标准构造函数
intnWidth;
intnHeight;
intnLen;
intnByteWidth;
BYTE*lpBackup;
BYTE*lpBitmap;
BYTE*lpBits;
CStringFileName;
CImageWndsource,dest;
//对话框数据
enum{IDD=IDD_HISTDEMOA_DIALOG};
protected:
virtualvoidDoDataExchange<
CDataExchange*pDX>
//DDX/DDV支持
//实现
HICONm_hIcon;
//生成的消息映射函数
virtualBOOLOnInitDialog<
>
afx_msgvoidOnSysmand<
UINTnID,LPARAMlParam>
afx_msgvoidOnPaint<
afx_msgHCURSOROnQueryDragIcon<
DECLARE_MESSAGE_MAP<
voidLoadBitmap<
void>
afx_msgvoidOnOpen<
afx_msgvoidOnHist<
voidHistogramEq<
voidNoColor<
voidHistogramEq1<
intnWidth,intnHeight,BYTE*lpInput,BYTE*lpOutput>
voidMeanFilter<
voidMedianFilter<
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<
lpPoints1[<
//用于应用程序"
关于〞菜单项的CAboutDlg对话框
classCAboutDlg:
CAboutDlg<
enum{IDD=IDD_ABOUTBOX};
//DDX/DDV支持
CAboutDlg:
:
:
CDialogEx<
IDD>
}
voidCAboutDlg:
DoDataExchange<
CDialogEx:
pDX>
BEGIN_MESSAGE_MAP<
CAboutDlg,CDialogEx>
END_MESSAGE_MAP<
CHistDemoADlg:
CWnd*pParent/*=NULL*/>
IDD,pParent>
m_hIcon=AfxGetApp<
->
LoadIcon<
IDR_MAINFRAME>
lpBitmap=0;
lpBackup=0;
voidCHistDemoADlg:
CHistDemoADlg,CDialogEx>
ON_WM_SYSMAND<
ON_WM_PAINT<
ON_WM_QUERYDRAGICON<
ON_BN_CLICKED<
IDC_OPEN,&
OnOpen>
IDC_HIST,&
OnHist>
IDCLOSE,&
OnBnClickedClose>
IDC_MEANFILTER,&
OnBnClickedMeanfilter>
IDC_MEDIANFILTER,&
OnBnClickedMedianfilter>
//CHistDemoADlg消息处理程序
BOOLCHistDemoADlg:
OnInitDialog<
//将"
关于...〞菜单项添加到系统菜单中.
//IDM_ABOUTBOX必须在系统命令X围内.
ASSERT<
<
IDM_ABOUTBOX&
0xFFF0>
==IDM_ABOUTBOX>
IDM_ABOUTBOX<
0xF000>
CMenu*pSysMenu=GetSystemMenu<
FALSE>
if<
pSysMenu!
=NULL>
BOOLbNameValid;
CStringstrAboutMenu;
bNameValid=strAboutMenu.LoadString<
IDS_ABOUTBOX>
bNameValid>
!
strAboutMenu.IsEmpty<
pSysMenu->
AppendMenu<
MF_SEPARATOR>
MF_STRING,IDM_ABOUTBOX,strAboutMenu>
//设置此对话框的图标.当应用程序主窗口不是对话框时,框架将自动
//执行此操作
SetIcon<
m_hIcon,TRUE>
//设置大图标
m_hIcon,FALSE>
//设置小图标
//TODO:
在此添加额外的初始化代码
source.Create<
0,L"
Source"
WS_CHILD|WS_VISIBLE,CRect<
40,40,360,280>
this,10000>
dest.Create<
Destination"
400,40,720,280>
this,10001>
returnTRUE;
//除非将焦点设置到控件,否如此返回TRUE
OnSysmand<
nID&
CAboutDlgdlgAbout;
dlgAbout.DoModal<
else
nID,lParam>
//如果向对话框添加最小化按钮,如此需要下面的代码
//来绘制该图标.对于使用文档/视图模型的MFC应用程序,
//这将由框架自动完成.
OnPaint<
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>
//绘制图标
dc.DrawIcon<
x,y,m_hIcon>
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示.
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;
//字节宽度
nByteWidth%4>
nByteWidth+=4-<
//使字节宽度为4的整数倍
nHeight=pInfo->
biHeight;
//图片高度
pInfo->
biBitCount!
=24>
//位图的位深度不为24
=8>
//位深度不为8
AfxMessageBox<
L"
无效位图"
deletelpBitmap;
lpBitmap=0;
return;
//位深度为8
unsignedintPaletteSize=1<
biBitCount;
//左移8位,PaletteSize调色板尺寸
biClrUsed!
=0&
pInfo->
biClrUsed<
PaletteSize>
PaletteSize=pInfo->
biClrUsed;
//biClrUsed位图实际使用的颜色表中的颜色数
lpBits=lpBitmap+sizeof<
+sizeof<
BITMAPINFOHEADER>
//lpBits指向有效信息局部
RGBQUAD*pPalette=<
RGBQUAD*>
lpBits;
//颜色表局部
/*
typedefstructtagRGBQUAD{
BYTErgbBlue;
BYTErgbGreen;
BYTErgbRed;
BYTErgbReserved;
}RGBQUAD;
*/
lpBits+=sizeof<
RGBQUAD>
*PaletteSize;
//lpBits指向图像有效信息局部
nLen=sizeof<
+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<
bmi.biWidth=nWidth;
bmi.biHeight=nHeight;
bmi.biPlanes=1;
bmi.biBitCount=24;
bmi.bipression=BI_RGB;
bmi.biSizeImage=0;
bmi.biXPelsPerMeter=0;
bmi.biYPelsPerMeter=0;
bmi.biClrUsed=0;
bmi.biClrImportant=0;
intnBWidth=pInfo->
nBWidth%4>
nBWidth+=4-<
memset<
lpBitmap,0,nLen>
memcpy<
lpBitmap,&
bmh,sizeof<
//位图文件头部
&
bmi,sizeof<
//位图信息头部
BYTE*lpBits2=lpBitmap+sizeof<
//位图图像信息局部
intx,y,p1,p2,Palette;
for<
y=0;
y<
nHeight;
y++>
x=0;
x<
nWidth;
x++>
p1=y*nBWidth+x;
p2=y*nByteWidth+x*3;
lpBits[p1]<
Palette=lpBits[p1];
elsePalette=0;
lpBits2[p2]=pPalette[Palette].rgbBlue;
lpBits2[p2+1]=pPalette[Palette].rgbGreen;
lpBits2[p2+2]=pPalette[Palette].rgbRed;
deletelpTemp;
lpBackup>
deletelpBackup;
lpBackup=newBYTE[nLen];
lpBackup,lpBitmap,nLen>
OnOpen<
//点击打开文件之后,对应的事件处理函数
在此添加控件通知处理程序代码
CFileFile;
CFileDialogdlg<
TRUE,0,0,OFN_HIDEREADONLY,L"
位图文件|*.bmp|所有文件|*.*||"
this>
//新建文件选择对话框
dlg.DoModal<
==IDOK>
FileName=dlg.GetPathName<
//得到文件的路径
File.Open<
FileName,CFile:
modeRead>
return;
//以只读方式打开文件
addloadingcodehere
lpBitmap>
deletelpBitmap;
//保证lpBitmap为空
nLen=<
int>
File.GetLength<
//得到文件的长度
//为lpBitmap分配空间
File.Read<
lpBitmap,nLen>
//将文件的内容读入到lpBitmap所指向的内存区域
//调用LoadBitmap<
加载位图图像
source.SetImage<
nWidth,nHeight,lpBits>
OnHist<
HistogramEq<
voidGetPoints<
intnWidth,intnHeight,BYTE*lpBits,BYTE*lpPoints>
intx,y,p;
intnByteWidth=nWidth*3;
//每一行
//每一列
p=x*3+y*nByteWidth;
lpPoints[x+y*nWidth]=<
BYTE>
0.299*<
float>
lpBits[p+2]+0.587*<
lpBits[p+1]+0.114*<
lpBits[p]+0.1>
//三种颜色的比例计算对应点的颜色值,并且强制转换成BYTE
voidPutPoints<
//逐个对lpBits进展赋值
intx,y,p,p1;
p1=x+y*nWidth;
lpBits[p]=lpPoints[p1];
lpBits[p+1]=lpPoints[p1];
lpBits[p+2]=lpPoints[p1];
lpBitmap==0>
BYTE*lpOutput=newBYTE[nByteWidth*nHeight];
HistogramEq1<
nWidth,nHeight,lpBits,lpOutput>
dest.SetImage<
nWidth,nHeight,lpOutput>
//在直方图均衡化的区域显示结果
deletelpOutput;
NoColor<
//将原始图像转换成灰度图像
NoColor<
BYTEPoint;
Point=<
//计算颜色值,在0-255的灰度级之间
lpBits[p+2]=Point;
lpBits[p+1]=Point;
lpBits[p]=Point;
source.SetImage<
//将彩色图像转化成灰度图像
intnWidth,intnHeight,BYTE*lpInput,BYTE*lpOutput>
intx,y;
BYTE*lpPoints=newBYTE[nWidth*nHeight];
//像素点的个数
GetPoints<
nWidth,nHeight,lpInput,lpPoints>
//lpPoints存的是颜色值
intr[256],s[256];
//颜色值数组,统计对应颜色值像素