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;
}