【图像处理】C++实现模板匹配


//
	//预先判断——3*3十字中心——区域是否相似,如果相似,则再匹配判断。这样可以减少判断次数。
	//前提:模板大于9*9
	BOOL Judgement(BYTE *pTempDataBuf, BYTE *pTemplateBuf, int nTemplateHeight, int nTemplateWidth); //预先判断

/*
//模板匹配:
//复制图像上的一块模板大小的区域,与模板进行匹配,返回目标物的类型的数据;(点,则返回ShapePoint)
//参数:BYTE *pTempDataBuf —— 从图像上复制模板大小的块
		BYTE *pTemplateBuf —— 模板数据
		int nTempHeight    —— 模板高
		int nTempWidth     —— 模板宽

		int LeftDev —— 模板中边界与目标点的左偏量
		int RightDev—— 模板中边界与目标点的右偏量
*/
	//用来判断是否匹配成功
	BOOL TemplateMatch_SSD(BYTE *pTempDataBuf, BYTE *pTemplateBuf, int nTemplateHeight, int nTemplateWidth);//像素差平方和匹配
	BOOL TemplateMatch_CC(BYTE *pTempDataBuf, BYTE *pTemplateBuf, int nTemplateHeight, int nTemplateWidth);//互相关匹配
	BOOL TemplateMatch_NCC(BYTE *pTempDataBuf, BYTE *pTemplateBuf, int nTemplateHeight, int nTemplateWidth);//归一化互相关匹配


//像素差平方和匹配
BOOL CTemplateMatching::TemplateMatch_SSD(BYTE *pTempDataBuf, BYTE *pTemplateBuf, int nTemplateHeight, int nTemplateWidth)
{
	int m,n;
	double dSSD = 0;//差平方和
	
    unsigned char tempDatapixel;//像素值
    unsigned char templatepixel;
	
	for (m=0; m<nTemplateHeight; m++)
    {
        for(n=0; n<nTemplateWidth; n++)
        {
			tempDatapixel = pTempDataBuf[TPos(m,n)];//模板块像素
            templatepixel = pTemplateBuf[TPos(m,n)];//模板像素
            dSSD += (double)(tempDatapixel - templatepixel)*(tempDatapixel - templatepixel); //模板块与模板里,所有像素值的平方和
        }
    }
	
	if (dSSD < 100)   //SSD测度的临界值
		return 1;
	else
		return 0;
}
	
//互相关匹配
BOOL CTemplateMatching::TemplateMatch_CC(BYTE *pTempDataBuf, BYTE *pTemplateBuf, int nTemplateHeight, int nTemplateWidth)
{
	int m,n;
	double dSigmaST = 0;//中间结果——pTempDataBuf与pTemplateBuf乘积和
    double dSigmaS = 0; //中间结果——pTempDataBuf平方和
    double dSigmaT = 0; //中间结果——pTemplateBuf平方和
	double R = 0;//相似性测度

    unsigned char tempDatapixel;//像素值
    unsigned char templatepixel;

	for (m=0; m<nTemplateHeight; m++)
    {
        for(n=0; n<nTemplateWidth; n++)
        {
			tempDatapixel = pTempDataBuf[TPos(m,n)];//模板块像素
            templatepixel = pTemplateBuf[TPos(m,n)];//模板像素
			dSigmaS += (double)tempDatapixel*tempDatapixel; //模板块里,所有像素值的平方和
            dSigmaT += (double)templatepixel*templatepixel; //模板里,所有像素值的平方和
            dSigmaST += (double)tempDatapixel*templatepixel; //模板块与模板里,所有像素值的平方和
        }
    }

	R = dSigmaST/(sqrt(dSigmaT)*sqrt(dSigmaS));//相似性测度公式
	if (R > 0.85)   //相似性测度的临界值
		return 1;
	else
		return 0;
}

//归一化互相关匹配
BOOL CTemplateMatching::TemplateMatch_NCC(BYTE *pTempDataBuf, BYTE *pTemplateBuf, int nTemplateHeight, int nTemplateWidth)
{
	int m,n;
	double dSumST = 0;//中间结果——(Sxy - S')*(Txy - T')之和
    double dSumS = 0; //中间结果——(Sxy - S')平方和
    double dSumT = 0; //中间结果——(Txy - T')平方和

	double dSPixelSum = 0;
	double dTPixelSum = 0;

	double dNCC = 0;//归一化相似测度
	
    unsigned char tempDatapixel;//像素值
    unsigned char templatepixel;

	unsigned char AveraryDatapixel; //pTempDataBuf平均值
	unsigned char AveraryTemplatepixel;//pTemplateBuf平均值

	for (m=0; m<nTemplateHeight; m++)
    {
        for(n=0; n<nTemplateWidth; n++)
        {
			tempDatapixel = pTempDataBuf[TPos(m,n)];//模板块像素
            templatepixel = pTemplateBuf[TPos(m,n)];//模板像素
			dSPixelSum += tempDatapixel;
			dTPixelSum += templatepixel;
			
        }
    }

	AveraryDatapixel = (unsigned char)dSPixelSum/(nTemplateHeight*nTemplateWidth);
	AveraryTemplatepixel = (unsigned char)dTPixelSum/(nTemplateHeight*nTemplateWidth);

	for (m=0; m<nTemplateHeight; m++)
    {
        for(n=0; n<nTemplateWidth; n++)
        {
			tempDatapixel = pTempDataBuf[TPos(m,n)];//模板块像素
            templatepixel = pTemplateBuf[TPos(m,n)];//模板像素
			dSumS  += (double)(tempDatapixel - AveraryDatapixel)*(tempDatapixel - AveraryDatapixel); 
			dSumT  += (double)(templatepixel - AveraryTemplatepixel)*(templatepixel - AveraryTemplatepixel);
			dSumST += (double)(tempDatapixel - AveraryDatapixel)*(templatepixel - AveraryTemplatepixel);
        }
    }
	
	dNCC = dSumST/(sqrt(dSumS)*sqrt(dSumT));	归一化相似测度公式
	if (dNCC > 0.85)   //相似性测度的临界值
		return 1;
	else
		return 0;
}

//
/*
//预先判断——3*3十字中心——区域是否相似,如果相似,则再匹配判断。这样可以减少判断次数。
//前提:模板大于9*9
*/
BOOL CTemplateMatching::Judgement(BYTE *pTempDataBuf, BYTE *pTemplateBuf, int nTemplateHeight, int nTemplateWidth)
{
	int m,n;
	double dSum = 0;

	int H = 0;//宽高都分成四份,一份的高度
	int W = 0;//一份的宽度
	
	H = nTemplateHeight/4;
	W = nTemplateWidth/4;

	//第一个3*3(上)
	for (m=H-1;m<H+2;m++)
	{
		for (n=2*W-1;n<2*W+2;n++)
		{
			if (pTempDataBuf[TPos(m,n)] == pTemplateBuf[TPos(m,n)])
				dSum++;
		}
	}

	//第二个3*3(左)
	for (m=2*H-1;m<2*H+2;m++)
	{
		for (n=W-1;n<W+2;n++)
		{
			if (pTempDataBuf[TPos(m,n)] == pTemplateBuf[TPos(m,n)])
				dSum++;
		}
	}

	//第三个3*3(中)
	for (m=2*H-1;m<2*H+2;m++)
	{
		for (n=2*W-1;n<2*W+2;n++)
		{
			if (pTempDataBuf[TPos(m,n)] == pTemplateBuf[TPos(m,n)])
				dSum++;
		}
	}

	//第四个3*3(右)
	for (m=2*H-1;m<2*H+2;m++)
	{
		for (n=3*W-1;n<3*W+2;n++)
		{
			if (pTempDataBuf[TPos(m,n)] == pTemplateBuf[TPos(m,n)])
				dSum++;
		}
	}

	//第五个3*3(下)
	for (m=3*H-1;m<3*H+2;m++)
	{
		for (n=2*W-1;n<2*W+2;n++)
		{
			if (pTempDataBuf[TPos(m,n)] == pTemplateBuf[TPos(m,n)])
				dSum++;
		}
	}

	//判断条件,达到要求,则表示预匹配准确,反之,预匹配失败,进行下个模板匹配
	if (dSum >= (5-1)*9)   //全部个数3*3*5
		return 1;
	else
		return 0;
}


  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
图像模板匹配是一种常见的图像处理方法,用于在一幅图像中寻找与给定模板最相似的部分。它在计算机视觉和模式识别领域有着广泛的应用。 图像模板匹配的基本思想是将模板与图像中的每一个可能位置进行比较,找出最相似的部分。它可以用于目标检测、物体识别、图像跟踪等任务。 在图像模板匹配中,首先需要选择一个合适的模板。模板是一个与待匹配部分相似的小图像,通常是由人工标定或从训练数据中学习得到的。然后,将模板与图像中的每一个可能位置进行比较。 常见的图像模板匹配方法有两种:基于像素的方法和基于特征的方法。基于像素的方法是将模板与图像的每一个像素进行逐一比较,计算它们的差异度或相关性,然后找出最小差异度或最大相关性对应的位置。而基于特征的方法则是提取图像和模板的特征,并通过特征的相似性来进行匹配。 图像模板匹配的核心问题是相似度度量。常用的相似度度量方法有差值平方和、互相关、归一化互相关等。对于大型图像和模板,为了提高匹配速度,还可以使用加速方法,如快速傅里叶变换(FFT)来加速计算。 当找到最相似的部分后,可以进行后续的处理,如目标检测中的边界框标定,物体识别中的分类等。但图像模板匹配也有一定的局限性,特别是对于光照变化、旋转变化、尺度变化等情况,匹配的效果可能会受到影响。 综上所述,图像模板匹配是一种常见的图像处理方法,通过与给定模板进行比较,找到图像中最相似的部分。它具有广泛的应用领域,但也存在一定的局限性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值