模板匹配算法实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

模板匹配算法实现

在机器视觉识别的过程中,常常需要把不同的待测图像和标准图像进行比较,一种最常用的图像识别技术就

是模板匹配.下面是具体实现的过程:

/*************************************************************************

*

* 函数名称:

* TemplateMatchDIB()

*

* 参数:

* LPSTR lpDIBBits - 指向源DIB图像指针

* LPSTR lpDIBBitsBK - 指向背景DIB图像指针

* LONG lWidth - 源图像宽度(象素数)

* LONG lHeight - 源图像高度(象素数)

* LONG lTemplateWidth - 模板图像宽度(象素数)

* LONG lTemplateHeight - 模板图像高度(象素数)

*

* 返回值:

* BOOL - 运算成功返回TRUE,否则返回FALSE。

*

* 说明:

* 该函数用于对图像进行模板匹配运算。

*

* 要求目标图像为255个灰度值的灰度图像。

************************************************************************/

BOOL WINAPI TemplateMatchDIB (LPSTR lpDIBBits, LPSTR lpTemplateDIBBits, LONG lWidth, LONG

lHeight,

LONG lTemplateWidth,LONG l T emplateHeight)

{

// 指向源图像的指针

LPSTR lpSrc,lpTemplateSrc;

// 指向缓存图像的指针

LPSTR lpDst;

// 指向缓存DIB图像的指针

LPSTR lpNewDIBBits;

HLOCAL hNewDIBBits;

//循环变量

long i;

long j;

long m;

long n;

//中间结果

double dSigmaST;

double dSigmaS;

double dSigmaT;

//相似性测度

double R;

//最大相似性测度

double MaxR;

//最大相似性出现位置

long lMaxWidth;

long lMaxHeight;

//像素值

unsigned char pixel;

unsigned char templatepixel;

// 图像每行的字节数

LONG lLineBytes,lTemplateLineBytes;

// 暂时分配内存,以保存新图像

hNewDIBBits = LocalAlloc(LHND, l W idth * lHeight);

if (hNewDIBBits == NULL)

{

// 分配内存失败

return FALSE;

}

// 锁定内存

lpNewDIBBits = (char * )LocalLock(hNewDIBBits);

// 初始化新分配的内存,设定初始值为255

lpDst = (char *)lpNewDIBBits;

memset(lpDst, (BYTE)255, l W idth * lHeight);

// 计算图像每行的字节数

lLineBytes = WIDTHBYTES(l W idth * 8); lTemplateLineBytes = WIDTHBYTES(lTemplateWidth * 8);

//计算dSigmaT

dSigmaT = 0;

for (n = 0;n < lTemplateHeight ;n++)

{

for(m = 0;m < lTemplateWidth ;m++)

{

// 指向模板图像倒数第j行,第i个象素的指针lpTemplateSrc = (char *)lpTemplateDIBBits + lTemplateLineBytes * n + m;

templatepixel = (unsigned char)*lpTemplateSrc;

dSigmaT += (double)templatepixel*templatepixel;

}

}

//找到图像中最大相似性的出现位置

MaxR = 0.0;

for (j = 0;j < lHeight - lTemplateHeight +1 ;j++)

{

for(i = 0;i < lWidth - lTemplateWidth + 1;i++)

{

dSigmaST = 0;

dSigmaS = 0;

for (n = 0;n < lTemplateHeight ;n++)

{

for(m = 0;m < l T emplateWidth ;m++)

{

// 指向源图像倒数第j+n行,第i+m个象素的指针

lpSrc = (char *)lpDIBBits + lLineBytes * (j+n) + (i+m);

// 指向模板图像倒数第n行,第m个象素的指针lpTemplateSrc = (char *)lpTemplateDIBBits + lTemplateLineBytes * n + m;

pixel = (unsigned char)*lpSrc;

templatepixel = (unsigned char)*lpTemplateSrc;

dSigmaS += (double)pixel*pixel;

dSigmaST += (double)pixel*templatepixel;

}

}

//计算相似性

R = dSigmaST / ( sqrt(dSigmaS)*sqrt(dSigmaT));

//与最大相似性比较

if (R > MaxR)

{

MaxR = R;

相关文档
最新文档