查询图像上的匹配块

/*************************************************************************  
    *  
    *   函数名称:  
    *       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   lTemplateHeight)  
  {  
  //   指向源图像的指针  
  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,   lWidth   *   lHeight);  
   
  if   (hNewDIBBits   ==   NULL)  
  {  
  //   分配内存失败  
  return   FALSE;  
  }  
   
  //   锁定内存  
  lpNewDIBBits   =   (char   *   )LocalLock(hNewDIBBits);  
   
  //   初始化新分配的内存,设定初始值为255  
  lpDst   =   (char   *)lpNewDIBBits;  
  memset(lpDst,   (BYTE)255,   lWidth   *   lHeight);  
   
  //   计算图像每行的字节数  
  lLineBytes   =   WIDTHBYTES(lWidth   *   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   <   lTemplateWidth   ;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;  
  lMaxWidth   =   i;  
  lMaxHeight   =   j;  
  }  
  }  
  }  
   
  //将最大相似性出现区域部分复制到目标图像  
  for   (n   =   0;n   <   lTemplateHeight   ;n++)  
  {  
  for(m   =   0;m   <   lTemplateWidth   ;m++)  
  {  
  lpTemplateSrc   =   (char   *)lpTemplateDIBBits   +   lTemplateLineBytes   *   n   +   m;  
  lpDst   =   (char   *)lpNewDIBBits   +   lLineBytes   *   (n+lMaxHeight)   +   (m+lMaxWidth);  
  *lpDst   =   *lpTemplateSrc;  
  }  
  }  
   
  //   复制图像  
  memcpy(lpDIBBits,   lpNewDIBBits,   lWidth   *   lHeight);  
   
  //   释放内存  
  LocalUnlock(hNewDIBBits);  
  LocalFree(hNewDIBBits);  
   
  //   返回  
  return   TRUE;  
  }   
   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像匹配算法是一种用于图像处理的算法,主要用于寻找两幅图像中相似的图像。在Matlab中,可以使用以下步骤实现图像匹配算法: 1. 读取两幅图像并将其转换为灰度图像。 ``` img1 = imread('image1.jpg'); img2 = imread('image2.jpg'); gray1 = rgb2gray(img1); gray2 = rgb2gray(img2); ``` 2. 定义图像的大小和步长。 ``` blockSize = 16; stepSize = 8; ``` 3. 定义一个函数来计算两个图像之间的差异。 ``` function diff = blockDiff(block1, block2) diff = sum(sum(abs(block1 - block2))); end ``` 4. 定义一个函数来寻找在第二幅图像中与给定图像最相似的图像。 ``` function [bestBlock, bestDiff] = findBestBlock(block, img, blockSize, stepSize) [rows, cols] = size(img); bestBlock = zeros(blockSize, blockSize); bestDiff = 99999999; for i = 1:stepSize:(rows - blockSize + 1) for j = 1:stepSize:(cols - blockSize + 1) currentBlock = img(i:(i+blockSize-1), j:(j+blockSize-1)); diff = blockDiff(block, currentBlock); if diff < bestDiff bestBlock = currentBlock; bestDiff = diff; end end end end ``` 5. 遍历第一幅图像中的所有图像,并在第二幅图像中寻找与其最相似的图像。 ``` [rows, cols] = size(gray1); blocks1 = mat2cell(gray1, blockSize*ones(1,rows/blockSize), blockSize*ones(1,cols/blockSize)); blocks2 = mat2cell(gray2, blockSize*ones(1,rows/blockSize), blockSize*ones(1,cols/blockSize)); matchedBlocks = cell(size(blocks1)); for i = 1:size(blocks1, 1) for j = 1:size(blocks1, 2) [bestBlock, bestDiff] = findBestBlock(blocks1{i,j}, gray2, blockSize, stepSize); matchedBlocks{i,j} = bestBlock; end end ``` 6. 将匹配图像重新组合成一幅图像。 ``` matchedImg = cell2mat(matchedBlocks); imshow(matchedImg); ``` 这样就可以实现图像匹配算法了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值