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