⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filter.cpp

📁 数学形态学提供了一种以形态或集合论为基础对图像进行分析理解的工具。可以用来去除噪声、抽取骨架、插补、分割、多分辨率分析、匹配等。 包括四个主要的算符:扩张(膨胀)○+
💻 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)*Height<Size||(Width-16)*Height>Size)	//非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;y<Height-nBorder;y++)	//因为窗口中心点要受模板大小影响
		for(DWORD x=0+nBorder;x<Width-nBorder;x++)
		{
			dwOffset=Size-Width-y*Width+x;
			for(int i=-nBorder;i<=nBorder;i++)
				for(int j=-nBorder;j<=nBorder;j++)
				{

					nTempNum=m_pTemplate[i*m_TemplateWidth+j+nBorder*m_TemplateWidth+nBorder];
					fResult+=pBuffer[dwOffset+(-i)*Width+j]*nTempNum;
					m_lCount++;
				}
			

			fResult*=m_fCoef;
			pTempBuffer[dwOffset]=CutOverflow(fResult);
			fResult=0;
		}
	::memcpy(pBuffer,pTempBuffer,Size);
	delete[] pTempBuffer;



}

BYTE CFilter::CutOverflow(float fNum)
{
	if(fNum>255.0)
		return (BYTE)255;
	else if(fNum<0.0)
		return (BYTE)0;
	else
		return (BYTE)fNum;	//!!对于权相加非0的模板,比如高斯模板,此返回值易引入不同颜色
}

long CFilter::GetCount()
{
	return m_lCount;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -