www.pudn.com > 用形态学方法提取骨架线.rar > Filter.cpp


// Filter.cpp: implementation of the CFilter class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Log.h" 
#include "Filter.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CFilter::CFilter() 
{ 
	m_pTemplate	=	NULL; 
	m_lCount=0; 
} 
 
CFilter::~CFilter() 
{ 
	if(m_pTemplate) 
	{ 
		delete[] m_pTemplate; 
	} 
	 
	 
} 
 
BOOL CFilter::Filter(const int nDefTemplate,BYTE *pBuffer,DWORD Size,DWORD Width, DWORD Height) 
{ 
	 
	SetTemplate(nDefTemplate); 
	if(!pBuffer)//Buf为空 
	{ 
		return false; 
	} 
 
	if((Width+16)*HeightSize)	//非8位色彩的位图 
	{ 
		//MYTODO:转化到8位 
		//应该在CBitmap类中RGB->YUV,只取亮度信息 
		AfxMessageBox("不支持非256色位图"); 
		//return false; 
	} 
	Multiply(pBuffer,Size,Width,Height); 
	return true; 
 
} 
 
 
void CFilter::SetTemplate(const int nDefTemplate) 
{ 
	if(m_pTemplate) 
	{ 
		delete[] m_pTemplate; 
	} 
 
	switch(nDefTemplate) 
	{ 
	case TEMPLATE_LOG: 
		{ 
			m_TemplateWidth=5; 
			m_fCoef=1; 
			BYTE btTemplateSize=m_TemplateWidth*m_TemplateWidth; 
			m_pTemplate=new char[btTemplateSize]; 
			char btTemp[25]={ 
			-2,-4,-4,-4,-2, 
			-4, 0, 8, 0,-4, 
			-4, 8,24, 8,-4, 
			-4, 0, 8, 0,-4, 
			-2,-4,-4,-4,-2}; 
			::memcpy(m_pTemplate,&btTemp,btTemplateSize); 
		} 
		break; 
	case TEMPLATE_LAPLACIAN: 
		{ 
			m_TemplateWidth=3; 
			m_fCoef=1; 
			BYTE btTemplateSize=m_TemplateWidth*m_TemplateWidth; 
			m_pTemplate=new char[btTemplateSize]; 
			char btTemp[9]={-1,-1,-1,-1,9,-1,-1,-1,-1}; 
			 
			::memcpy(m_pTemplate,&btTemp,btTemplateSize); 
		} 
		break; 
	case TEMPLATE_GAUSS: 
		{ 
			m_TemplateWidth=3; 
			m_fCoef=1/16.0;	//不能1/16,否则会变成0 
			BYTE btTemplateSize=m_TemplateWidth*m_TemplateWidth; 
			m_pTemplate=new char[btTemplateSize]; 
			char btTemp[9]={1,2,1,2,4,2,1,2,1}; 
			 
			::memcpy(m_pTemplate,&btTemp,btTemplateSize); 
		} 
		break; 
	default: 
		TRACE("没有该默认的模板"); 
	} 
 
} 
 
void CFilter::Multiply(BYTE *pBuffer, DWORD Size, DWORD Width, DWORD Height) 
{ 
	int nBorder=m_TemplateWidth/2;	//需要空开的大小 
	DWORD dwOffset=0; 
	float fResult=0; 
	int nTempNum=0; 
	BYTE* pTempBuffer=new BYTE[Size]; 
	for(DWORD y=0+nBorder;y255.0) 
		return (BYTE)255; 
	else if(fNum<0.0) 
		return (BYTE)0; 
	else 
		return (BYTE)fNum;	//!!对于权相加非0的模板,比如高斯模板,此返回值易引入不同颜色 
} 
 
long CFilter::GetCount() 
{ 
	return m_lCount; 
}