数字图像处理实验三中值滤波和均值滤波实验报告材料_第1页
数字图像处理实验三中值滤波和均值滤波实验报告材料_第2页
数字图像处理实验三中值滤波和均值滤波实验报告材料_第3页
数字图像处理实验三中值滤波和均值滤波实验报告材料_第4页
数字图像处理实验三中值滤波和均值滤波实验报告材料_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数字图像处理实验三均值滤波、中值滤波的计算机实现12281166崔雪莹计科1202班一、实验目的:1)熟悉均值滤波、中值滤波处理的理论基础;2)掌握均值滤波、中值滤波的计算机实现方法;3)学习VC+6。0的编程方法;4)验证均值滤波、中值滤波处理理论;5)观察均值滤波、中值滤波处理的结果。二、实验的软、硬件平台:硬件:微型图像处理系统,包括:主机,PC机;摄像机;软件:操作系统:WIND0WS2000或WINDOWSXP应用软件:VC+6.0三、实验内容:1)握高级语言编程技术;2)编制均值滤波、中值滤波处理程序的方法;3)编译并生成可执行文件;4)考察处理结果。四、实验要求:1)学习VC+确

2、6。0编程的步骤及流程;2)编写均值滤波、中值滤波的程序;3)编译并改错;4)把该程序嵌入试验二给出的界面中(作适当修改);5)提交程序及文档;6)写出本次实验的体会。五、实验结果截图实验均值滤波采用的是3X3的方块,取周围的像素点取得其均值代替原像素点。边缘像素的处理方法是复制边缘的像素点,增加一个边框,计算里面的像素值得均值滤波。II打Jf文祥中谊泯逋均值爲波中I稠打开文件六、实验体会本次实验在前一次的实验基础上增加均值滤波和中值滤波,对于椒盐噪声的处理,发现中值滤波的效果更为好一点,而均值滤波是的整个图像变得模糊了一点,效果差异较大。本次实验更加增加了对数字图像处理的了解与学习。七、实验

3、程序代码注释及分析/HistDemoADlg.h:头文件/#includeImageWnd.h#pragmaonce/CHistDemoADIg对话框classCHistDemoADlg:publicCDialogEx/构造public:CHistDemoADlg(CWnd*pParent=NULL);/标准构造函数intnWidth;intnHeight;intnLen;intnByteWidth;BYTE*lpBackup;BYTE*lpBitmap;BYTE*lpBits;CStringFileName;CImageWndsource,dest;/对话框数据enumIDD=IDD_HIS

4、TDEMOA_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_msgvoid

5、OnOpen();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_m

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

7、及NoColor()函数,对原始图像转化为灰度图像之后再显示。/HistDemoADlg.cpp:实现文件/#includestdafx.h#includeHistDemoA.h#includeHistDemoADlg.h#includeafxdialogex.h#ifdef_DEBUG#definenewDEBUG_NEW#endif#definePoint(x,y)lpPoints(x)+(y)*nWidth#definePoint1(x,y)lpPoints1(x)+(y)*nWidth/用于应用程序“关于”菜单项的CAboutDlg对话框classCAboutDlg:publicCDi

8、alogExpublic:CAboutDlg();/对话框数据enumIDD=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(CAboutD

9、lg,CDialogEx)END_MESSAGE_MAP()/CHistDemoADIg对话框CHistDemoADlg:CHistDemoADlg(CWnd*pParent/*=NULL*/):CDiaIogEx(CHistDemoADIg:IDD,pParent)m_hIcon=AfxGetApp()-LoadIcon(IDR_MAINFRAME);IpBitmap=0;IpBackup=0;voidCHistDemoADIg:DoDataExchange(CDataExchange*pDX)CDiaIogEx:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(C

10、HistDemoADIg,CDiaIogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_OPEN,&CHistDemoADIg:OnOpen)ON_BN_CLICKED(IDC_HIST,&CHistDemoADIg:OnHist)ON_BN_CLICKED(IDCLOSE,&CHistDemoADIg:OnBnCIickedCIose)ON_BN_CLICKED(IDC_MEANFILTER,&CHistDemoADlg:OnBnClickedMeanfilter)ON_BN_CLICKED(I

11、DC_MEDIANFILTER,&CHistDemoADlg:OnBnClickedMedianfilter)END_MESSAGE_MAP()/CHistDemoADIg消息处理程序BOOLCHistDemoADlg:OnInitDialog()CDiaIogEx:OnInitDiaIog();/将“关于.”菜单项添加到系统菜单中。/IDM_AB0UTB0X必须在系统命令范围内。ASSERT(IDM_ABOUTBOX&0 xFFF0)=IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOXAppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(M

12、F_STRING,IDM_ABOUTBOX,strAboutMenu);/设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动/执行此操作SetIcon(m_hIcon,TRUE);/设置大图标SetIcon(m_hIcon,FALSE);/设置小图标/TODO:在此添加额外的初始化代码source.Create(0,LSource,WS_CHILD|WS_VISIBLE,CRect(40,40,360,280),this,10000);dest.Create(0,LDestination,WS_CHILD|WS_VISIBLE,CRect(400,40,720,280),this,1

13、0001);returnTRUE;/除非将焦点设置到控件,否则返回TRUEvoidCHistDemoADlg:OnSysCommand(UINTnID,LPARAMlParam)if(nID&0 xFFF0)=IDM_ABOUTBOX)CAboutDlgdlgAbout;dlgAbout.DoModal();elseCDialogEx:OnSysCommand(nID,lParam);/如果向对话框添加最小化按钮,则需要下面的代码/来绘制该图标。对于使用文档/视图模型的MFC应用程序,/这将由框架自动完成。voidCHistDemoADlg:OnPaint()if(IsIconic()CPai

14、ntDCdc(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_hIco

15、n);elseCDialogEx:OnPaint();/当用户拖动最小化窗口时系统调用此函数取得光标/显示。HCURSORCHistDemoADlg:OnQueryDragIcon()returnstatic_cast(m_hIcon);voidCHistDemoADlg:LoadBitmap()/位图文件:BITMAPFILEHEADER+BITMAPINFOHEADER+有效信息部分BITMAPINFOHEADER*plnfo;/位图文件的头部信息指针pInfopInfo=(BITMAPINFOHEADER*)(lpBitmap+sizeof(BITMAPFILEHEADER);/pInf

16、o指向位图文件的头部信息nWidth=pInfo-biWidth;/图片宽度nByteWidth=nWidth*3;/字节宽度if(nByteWidth%4)nByteWidth+=4-(nByteWidth%4);/使字节宽度为4的整数倍nHeight二plnfo-biHeight;/图片高度if(pInfo-biBitCount!=24)/位图的位深度不为24if(pInfo-biBitCount!=8)/位深度不为8AfxMessageBox(L无效位图);deletelpBitmap;lpBitmap=0;return;/位深度为8unsignedintPaletteSize=1biB

17、itCount;/左移8位,PaletteSize调色板尺寸if(pInfo-biClrUsed!=0&pInfo-biClrUsedbiClrUsed;/biCIrUsed位图实际使用的颜色表中的颜色数lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);/lpBits指向有效信息部分RGBQUAD*pPalette=(RGBQUAD*)lpBits;/颜色表部分/*typedefstructtagRGBQUADBYTErgbBlue;BYTErgbGreen;BYTErgbRed;BYTErgbReserved;

18、RGBQUAD;*/lpBits+二sizeof(RGBQUAD)*PaletteSize;/lpBits指向图像有效信息部分nLen=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nByteWidth*nHeight;/整个位图文件的长度BYTE*lpTemp=lpBitmap;lpBitmap=newBYTEnLen;BITMAPFILEHEADERbmh;BITMAPINFOHEADERbmi;bmh.bfType=B+M*256;bmh.bfSize=nLen;bmh.bfReserved1=0;bmh.bfReserved2=0;

19、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-(

20、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;ynHeight;y+)for(x=0;xnWi

21、dth;x+)p1=y*nBWidth+x;p2=y*nByteWidth+x*3;if(lpBitsp1PaletteSize)Palette=lpBitsp1;elsePalette=0;lpBits2p2=pPalettePalette.rgbBlue;lpBits2p2+1=pPalettePalette.rgbGreen;lpBits2p2+2=pPalettePalette.rgbRed;deletelpTemp;lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)if(lpBackup)deletelp

22、Backup;lpBackup=newBYTEnLen;memcpy(lpBackup,lpBitmap,nLen);voidCHistDemoADlg:OnOpen()/点击打开文件之后,对应的事件处理函数/TODO:在此添加控件通知处理程序代码CFileFile;CFileDialogdlg(TRUE,O,O,OFN_HIDEREADONLY,L位图文件|*.bmp|所有文件|*.*|,this);/新建文件选择对话框if(dlg.DoModal()=IDOK)FileName=dlg.GetPathName();/得到文件的路径if(!File.Open(FileName,CFile:m

23、odeRead)return;/以只读方式打开文件/TODO:addloadingcodehereif(lpBitmap)deletelpBitmap;/保证IpBitmap为空nLen=(int)File.GetLength();/得到文件的长度lpBitmap二newBYTEnLen;/为lpBitmap分配空间File.Read(lpBitmap,nLen);/将文件的内容读入到lpBitmap所指向的内存区域LoadBitmapO;/调用LoadBitmap(),加载位图图像if(lpBitmap)source.SetImage(nWidth,nHeight,lpBits);voidC

24、HistDemoADlg: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;ynHeight;y+)/每一行for(x=0;xnWidth;x+)/每一列p=x*3+y*nByteWidth;lpPointsx+y*nWidth=(BYTE)(0.299*(float)lp

25、Bitsp+2+0.587*(float)lpBitsp+1+0.114*(float)lpBitsp+0.1);/三种颜色的比例计算对应点的颜色值,并且强制转换成BYTEvoidPutPoints(intnWidth,intnHeight,BYTE*lpBits,BYTE*lpPoints)/逐个对IpBits进行赋值intnByteWidth=nWidth*3;if(nByteWidth%4)nByteWidth+=4-(nByteWidth%4);intx,y,p,p1;for(y=0;ynHeight;y+)/每一行for(x=0;xnWidth;x+)/每一列p=x*3+y*nByt

26、eWidth;p1=x+y*nWidth;IpBitsp=IpPointsp1;IpBitsp+1=IpPointsp1;IpBitsp+2=IpPointsp1;voidCHistDemoADIg:HistogramEq(void)if(IpBitmap=0)return;BYTE*IpOutput=newBYTEnByteWidth*nHeight;HistogramEq1(nWidth,nHeight,lpBits,lpOutput);dest.SetImage(nWidth,nHeight,lpOutput);/在直方图均衡化的区域显示结果deletelpOutput;NoColor(

27、);/将原始图像转换成灰度图像voidCHistDemoADlg:NoColor()if(lpBitmap=0)return;intx,y,p;BYTEPoint;for(y=0;ynHeight;y+)/每一行for(x=0;xnWidth;x+)/每一列p=x*3+y*nByteWidth;Point=(BYTE)(0.299*(float)lpBitsp+2+0.587*(float)lpBitsp+1+0114*(float)lpBitsp+0.1);/计算颜色值,在0-255的灰度级之间lpBitsp+2=Point;lpBitsp+1=Point;lpBitsp=Point;sou

28、rce.Setlmage(nWidth,nHeight,lpBits);/将彩色图像转化成灰度图像voidCHistDemoADlg:HistogramEq1(intnWidth,intnHeight,BYTE*lplnput,BYTE*lpOutput)intx,y;BYTE*lpPoints二newBYTEnWidth*nHeight;/像素点的个数GetPoints(nWidth,nHeight,lplnput,lpPoints);/lpPoints存的是颜色值intr256,s256;/颜色值数组,统计对应颜色值像素点的个数ZeroMemory(r,1024);ZeroMemory(s

29、,1024);for(y=0;ynHeight;y+)/统计对应颜色值像素点的个数,Point(x,y)是lpPoints(x,y)for(x=0;xnWidth;x+)rPoint(x,y)+;s0=r0;for(y=1;y256;y+)sy=sy-1;sy+=ry;/计算颜色值的前y种颜色的总像素点的个数(像素点颜色值二y)for(y=0;ynHeight;y+)/将计算对应点的像素值,直方图均匀化的结果保存在IpPointsfor(x=0;xnWidth;x+)Point(x,y)=sPoint(x,y)*255/nWidth/nHeight;PutPoints(nWidth,nHeig

30、ht,IpOutput,IpPoints);/输出IpPoints到IpOutputdeIeteIpPoints;voidCHistDemoADIg:OnBnCIickedCIose()/TODO:在此添加控件通知处理程序代码/ExitProcess(O);/注意使用时先释放分配的内存,以免造成内存泄露/exit(O);/正常终止程序;exit(非0)非正常终止程序PostQuitMessage(O);/最常用voidCHistDemoADIg:OnBnCIickedMeanfiIter()/TODO:在此添加控件通知处理程序代码if(IpBitmap=0)return;BYTE*IpOutp

31、ut=newBYTEnByteWidth*nHeight;MeanFiIter(nWidth,nHeight,IpBits,IpOutput);dest.Setlmage(nWidth,nHeight,lpOutput);/在直方图均衡化的区域显示结果deletelpOutput;NoColor();/将原始图像转换成灰度图像voidCHistDemoADlg:MeanFilter(intnWidth,intnHeight,BYTE*lplnput,BYTE*lpOutput)intx,y;BYTE*lpPoints二newBYTEnWidth*nHeight;/像素点的个数BYTE*lpPo

32、ints1=newBYTE(nWidth+2)*(nHeight+2);GetPoints(nWidth,nHeight,lpInput,lpPoints);/lpPoints存的是颜色值for(y=1;ynHeight+1;y+)/中间最整块图像的拷贝for(x=1;xnWidth;x+)Point1(x,y)=Point(x-1,y-1);/lpPoints1yx=lpPointsy-1x-1;for(y=1;ynHeight+1;y+)/最左边和最右边一列的拷贝Point1(0,y)=Point(0,y-1);Point1(nWidth+1,y)=Point(nWidth-1,y-1);

33、/lpPoints1y0=lpPointsy-10;/lpPoints1ynWidth+1=lpPointsy-1nWidth-1;for(x=0;xnWidth+2;x+)/最上边和最下边一行的拷贝Point1(x,0)=Point1(x,1);Point1(x,nHeight+1)=Point1(x,nHeight);/lpPoints10 x=lpPoints11x;/lpPoints1nHeight+1x=lpPoints1nHeightx;for(y=0;ynHeight;y+)/求以某点为中心的九个数平均值for(x=0;xnWidth;x+)Point1(x+1,y)+Point

34、1(x+2,y)Point1(x+1,y+1)Point1(x,y)+Point1(x,y+1)Point(x,y)Point1(x+2,y+1)lpPoints1y+2x+2)/9;Point1(x,y+2)Point1(x+1,y+2)Point1(x+2,y+2)/*lpPointsyxlpPoints1yx+2+)/9;(lpPoints1yxlpPoints1yx+1lpPoints1y+1xlpPoints1y+1x+1lpPoints1y+1x+2+lpPoints1y+2xlpPoints1y+2x+1*/PutPoints(nWidth,nHeight,lpOutput,lp

35、Points);/输出lpPoints到lpOutputdeletelpPoints;voidCHistDemoADlg:MedianFilter(intnWidth,intnHeight,BYTE*lpInput,BYTE*lpOutput)intx,y;BYTE*lpPoints二newBYTEnWidth*nHeight;/像素点的个数BYTE*lpPoints1=newBYTE(nWidth+2)*(nHeight+2);GetPoints(nWidth,nHeight,lpInput,lpPoints);/lpPoints存的是颜色值for(y=1;ynHeight+1;y+)/中间

36、一整块拷贝for(x=1;xnWidth;x+)Point1(x,y)=Point(x-1,y-1);for(y=1;ynHeight+1;y+)/最左边和最右边一列的拷贝Point1(0,y)=Point(0,y-1);Point1(nWidth+1,y)=Point(nWidth-1,y-1);for(x=0;xnWidth+2;x+)/最上边和最下边一行的拷贝Point1(x,0)=Point1(x,1);Point1(x,nHeight+1)=Point1(x,nHeight);BYTE*window=newBYTE9;for(y=0;ynHeight;y+)for(x=0;xnWid

37、th;x+)intk=0;for(inti=y;i=y+2;i+)for(intj=x;j=x+2;j+)if(k9)windowk+=Point1(j,i);for(intm二0;m5;+m)/求9个数的中值,window4为中值intmin二m;for(intn二m+1;n9;+n)if(windownwindowmin)min二n;/PutfoundminimumelementinitsplaceBYTEtemp二windowm;windowm二windowmin;windowmin二temp;Point(x,y)二window4;PutPoints(nWidth,nHeight,lpO

38、utput,lpPoints);/输出lpPoints到lpOutputdeletelpPoints;voidCHistDemoADlg:OnBnClickedMedianfilter()/TODO:在此添加控件通知处理程序代码if(lpBitmap=O)return;BYTE*lpOutput二newBYTEnByteWidth*nHeight;MedianFilter(nWidth,nHeight,lpBits,lpOutput);dest.Setlmage(nWidth,nHeight,lpOutput);/在中值滤波的区域显示结果deletelpOutput;NoColor();/将原始图像转换成灰度图像ClmageWnd.h类继承自CWnd主要是图像显示方面的函数,如水平滚轮和垂直滚轮的事件函数,以及绘制函数OnPaintO,初始化函数等等,以及存放需要绘制的图像信息的成员变量setlmage(),外接提供绘制的信息,通过参数传递给内部的成员变量。#pragmaon

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论