基于灰度的匹配是图像匹配中的一类重要算法,也称相关匹配。它基于空间二维滑动模板实现,并在制导导航方面得到了广泛应用。目前基于灰度的匹配算法有MAD算法、序贯相似性检测法等
基本原理:
当模板与原图找到最佳匹配部分时,R值最大,原理类似于:
代码如下(我取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);
调试效果如图:
原图:
模板图:
效果图: