28.模板匹配

1.模板匹配(Template Match)

模板匹配介绍
相关API演示
代码演示

2.模板匹配

在这里插入图片描述

  • 介绍
  • 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。
  • 所以模板匹配首先需要一个模板图像T(给定的子 图像)
  • 另外需要一个待检测的图像-源图像S
  • 工作方法,在带检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。

3.模板匹配介绍——匹配算法介绍

opencv提供了六种常见的匹配算法

  • 计算平方不同
    在这里插入图片描述
  • 计算相关性
    在这里插入图片描述
  • 计算相关系数
    在这里插入图片描述
    在这里插入图片描述
    (下面归一化的三种方法)
  • 计算归一化平方不同
    在这里插入图片描述

值越小,相关性越大

  • 计算归一化相关性
    在这里插入图片描述

值越大,相关性越大

  • 计算归一化相关系数
    在这里插入图片描述
    上诉公式在opencv中的表示方法
    在这里插入图片描述

4.相关API介绍

4.1

matchTemplate(
InputAurry image,//源图像,必须是8-bit或者32-bit浮点数图像
InputAurry templ,//模板图像,类型必须与输入图像一样
OutputArray result,//输出结果,必须是单通道32为浮点数,
                //假设源图像W*H,模板图像w*h,则结果必须为W-w+1,H-h+1的大小
int method,//使用的匹配方法
InputArrray mask=noArray()
)

4.2 模板匹配的方法

enum cv::TemplateMatchModes{
    cv::TM_SQDIFF=0;
    cv::TM_SQDIFF_NORMED=1;
    cv::TM_CCORR=2;
    cv::TM_CCORR_NORMED=3;
    cv::TM_CCOEFF=4;
    cv::TM_CCOEFF_NORMED=5;
}

4.3 minMaxLoc()函数

  • 查找全局最小和最大数组元素并返回它们的值和它们的位置。
void minMaxLoc(InputArray src, 
               CV_OUT double* minVal,
               CV_OUT double* maxVal=0, 
               CV_OUT Point* minLoc=0,
               CV_OUT Point* maxLoc=0, 
               InputArray mask=noArray()
);
参数1:InputArray类型的src,输入单通道数组(图像)。
参数2double*类型的minVal,返回最小值的指针。若无须返回,此值置为NULL。
参数3double*类型的maxVal,返回最大值的指针。若无须返回,此值置为NULL。
参数4:Point*类型的minLoc,返回最小位置的指针(二维情况下)。若无须返回,此值置为NULL。
参数5:Point*类型的maxLoc,返回最大位置的指针(二维情况下)。若无须返回,此值置为NULL。
参数6:InputArray类型的mask,用于选择子阵列的可选掩膜。

5.演示代码:

void Match_Demo(int,void*){
    Mat img_display;
    src.copyTo(img_display);
    int  result_rows = src.rows - temp.rows + 1;
    int  result_cols = src.cols - temp.cols + 1;   
    dst.creat(Size(result_rows),Size(result_cols ),CV_32FC1);
    
    matchTemplate(src,temp,dst,match_method);
    normalize(dst,dst,0,1,NORM_MINMAX,-1,MAT());
    
    double minValue,maxCalue;
    Point minLoc;//最小值的位置
    Point maxLoc;//最大值的位置
    Point matchLoc;
    
    minMaxLoc(dst,&minValue,&maxValue,&minLoc,&maxLoc,MAt());
    //此处要区分方法
    if(match_method==TM_SQDIFF||match_method==TM_SQDIFF_NORMED){
        matchLoc=minLoc;
    }
    else{
        matchLoc=maxLoc;
    }
    
    rectangle(img_display,matchloc,Point(matchLoc.x+temp.cols,
    matchLoc.y+termp.rows),Scalar::all(0),2,LINE_AA);
    
    rectangle(dst,matchloc,Point(matchLoc.x+temp.cols,
    matchLoc.y+termp.rows),Scalar::all(0),2,LINE_AA);
    
    imshow(OUTPUT_T,dst);
    imshow(match_t,img_display);
    return ;
}

6.课外扩展

Point类
matchTemplate函数
各类模板匹配算法的了解

7.出现问题

TM_CCORR匹配出现问题
(原因:这个算法有时候会失真)

### 模板匹配在字符识别中的应用 模板匹配是一种常见的模式识别技术,广泛应用于字符识别领域。其核心思想是比较目标图像与预定义的模板之间的相似性,从而找到最佳匹配位置或类别。 #### 基本原理 模板匹配通过比较输入图像中的子区域与预先存储的标准模板来完成识别任务。通常采用某种相似性度量函数评估两者间的差异程度。常用的相似性度量包括归一化互相关系数、均方误差等[^2]。 #### 实现过程 以下是模板匹配用于字符识别的主要实现环节: 1. **预处理阶段** 输入图像可能包含噪声或者不均匀光照影响,因此需要对其进行必要的增强操作。这一步骤涉及灰度转换、二值化以及形态学运算等内容[^1]。 2. **分割定位** 字符串被分解成单独的字符单元以便后续逐一分析。这一部分依赖边缘检测算法如Sobel算子或是连通域标记等方式获取候选对象的位置信息[^3]。 3. **特征提取** 针对每一个分离出来的字符图案,提取能够反映该符号本质属性的关键参数作为描述向量。这些特性可以是几何结构上的(比如宽度高度比例),也可以是从拓扑关系角度出发考虑闭合路径数目等等。 4. **匹配判定** 利用上述构建好的表征数据同数据库里的标准样本做对比测试,选取得分最高的那一个当作最终预测标签输出。 下面给出一段简单的 MATLAB 示例代码展示如何利用基本的相关性计算来进行简单数字'0'到'9'的手写体辨识: ```matlab % 加载训练集和测试图片 trainImages = imread('digits_train.png'); testImage = imread('digit_test.png'); % 定义窗口大小并初始化变量 windowSize = 28; scoreMatrix = zeros(size(trainImages,3), floor((size(testImage,1)-windowSize)/step)+1); for i=1:size(trainImages,3) template = trainImages(:,:,i); % 移动滑动窗遍历整个待测图象 for row=1:step:(size(testImage,1)-windowSize) subImg = testImage(row:(row+windowSize-1), :); % 计算当前块与模版间标准化交叉关联值 score = normxcorr2(template,double(subImg)); [~,maxCol]= max(score(:)); colIdx = mod(maxCol-1,size(score,2))+1; % 存储最大响应对应的列索引至评分矩阵相应位置处 scoreMatrix(i,(row-step)/step+1)=colIdx; end end % 找出每行最高分数对应的最佳匹配分类编号 [maxScores,bestMatches] = max(scoreMatrix,[],1); predictedLabel = bestMatches(mod(find(diff([zeros(1,row/step),bestMatches])~=0),numel(bestMatches))+1); disp(['Predicted Label:', num2str(predictedLabel)]); ``` 此脚本假定所有手写字母已经被裁剪调整为固定尺寸,并且存放在单张多通道PNG文件当中形成我们的参照集合;而实际拍摄下来的场景照片则充当查询素材供我们去探寻其中所隐藏的目标实体是什么样的具体数值形式表现出来而已。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值