图像匹配之归一化积相关灰度匹配

        基于灰度的匹配是图像匹配中的一类重要算法,也称相关匹配。它基于空间二维滑动模板实现,并在制导导航方面得到了广泛应用。目前基于灰度的匹配算法有MAD算法、序贯相似性检测法等

        基本原理:



当模板与原图找到最佳匹配部分时,R值最大,原理类似于:





当a,b越接近时,R值越大,趋近于1。


代码如下(我取b通道做图像匹配):

 
 

#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
using namespace cv;

        double dbMax = 0;                                       //最大像素值
	double dSigmaST, dSigmaS, dSigmaT;                      //中间结果
	double   R;                                             //相似性测量
	int   i, j, m, n ;
	int  nMaxWidth, nMaxHeight;
	CvScalar  pixelSrc, pixelTem, pixel0, pixel1;

	IplImage* TemplateSrc = cvLoadImage("D:\\20.jpg");        //模板图像
	IplImage* src = cvLoadImage("D:\\24.jpg");                //原图

	//计算dSigmaT
	dSigmaT = 0;
	for (n = 0; n < TemplateSrc->height; n++)
	{
		for (m = 0; m < TemplateSrc->width; m++)
		{
			pixelTem = cvGet2D(TemplateSrc, n, m);
			dSigmaT += (double)pixelTem.val[0] * pixelTem.val[0];
		}
	}

	//找到图像中最大相似性出现的位置
	for (j = 0; j < src->height - TemplateSrc->height+1; j++)
	{
		for (i = 0; i < src->width - TemplateSrc->width + 1; i++)
		{
			dSigmaST = 0;
			dSigmaS = 0;
			for (n = 0; n < TemplateSrc->height; n++)
			{
				for (m = 0; m < TemplateSrc->width; m++)
				{
					pixelSrc = cvGet2D(src, j+n, i+m);
					pixelTem = cvGet2D(TemplateSrc, n, m);
					dSigmaS += (double)pixelSrc.val[0] * pixelSrc.val[0];
					dSigmaST += (double)pixelSrc.val[0] * pixelTem.val[0];
				}
			}
			R = dSigmaST / (sqrt(dSigmaS)*sqrt(dSigmaT));    //计算相似性
			if (R > dbMax)         //与最大相似性比较
			{
				dbMax = R;
				nMaxHeight = j;
				nMaxWidth = i;
			}
		}
	}

	//对目标像素进行赋值
	for (j = nMaxHeight; j <TemplateSrc->height + nMaxHeight; j++)
	{
		for (i = nMaxWidth; i < TemplateSrc->width + nMaxWidth; i++)
		{
			pixel0 = cvGet2D(src, j , i );
			pixel1.val[0] = pixel0.val[0] / 2;
			pixel1.val[1] = pixel0.val[1] / 2;
			pixel1.val[2] = pixel0.val[2] / 2;
			cvSet2D(src,j, i, pixel1);
		}
	}


	cvNamedWindow("White", CV_WINDOW_AUTOSIZE);
	cvShowImage("White", src);
	

	while (1)
	{
		if (cvWaitKey(100) == 27) break;
	}
	cvDestroyWindow("White");
	cvReleaseImage(&src);
	exit(0);


调试效果如图:

原图:



模板图:


效果图:







你可能感兴趣的:(算法,opencv,图像匹配,归一化积相关灰度匹配)