数字图像处理实验三中值滤波和均值滤波实验报告材料Word下载.docx

上传人:b****5 文档编号:17470688 上传时间:2022-12-01 格式:DOCX 页数:25 大小:23.43KB
下载 相关 举报
数字图像处理实验三中值滤波和均值滤波实验报告材料Word下载.docx_第1页
第1页 / 共25页
数字图像处理实验三中值滤波和均值滤波实验报告材料Word下载.docx_第2页
第2页 / 共25页
数字图像处理实验三中值滤波和均值滤波实验报告材料Word下载.docx_第3页
第3页 / 共25页
数字图像处理实验三中值滤波和均值滤波实验报告材料Word下载.docx_第4页
第4页 / 共25页
数字图像处理实验三中值滤波和均值滤波实验报告材料Word下载.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

数字图像处理实验三中值滤波和均值滤波实验报告材料Word下载.docx

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

数字图像处理实验三中值滤波和均值滤波实验报告材料Word下载.docx

;

//标准构造函数

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];

//颜色值数组,统计对应颜色值像素

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1