您的位置:首页 > 其它

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

2015-09-11 20:28 295 查看
基于灰度的匹配是图像匹配中的一类重要算法,也称相关匹配。它基于空间二维滑动模板实现,并在制导导航方面得到了广泛应用。目前基于灰度的匹配算法有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");                //原图//计算dSigmaTdSigmaT = 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);
调试效果如图:原图:模板图:效果图:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: