数学形态学处理程序实例.docx
《数学形态学处理程序实例.docx》由会员分享,可在线阅读,更多相关《数学形态学处理程序实例.docx(32页珍藏版)》请在冰豆网上搜索。
数学形态学处理程序实例
数学形态学处理程序实例
/JEFFView.cpp:
implementationoftheCJEFFViewclass
//
#include"stdafx.h"
#include"JEFF.h"
#include"JEFFDoc.h"
#include"JEFFView.h"
#defineOut(x,y)lpPoints[(x)+(y)*nWidth]
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CJEFFView
IMPLEMENT_DYNCREATE(CJEFFView,CScrollView)
BEGIN_MESSAGE_MAP(CJEFFView,CScrollView)
//{{AFX_MSG_MAP(CJEFFView)
ON_COMMAND(ID_EROSION,OnErosion)
ON_COMMAND(ID_DILATION,OnDilation)
ON_COMMAND(ID_OPEN,OnOpen)
ON_COMMAND(ID_CLOSE,OnClose)
ON_COMMAND(ID_ZAOSHENG,OnZaosheng)
ON_COMMAND(ID_BIANYUAN,OnBianyuan)
ON_COMMAND(ID_1,On1)
ON_COMMAND(ID_2,On2)
ON_COMMAND(ID_4,On4)
ON_COMMAND(ID_8,On8)
ON_COMMAND(ID_DILATION2,OnDilation2)
ON_COMMAND(ID_EROSION2,OnErosion2)
ON_COMMAND(ID_OPEN2,OnOpen2)
ON_COMMAND(ID_CLOSE2,OnClose2)
ON_COMMAND(ID_SMOOTH,OnSmooth)
ON_COMMAND(ID_RELOAD,OnReload)
ON_COMMAND(ID_TIDU,OnTidu)
ON_COMMAND(ID_BIANYUAN_H,OnBianyuanH)
ON_COMMAND(ID_QUSE,OnQuse)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
//Standardprintingcommands
ON_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()
/////////////////////////////////////////////////////////////////////////////
//CJEFFViewconstruction/destruction
CJEFFView:
:
CJEFFView()
{
//TODO:
addconstructioncodehere
ValidDoc=FALSE;
m_i=1;
}
CJEFFView:
:
~CJEFFView()
{
}
BOOLCJEFFView:
:
PreCreateWindow(CREATESTRUCT&cs)
{
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnCScrollView:
:
PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
//CJEFFViewdrawing
voidCJEFFView:
:
OnDraw(CDC*pDC)
{
CJEFFDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
if(pDoc->lpBitmap)
{
ValidDoc=TRUE;
nWidth=pDoc->nWidth;
nHeight=pDoc->nHeight;
lpBits=pDoc->lpBits;
lpPoints=pDoc->lpPoints;
BITMAPINFOHEADERbmi;
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;
StretchDIBits(pDC->m_hDC,0,0,nWidth*m_i,nHeight*m_i,0,0,nWidth,nHeight,
lpBits,
(BITMAPINFO*)&bmi,
DIB_RGB_COLORS,
SRCCOPY);
}
}
voidCJEFFView:
:
OnInitialUpdate()
{
CScrollView:
:
OnInitialUpdate();
CSizesizeTotal;
//TODO:
calculatethetotalsizeofthisview
sizeTotal.cx=2000;sizeTotal.cy=1700;
SetScrollSizes(MM_TEXT,sizeTotal);
}
/////////////////////////////////////////////////////////////////////////////
//CJEFFViewprinting
BOOLCJEFFView:
:
OnPreparePrinting(CPrintInfo*pInfo)
{
//defaultpreparation
returnDoPreparePrinting(pInfo);
}
voidCJEFFView:
:
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
addextrainitializationbeforeprinting
}
voidCJEFFView:
:
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
addcleanupafterprinting
}
/////////////////////////////////////////////////////////////////////////////
//CJEFFViewdiagnostics
#ifdef_DEBUG
voidCJEFFView:
:
AssertValid()const
{
CScrollView:
:
AssertValid();
}
voidCJEFFView:
:
Dump(CDumpContext&dc)const
{
CScrollView:
:
Dump(dc);
}
CJEFFDoc*CJEFFView:
:
GetDocument()//non-debugversionisinline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CJEFFDoc)));
return(CJEFFDoc*)m_pDocument;
}
#endif//_DEBUG
/////////////////////////////////////////////////////////////////////////////
//CJEFFViewmessagehandlers
//二值形态学:
腐蚀
voidCJEFFView:
:
OnErosion()
{
int*lpMarks=newint[nWidth*nHeight];
intx,y,x1,y1;
intcount;//中间变量
for(y=1;y{
for(x=1;x{
count=1;
for(y1=-1;y1<2;y1++)
{
for(x1=-1;x1<2;x1++)
{
if(Out(x+x1,y+y1))//以(x,y)为中心的九个点是否有白色的像素点
count=0;//如果有count=0,否则count=1;
}
}
if(count)lpMarks[x+y*nWidth]=1;//黑色像素点记为1
elselpMarks[x+y*nWidth]=0;//白色像素点记为0
}
}
for(y=1;y{
for(x=1;x{
if(lpMarks[x+y*nWidth]==0)Out(x,y)=255;//白色像素点灰度为255
}
}
deletelpMarks;//释放内存
GetDocument()->PutPoint();
Invalidate();
}
//二值形态学:
膨胀
voidCJEFFView:
:
OnDilation()
{
intx,y,x1,y1;
intcount;//中间变量
int*lpMarks=newint[nWidth*nHeight];
for(y=1;y{
for(x=1;x{
count=0;
for(y1=-1;y1<2;y1++)
{
for(x1=-1;x1<2;x1++)
{
if(Out(x+x1,y+y1)==0)//以(x,y)为中心的九个点是否有黑色的像素点
count=1;//若有记为一
}
}
if(count)lpMarks[x+y*nWidth]=1;//黑色像素点记为1
elselpMarks[x+y*nWidth]=0;//白色像素点记为0
}
}
for(y=1;y{
for(x=1;x{
if(lpMarks[x+y*nWidth])Out(x,y)=0;//黑色像素点输出灰度值为0
}
}
deletelpMarks;
GetDocument()->PutPoint();
Invalidate();
}
//二值形态学:
开启
voidCJEFFView:
:
OnOpen()
{
//先腐蚀后膨胀
OnErosion();
OnDilation();
}
//二值形态学:
闭合
voidCJEFFView:
:
OnClose()
{
//先膨胀后腐蚀
OnDilation();
OnErosion();
}
//二值形态学:
噪声滤除
voidCJEFFView:
:
OnZaosheng()
{
//先开启后闭合
OnOpen();
OnClose();
}
//二值形态学:
边缘提取
voidCJEFFView:
:
OnBianyuan()
{
int*lpMarks=newint[nWidth*nHeight];//用于保存腐蚀图象灰度值
int*lpMarks1=newint[nWidth*nHeight];//用于保存原图象灰度值
intx,y,x1,y1,count;
for(y=0;y{
for(x=0;x{
lpMarks1[x+y*nWidth]=Out(x,y);//原图象保存至lpMarks1
}
}
//以下为腐蚀操作
for(y=1;y{
for(x=1;x{
count=1;
for(y1=-1;y1<2;y1++)
{
for(x1=-1;x1<2;x1++)
{
if(Out(x+x1,y+y1))
count=0;
}
}
if(count)lpMarks[x+y*nWidth]=0;
elselpMarks[x+y*nWidth]=255;
}
}
//取原图象与腐蚀图象的差集为输出
for(y=0;y{
for(x=0;x{
if(lpMarks1[x+y*nWidth]==lpMarks[x+y*nWidth])Out(x,y)=255;
elseOut(x,y)=0;
}
}
deletelpMarks;//释放内存
deletelpMarks1;//释放内存
GetDocument()->PutPoint();
Invalidate();
}
//放大镜:
1倍
voidCJEFFView:
:
On1()
{
m_i=1;
Invalidate();
}
//放大镜:
2倍
voidCJEFFView:
:
On2()
{
m_i=2;
Invalidate();
}
//放大镜:
4倍
voidCJEFFView:
:
On4()
{
m_i=4;
Invalidate();
}
//放大镜:
8倍
voidCJEFFView:
:
On8()
{
m_i=8;
Invalidate();
}
//灰度形态学:
膨胀
voidCJEFFView:
:
OnDilation2()
{
int*lpMarks=newint[nWidth*nHeight];//定义一块内存,大小为图象像素数
intx,y,x1,y1,s,t;
for(y=1;y{
for(x=1;x{
s=t=255;//s,t为中间变量,因为要找最小值,所以定义其为255
for(y1=-1;y1<2;y1++)
{
for(x1=-1;x1<2;x1++)
{
s=Out(x+x1,y+y1);//以点(x,y)为中心的九个点进行操作
if(s}
}
lpMarks[x+y*nWidth]=t;//将处理后的图像灰度值暂存于内存中
}
}
for(y=1;y{
for(x=1;x{
Out(x,y)=lpMarks[x+y*nWidth];//传至输出
}
}
deletelpMarks;//释放内存
GetDocument()->PutPoint();
Invalidate();
}
//灰度形态学:
腐蚀
voidCJEFFView:
:
OnErosion2()
{
intx,y,x1,y1,s,t;
int*lpMarks=newint[nWidth*nHeight];//定义一块内存,大小为图象像素数
for(y=1;y{
for(x=1;x{
s=t=0;//s,t为中间变量,因为要找最大值,所以定义其为0
for(y1=-1;y1<2;y1++)
{
for(x1=-1;x1<2;x1++)
{
s=Out(x+x1,y+y1);//以点(x,y)为中心的九个点进行操作
if(s>t)t=s;//将九个点灰度的最大值传给t
}
}
lpMarks[x+y*nWidth]=t;//将处理后的图像灰度值暂存于内存中
}
}
for(y=1;y{
for(x=1;x{
Out(x,y)=lpMarks[x+y*nWidth];//传至输出
}
}
deletelpMarks;//释放内存
GetDocument()->PutPoint();
Invalidate();
}
//灰度形态学:
开启
voidCJEFFView:
:
OnOpen2()
{
//先腐蚀后膨胀
OnErosion2();
OnDilation2();
}
//灰度形态学:
闭合
voidCJEFFView:
:
OnClose2()
{
//先膨胀后腐蚀
OnDilation2();
OnErosion2();
}
//灰度形态学:
平滑
voidCJEFFView:
:
OnSmooth()
{
//先开启后闭合
OnOpen2();
OnClose2();
}
//灰度形态学:
梯度
voidCJEFFView:
:
OnTidu()
{
//TODO:
Addyourcommandhandlercodehere
int*lpMarks=newint[nWidth*nHeight];
intx,y,x1,y1,s,t;
for(y=1;y{
for(x=1;x{
s=t=255;
for(y1=-1;y1<2;y1++)
{
for(x1=-1;x1<2;x1++)
{
s=Out(x+x1,y+y1);
if(s}
}
lpMarks[x+y*nWidth]=t;
}
}
int*lpMarks1=newint[nWidth*nHeight];
for(y=1;y{
for(x=1;x{
s=t=0;
for(y1=-1;y1<2;y1++)
{
for(x1=-1;x1<2;x1++)
{
s=Out(x+x1,y+y1);
if(s>t)t=s;
}
}
lpMarks1[x+y*nWidth]=t;
}
}
for(y=1;y{
for(x=1;x{
if(lpMarks[x+y*nWidth]-lpMarks1[x+y*nWidth]==0)Out(x,y)=255;
elseOut(x,y)=lpMarks[x+y*nWidth]-lpMarks1[x+y*nWidth];
}
}
for(y=1;y{
for(x=1;x{
Out(x,y)=255-Out(x,y);
}
}
deletelpMarks;
deletelpMarks1;
GetDocument()->PutPoint();
Invalidate();
}
//重载图片
voidCJEFFView:
:
OnReload()
{
//TODO:
Addyourcommandhandlercodehere
CJEFFDoc*pDoc=GetDocument();
CStringpath=pDoc->GetPathName();
pDoc->OnNewDocument();
pDoc->OnOpenDocument(path);
pDoc->SetPathName(path);
Invalidate();
}
//灰度形态学:
边缘提取
voidCJEFFView:
:
OnBianyuanH()
{
int*lpMarks=newint[nWidth*nHeight];//用于保存腐蚀图象
int*lpMarks1=newint[nWidth*nHeight];//用于保存原图象
intx,y,x1,y1,s,t;
for(y=0;y{
for(x=0;x{
lpMarks1[x+y*nWidth]=Out(x,y);//将原始图片灰度值存于lpMarks1中
}
}
//以下为腐蚀操作
for(y=1;y{
for(x=1;x{
s=t=0;
for(y1=-1;y1<2;y1++)
{
for(x1=-1;x1<2;x1++)
{
s=Out(x+x1,y+y1);
if(s>t)t=s;
}
}
lpMarks[x+y*nWidth]=t;//腐蚀操作结果存于lpMarks中
}
}
//用原始图象灰度值减去腐蚀操作结果灰度值
for(y=1;y{
for(x=1;x{
if(lpMarks1[x+y*nWidth]-lpMarks[x