图形图像期末课程设计Word格式.docx
《图形图像期末课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《图形图像期末课程设计Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
均值滤波器也是平滑线性滤波器,常用于模糊处理和减小噪声,模糊处理
经常用于预处理。
例如,在提取大的目标之前除去信号中的一些琐碎细节、桥接直线或曲线的缝隙。
通过线性滤波器和非线性滤波器可以减小噪声。
程序设计:
具体代码如下:
//MyDIPView.cpp:
implementationoftheCMyDIPViewclass
//
#include"
stdafx.h"
MyDIP.h"
MyDIPDoc.h"
MyDIPView.h"
math.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/*****************************************************
*
*函数名称:
*Template:
*
*参数:
*HDIBhDIB-图像的句柄
*double*tem-指向模板的指针
*inttem_w-模板的宽度
*inttem_h-模板的高度
*doublexishu-模板的系数
*功能:
*对图像进行模板操作
*说明:
*为处理方便起见,模板的宽度和高度都应为奇数
*******************************************************/
HDIBTemplate(HDIBhDIB,double*tem,inttem_w,inttem_h,doublexishu)
{
//统计中间值
doublesum;
//指向图像起始位置的指针
BYTE*lpDIB=(BYTE*):
:
GlobalLock((HGLOBAL)hDIB);
//指向象素起始位置的指针
BYTE*pScrBuff=(BYTE*):
FindDIBBits((char*)lpDIB);
//获取图像的颜色信息
intnumColors=(int):
DIBNumColors((char*)lpDIB);
//如果图像不是256色返回
if(numColors!
=256)
{
//解除锁定
:
GlobalUnlock((HGLOBAL)hDIB);
//返回
return(hDIB);
}
//将指向图像象素起始位置的指针,赋值给指针变量
BYTE*oldbuf=pScrBuff;
//循环变量
inti,j,m,n;
intw,h,dw;
//获取图像的宽度
w=(int):
DIBWidth((char*)lpDIB);
//获取图像的高度
h=(int):
DIBHeight((char*)lpDIB);
//计算图像每行的字节数
dw=(w+3)/4*4;
//建立一个和原图像大小相同的25色灰度位图
HDIBnewhDIB=NewDIB(w,h,8);
//指向新的位图的指针
BYTE*newlpDIB=(BYTE*):
GlobalLock((HGLOBAL)newhDIB);
//指向新的位图的象素起始位置的指针
BYTE*destBuf=(BYTE*)FindDIBBits((char*)newlpDIB);
//将指向新图像象素起始位置的指针,赋值给指针变量
BYTE*newbuf=destBuf;
//对图像进行扫描
//行
for(i=0;
i<
h;
i++)
//列
for(j=0;
j<
w;
j++)
//为统计变量赋初始值
sum=0;
//对于图像的4个边框的象素保持原灰度不变
if(j<
((tem_w-1)/2)||j>
(w-(tem_w+1)/2)||i<
((tem_h-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(sum<
0)
//如果大于255,强制赋值为255
if(sum>
255)
sum=255;
//将计算的结果放到新的位图的相应位置
*(newbuf+i*dw+j)=sum;
}
:
GlobalUnlock((HGLOBAL)hDIB);
//返回新的位图的句柄
return(newhDIB);
}
/////////////////////////////////////////////////////////////////////////////
//CMyDIPView
IMPLEMENT_DYNCREATE(CMyDIPView,CScrollView)
BEGIN_MESSAGE_MAP(CMyDIPView,CScrollView)
//{{AFX_MSG_MAP(CMyDIPView)
ON_COMMAND(ID_MENUITEM32778,OnMenuitem32778)
//}}AFX_MSG_MAP
//Standardprintingcommands
ON_COMMAND(ID_FILE_PRINT,CScrollView:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,CScrollView:
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CScrollView:
OnFilePrintPreview)
END_MESSAGE_MAP()
//CMyDIPViewconstruction/destruction
CMyDIPView:
CMyDIPView()
//TODO:
addconstructioncodehere
~CMyDIPView()
BOOLCMyDIPView:
PreCreateWindow(CREATESTRUCT&
cs)
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnCScrollView:
PreCreateWindow(cs);
//CMyDIPViewdrawing
voidCMyDIPView:
OnDraw(CDC*pDC)
{
CMyDIPDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->
m_hDIB==NULL)
return;
adddrawcodefornativedatahere
inti,j;
unsignedchar*lpSrc;
LPSTRlpDIB=(LPSTR):
GlobalLock((HGLOBAL)pDoc->
m_hDIB);
intcxDIB=(int):
DIBWidth(lpDIB);
//SizeofDIB-x
intcyDIB=(int):
DIBHeight(lpDIB);
//SizeofDIB-y
LPSTRlpDIBBits=:
FindDIBBits(lpDIB);
//计算图像每行的字节数
longlLineBytes=WIDTHBYTES(cxDIB*8);
//每行
for(i=0;
i<
cyDIB;
i++)
//每列
for(j=0;
j<
cxDIB;
j++)
{
//指向DIB第i行,第j个象素的指针
lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*(cyDIB-1-i)+j;
//计算新的灰度值
//*(lpSrc)=BYTE(255-*lpSrc);
GlobalUnlock((HGLOBAL)pDoc->
CRectrect(0,0,cxDIB,cyDIB),rcDIB(0,0,cxDIB,cyDIB);
PaintDIB(pDC->
m_hDC,&
rect,pDoc->
m_hDIB,&
rcDIB,pDoc->
m_palDIB);
//CMyDIPViewprinting
OnPreparePrinting(CPrintInfo*pInfo)
//defaultpreparation
returnDoPreparePrinting(pInfo);
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
addextrainitializationbeforeprinting
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
addcleanupafterprinting
//CMyDIPViewdiagnostics
AssertValid()const
CScrollView:
AssertValid();
Dump(CDumpContext&
dc)const
Dump(dc);
CMyDIPDoc*CMyDIPView:
GetDocument()//non-debugversionisinline
ASSERT(m_pDocument->
IsKindOf(RUNTIME_CLASS(CMyDIPDoc)));
return(CMyDIPDoc*)m_pDocument;
#endif//_DEBUG
//CMyDIPViewmessagehandlers
OnSize(UINTnType,intcx,intcy)
OnSize(nType,cx,cy);
OnInitialUpdate()
OnInitialUpdate();
SetScrollSizes(MM_TEXT,GetDocument()->
m_sizeDoc);
//对比度拉伸
//DELvoidCMyDIPView:
OnMenuitem32777()
//DEL{
//DEL
//DEL//获取文档
//DELCMyDIPDoc*pDoc=GetDocument();
//DELinti,j;
//DELintr1=60,r2=200;
//DELdoublek=1.5;
//DELunsignedchar*lpSrc;
//DELASSERT_VALID(pDoc);
//DELif(pDoc->
//DELreturn;
//DELLPSTRlpDIB=(LPSTR):
//DELLPSTRlpDIBBits=:
//DELintcxDIB=(int):
//DELintcyDIB=(int):
//DELlonglLineBytes=WIDTHBYTES(cxDIB*8);
//DEL//每行
//DELfor(i=0;
//DEL{
//DEL//每列
//DELfor(j=0;
//DEL{
//DEL//指向DIB第i行,第j个象素的指针
//DELlpSrc=(unsignedchar*)lpDIBBits+lLineBytes*(cyDIB-1-i)+j;
//DEL//计算新的灰度值
//DELif(*lpSrc<
r1)*lpSrc=BYTE(*lpSrc/k);
//DELelseif(*lpSrc<
r2)*lpSrc=BYTE((*lpSrc-r1)*k+r1/k);
//DELelse*lpSrc=BYTE((*lpSrc-r2)/k+255-(255-r2)/k);
//DEL}
//DEL}
//DEL:
//DELInvalidate(TRUE);
//DEL}