数学形态学处理程序实例.docx

上传人:b****6 文档编号:8191687 上传时间:2023-01-29 格式:DOCX 页数:32 大小:27.56KB
下载 相关 举报
数学形态学处理程序实例.docx_第1页
第1页 / 共32页
数学形态学处理程序实例.docx_第2页
第2页 / 共32页
数学形态学处理程序实例.docx_第3页
第3页 / 共32页
数学形态学处理程序实例.docx_第4页
第4页 / 共32页
数学形态学处理程序实例.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

数学形态学处理程序实例.docx

《数学形态学处理程序实例.docx》由会员分享,可在线阅读,更多相关《数学形态学处理程序实例.docx(32页珍藏版)》请在冰豆网上搜索。

数学形态学处理程序实例.docx

数学形态学处理程序实例

数学形态学处理程序实例

/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

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

当前位置:首页 > 解决方案 > 其它

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

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