基于灰度的匹配是图像匹配中的一类重要算法,也称相关匹配。它基于空间二维滑动模板实现,并在制导导航方面得到了广泛应用。目前基于灰度的匹配算法有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);
调试效果如图:
原图:
模板图:
效果图: