对图像进行均值滤波课程设计.doc_第1页
对图像进行均值滤波课程设计.doc_第2页
对图像进行均值滤波课程设计.doc_第3页
对图像进行均值滤波课程设计.doc_第4页
对图像进行均值滤波课程设计.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

学院图形图像处理与应用题 目 对图像进行均值滤波 院(系)专业级班学 号 姓 名 指导教师 成 绩 完成时间 2012 年 06 月均 值 滤 波均值滤波的原理 均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围8个象素,构成一个滤波模板,即去掉目标象素本身)。再用模板中的全体像素的平均值来代替原来像素值。均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度个g(x,y),即个g(x,y)=1/m f(x,y) m为该模板中包含当前像素在内的像素总个数。均值滤波的实现算法均值滤波将每个像素点的灰度值设置为以该点为中心的邻域窗口内的所有像素灰度值的平均值,以实现像素的平滑,达到图像去噪的目的。设输入图像信号为f(x,y),去噪处理后的输出图像为g(x,y),则有g(x,y)= | f(x,y)- u (x,y)| 。 通过上式可以达到消除信号噪声的目的,但对于其中的每一个灰度值来说,都需要按照式求取以该点中心的邻域窗口内所有像素的平均值,对长度为(2n+1)的信号来说,需要进行(2n+1)次加法、一次乘法、一次除法。所以说,均值计算占用了均值滤波处理的大量时间费用。均值滤波应用均值滤波就是在一定的时间内对输入信号进行连续的采样然后求出几次采样值的平均值。设x0xi是采样值,yk是对采样进行平均值滤波的输出值,其关系如下:在工程应用中,均值滤波对于周期性的干扰有很好的抑制作用,另外,均值滤波对于热噪声产生的干扰也有很好的抑制作用。n的取值取决n系统的参数,如果系统对输入的灵敏度要求很高,则n的取值应比较小,如果系统的输入变化速度不快,系统对输入的灵敏性要求也不是很高,为了抑制干扰,提高输入的精度,可以将n取得比较大。均值滤波器均值滤波器也是平滑线性滤波器,常用于模糊处理和减小噪声,模糊处理经常用于预处理。例如,在提取大的目标之前除去信号中的一些琐碎细节、桥接直线或曲线的缝隙。通过线性滤波器和非线性滤波器可以减小噪声。程序设计:具体代码如下:/ MyDIPView.cpp : implementation of the CMyDIPView class/#include stdafx.h#include MyDIP.h#include MyDIPDoc.h#include MyDIPView.h#include math.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/* * 函数名称:* Template:* 参数:* HDIB hDIB 图像的句柄* double *tem 指向模板的指针* int tem_w 模板的宽度* int tem_h 模板的高度* double xishu 模板的系数* * 功能:* 对图像进行模板操作* 说明:* 为处理方便起见,模板的宽度和高度都应为奇数*/ HDIB Template(HDIB hDIB,double * tem ,int tem_w,int tem_h,double xishu) /统计中间值 double sum; /指向图像起始位置的指针 BYTE *lpDIB=(BYTE*):GlobalLock(HGLOBAL) hDIB);/指向象素起始位置的指针BYTE *pScrBuff =(BYTE*):FindDIBBits(char*)lpDIB); /获取图像的颜色信息 int numColors=(int) :DIBNumColors(char *)lpDIB); /如果图像不是256色返回 if (numColors!=256) /解除锁定 :GlobalUnlock(HGLOBAL) hDIB);/返回return(hDIB); /将指向图像象素起始位置的指针,赋值给指针变量 BYTE* oldbuf = pScrBuff; /循环变量 int i,j,m,n;int w, h, dw;/获取图像的宽度w = (int) :DIBWidth(char *)lpDIB);/获取图像的高度h = (int) :DIBHeight(char *)lpDIB);/计算图像每行的字节数dw = (w+3)/4*4; /建立一个和原图像大小相同的25色灰度位图 HDIB newhDIB=NewDIB(w,h,8); /指向新的位图的指针BYTE *newlpDIB=(BYTE*):GlobalLock(HGLOBAL) newhDIB);/指向新的位图的象素起始位置的指针 BYTE *destBuf = (BYTE*)FindDIBBits(char *)newlpDIB); /将指向新图像象素起始位置的指针,赋值给指针变量 BYTE *newbuf=destBuf; /对图像进行扫描 /行 for(i=0;ih;i+) /列 for(j=0;jw;j+) /为统计变量赋初始值 sum=0; /对于图像的4个边框的象素保持原灰度不变 if( j(w-(tem_w+1)/2) | i(h-(tem_h+1)/2) ) *(newbuf+i*dw+j)=*(oldbuf+i*dw+j); /对于其他的象素进行模板操作 else /将点(i,j)点作为模板的中心 for(m=i-(tem_h-1)/2);m=i+(tem_h-1)/2);m+) for(n=j-(tem_w-1)/2);n=j+(tem_w-1)/2);n+) /将以点(i,j)为中心,与模板大小相同的范围内的象素与模板对用位置的系数 /进行相乘并线形叠加 sum+=*(oldbuf+m*dw+n)* tem(m-i+(tem_h-1)/2)*tem_w+n-j+(tem_w-1)/2); /将结果乘上总的模板系数 sum=(int)sum*xishu; /计算绝对值 sum = fabs(sum); /如果小于0,强制赋值为0 if(sum255) sum=255; /将计算的结果放到新的位图的相应位置 *(newbuf+i*dw+j)=sum; /解除锁定:GlobalUnlock(HGLOBAL)hDIB); /返回新的位图的句柄 return(newhDIB);/ CMyDIPViewIMPLEMENT_DYNCREATE(CMyDIPView, CScrollView)BEGIN_MESSAGE_MAP(CMyDIPView, CScrollView)/AFX_MSG_MAP(CMyDIPView)ON_COMMAND(ID_MENUITEM32778, OnMenuitem32778)/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CScrollView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView:OnFilePrintPreview)END_MESSAGE_MAP()/ CMyDIPView construction/destructionCMyDIPView:CMyDIPView()/ TODO: add construction code hereCMyDIPView:CMyDIPView()BOOL CMyDIPView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CScrollView:PreCreateWindow(cs);/ CMyDIPView drawingvoid CMyDIPView:OnDraw(CDC* pDC) CMyDIPDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if(pDoc-m_hDIB = NULL)return ;/ TODO: add draw code for native data hereint i,j; unsigned char *lpSrc;LPSTR lpDIB = (LPSTR) :GlobalLock(HGLOBAL) pDoc-m_hDIB);int cxDIB = (int) :DIBWidth(lpDIB); / Size of DIB - xint cyDIB = (int) :DIBHeight(lpDIB); / Size of DIB - yLPSTR lpDIBBits=:FindDIBBits (lpDIB);/ 计算图像每行的字节数long lLineBytes = WIDTHBYTES(cxDIB * 8);/ 每行for(i = 0; i cyDIB; i+)/ 每列for(j = 0; j m_hDIB);CRect rect(0,0,cxDIB,cyDIB), rcDIB(0,0,cxDIB,cyDIB);:PaintDIB(pDC-m_hDC, &rect, pDoc-m_hDIB, &rcDIB, pDoc-m_palDIB);/ CMyDIPView printingBOOL CMyDIPView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CMyDIPView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CMyDIPView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printing/ CMyDIPView diagnostics#ifdef _DEBUGvoid CMyDIPView:AssertValid() constCScrollView:AssertValid();void CMyDIPView:Dump(CDumpContext& dc) constCScrollView:Dump(dc);CMyDIPDoc* CMyDIPView:GetDocument() / non-debug version is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CMyDIPDoc);return (CMyDIPDoc*)m_pDocument;#endif /_DEBUG/ CMyDIPView message handlersvoid CMyDIPView:OnSize(UINT nType, int cx, int cy)CScrollView:OnSize(nType, cx, cy);void CMyDIPView:OnInitialUpdate()CScrollView:OnInitialUpdate();SetScrollSizes(MM_TEXT, GetDocument()-m_sizeDoc);/对比度拉伸/DEL void CMyDIPView:OnMenuitem32777() /DEL /DEL /DEL / 获取文档/DEL CMyDIPDoc* pDoc = GetDocument();/DEL int i,j;/DEL int r1=60,r2=200;/DEL double k=1.5;/DEL unsigned char *lpSrc;/DEL ASSERT_VALID(pDoc);/DEL if(pDoc-m_hDIB = NULL)/DEL return ;/DEL LPSTR lpDIB = (LPSTR) :GlobalLock(HGLOBAL) pDoc-m_hDIB);/DEL LPSTR lpDIBBits=:FindDIBBits (lpDIB);/DEL int cxDIB = (int) :DIBWidth(lpDIB); / Size of DIB - x/DEL int cyDIB = (int) :DIBHeight(lpDIB); / Size of DIB - y/DEL long lLineBytes = WIDTHBYTES(cxDIB * 8); / 计算图像每行的字节数/D

温馨提示

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

评论

0/150

提交评论