www.pudn.com > 用形态学方法提取骨架线.rar > Morphology.cpp
// Morphology.cpp: implementation of the CMorphology class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "log.h"
#include "Morphology.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMorphology::CMorphology()
{
m_pSE=NULL;
m_nSEWidth=0;
}
CMorphology::~CMorphology()
{
if(m_pSE)
delete[] m_pSE;
}
bool CMorphology::Dilate(BYTE* pSrcBuf,BYTE* pDestBuf,int nSEType,int nWidth,int nHeight,BYTE* pSEType,int nSEWidth)
{
BYTE* pDest;
//>>若输出阵列为空,则输出结果到输入阵列
if(pDestBuf==NULL)
pDest=pSrcBuf;
else
pDest=pDestBuf;
//<<
//>>设置结构元素
if(nSEType>STRUCTURE_ELEMENT&&nSETypepTempBuf[(i+ii-m_nSEWidth/2)*nWidth+(j+jj-m_nSEWidth/2)])
Temp=pTempBuf[(i+ii-m_nSEWidth/2)*nWidth+(j+jj-m_nSEWidth/2)];
*
if(m_pSE[ii*m_nSEWidth+jj])
{
if(COLOR_BLACK==0)
bOK=bOK||(!pTempBuf[(i+ii-m_nSEWidth/2)*nWidth+(j+jj-m_nSEWidth/2)]);
else
bOK=bOK||(pTempBuf[(i+ii-m_nSEWidth/2)*nWidth+(j+jj-m_nSEWidth/2)]);
}
}
if(bOK)
pDest[i*nWidth+j]=COLOR_BLACK; //黑色
else
pDest[i*nWidth+j]=COLOR_WHITE;
}
}
*/
::memset(pDest,COLOR_WHITE,nWidth*nHeight);
for(int i=m_nSEWidth/2;i >若输出阵列为空,则输出结果到输入阵列
if(pDestBuf==NULL)
pDest=pSrcBuf;
else
pDest=pDestBuf;
//<<
//>>设置结构元素
if(nSEType>STRUCTURE_ELEMENT&&nSEType=1)
if(Temp=0)
{
if(COLOR_BLACK==0)
bOK=bOK&&(!pTempBuf[(i+ii-m_nSEWidth/2)*nWidth+(j+jj-m_nSEWidth/2)]);
else
bOK=bOK&&(pTempBuf[(i+ii-m_nSEWidth/2)*nWidth+(j+jj-m_nSEWidth/2)]);
}
}
}
if(bOK)
pDest[i*nWidth+j]=COLOR_BLACK;
else
pDest[i*nWidth+j]=COLOR_WHITE;
}
}
/*@@int ii=0;
while((ii=0)
{
if(COLOR_BLACK==0)
bOK=bOK&&(!pTempBuf[(i+ii-m_nSEWidth/2)*nWidth+(j+jj-m_nSEWidth/2)]);
else
bOK=bOK&&(pTempBuf[(i+ii-m_nSEWidth/2)*nWidth+(j+jj-m_nSEWidth/2)]);
}
}
jj++;
}
ii++;
}
if(bOK)
pDest[i*nWidth+j]=COLOR_BLACK;
else
pDest[i*nWidth+j]=COLOR_WHITE;
}*/
delete[] pTempBuf;
return true;
}
bool CMorphology::Skeletonizing(BYTE *pBuf, int nSEType, int nWidth, int nHeight)
{
SetSE(nSEType);
BYTE* pTempBuf=new BYTE[nWidth*nHeight]; //临时数组
BYTE* pTempBufSrc=new BYTE[nWidth*nHeight]; //临时源数组
::memcpy(pTempBufSrc,pBuf,nWidth*nHeight);
BYTE* pTempBufb=new BYTE[nWidth*nHeight]; //临时数组清0
::memset(pTempBufb,0,nWidth*nHeight);
BYTE* pTempBufc=new BYTE[nWidth*nHeight]; //临时数组清0
::memset(pTempBufc,0,nWidth*nHeight);
bool bContinue=true,bBlack=true;
int i,j;
while(bBlack)
{
bBlack=false;
Erode(pTempBufSrc,pTempBufb,nSEType,nWidth,nHeight);
for(i=0;(i >没有默认的结构元素,用给定的数组设置结构元素
if(nDefSEType==0)
{
if(nSEWidth>0)
m_nSEWidth=nSEWidth;
else
TRACE("结构元素宽度nWidth出错\n");
m_pSE=new BYTE[nSEWidth*nSEWidth];
::memcpy(m_pSE,pSEType,nSEWidth*nSEWidth);
return;
}
//<<
//>>有默认的结构元素
switch(nDefSEType)
{
case SE_SQUARE:
{
m_nSEWidth=3;
m_pSE=new BYTE[9];
BYTE btTemp[9]={
1,1,1,
1,1,1,
1,1,1};
::memcpy(m_pSE,&btTemp,9);
}
break;
case SE_RHOMBUS:
{
m_nSEWidth=3;
m_pSE=new BYTE[9];
BYTE btTemp[9]={
0,1,0,
1,1,1,
0,1,0};
::memcpy(m_pSE,&btTemp,9);
}
break;
default:
TRACE("没有该默认的结构元素\n");
}
//<<
return;
}
bool CMorphology::Open(BYTE* pSrcBuf,BYTE* pDestBuf,int nSEType,int nWidth,int nHeight,BYTE* pSEType,int nSEWidth)
{
Dilate(pSrcBuf,pDestBuf,nSEType,nWidth,nHeight,pSEType,nSEWidth);
Erode(pSrcBuf,pDestBuf,nSEType,nWidth,nHeight,pSEType,nSEWidth);
return true;
}
bool CMorphology::Skeleton(BYTE *pBuf, int nSEType, int nWidth, int nHeight)
{
/*BYTE* pTempBuf1=new BYTE[nWidth*nHeight];
BYTE* pTempBuf2=new BYTE[nWidth*nHeight];
BYTE* pTempBuf3=new BYTE[nWidth*nHeight];
//::memcpy(pTempBuf,pBuf);
BYTE SE_D1[9]={0,0,3,0,1,1,3,1,3};
BYTE SE_D2[9]={3,0,0,1,1,0,3,1,3};
BYTE SE_D3[9]={3,1,3,1,1,0,3,0,0};
BYTE SE_D4[9]={3,1,3,0,1,1,0,0,3};
BYTE SE_K1[9]={3,0,3,1,1,1,3,1,3};
BYTE SE_K2[9]={3,1,3,1,1,0,3,1,3};
BYTE SE_K3[9]={3,1,3,1,1,1,3,0,3};
BYTE SE_K4[9]={3,1,3,0,1,1,3,1,3};
Open(pBuf,pTempBuf1,0,nWidth,nHeight,(BYTE*)SE_D1,3);
Open(pBuf,pTempBuf2,0,nWidth,nHeight,(BYTE*)SE_D2,3);
Open(pBuf,pTempBuf3,0,nWidth,nHeight,(BYTE*)SE_K1,3);
AND(pTempBuf1,pTempBuf2,pBuf,nWidth,nHeight);
AND(pBuf,pTempBuf3,pBuf,nWidth,nHeight);
Open(pBuf,pTempBuf1,0,nWidth,nHeight,(BYTE*)SE_D2,3);
Open(pBuf,pTempBuf2,0,nWidth,nHeight,(BYTE*)SE_D3,3);
Open(pBuf,pTempBuf3,0,nWidth,nHeight,(BYTE*)SE_K2,3);
AND(pTempBuf1,pTempBuf2,pBuf,nWidth,nHeight);
AND(pBuf,pTempBuf3,pBuf,nWidth,nHeight);
Open(pBuf,pTempBuf1,0,nWidth,nHeight,(BYTE*)SE_D3,3);
Open(pBuf,pTempBuf2,0,nWidth,nHeight,(BYTE*)SE_D4,3);
Open(pBuf,pTempBuf3,0,nWidth,nHeight,(BYTE*)SE_K3,3);
AND(pTempBuf1,pTempBuf2,pBuf,nWidth,nHeight);
AND(pBuf,pTempBuf3,pBuf,nWidth,nHeight);
Open(pBuf,pTempBuf1,0,nWidth,nHeight,(BYTE*)SE_D4,3);
Open(pBuf,pTempBuf2,0,nWidth,nHeight,(BYTE*)SE_D1,3);
Open(pBuf,pTempBuf3,0,nWidth,nHeight,(BYTE*)SE_K4,3);
AND(pTempBuf1,pTempBuf2,pBuf,nWidth,nHeight);
AND(pBuf,pTempBuf3,pBuf,nWidth,nHeight);
delete[] pTempBuf1;
delete[] pTempBuf2;
delete[] pTempBuf3;
return true;
*/
SetSE(nSEType);
BYTE* pTempBufa=new BYTE[nWidth*nHeight]; //临时数组清0
::memset(pTempBufa,0,nWidth*nHeight);
BYTE* pTempBufb=new BYTE[nWidth*nHeight]; //临时数组清0
::memset(pTempBufb,0,nWidth*nHeight);
BYTE** pBufSK=new BYTE*[m_nSEWidth]; //临时数组清0
int j;
for(j=0;j >若输出阵列为空,则输出结果到输入阵列
if(pDestBuf==NULL)
pDest=pSrcBuf2;
else
pDest=pDestBuf;
//<<
for(int i=0;i >若输出阵列为空,则输出结果到输入阵列
if(pDestBuf==NULL)
pDest=pSrcBuf2;
else
pDest=pDestBuf;
//<<
for(int i=0;i >若输出阵列为空,则输出结果到输入阵列
if(pDestBuf==NULL)
pDest=pSrcBuf2;
else
pDest=pDestBuf;
//<<
for(int i=0;i