模板匹配算法(有案例)

导航栏

  • [1. 模板匹配算法](#1. 模板匹配算法)
    • [1.1 差的平方和](#1.1 差的平方和)
    • [1.2 归一化的平方和](#1.2 归一化的平方和)
    • [1.3 互相关](#1.3 互相关)
    • [1.4 归一化互相关](#1.4 归一化互相关)
    • [1.5 相关系数互相关](#1.5 相关系数互相关)
    • [1.6 归一化相关系数互相关](#1.6 归一化相关系数互相关)
  • [2. 归一化差的平方和(实战)](#2. 归一化差的平方和(实战))

1. 模板匹配算法

1.1 差的平方和

R ( x , y ) = ∑ x ′ , y ′ ( T ( x ′ , y ′ ) − I ( x + x ′ , y + y ′ ) ) 2 R(x,y) = \sum_{x',y'}(T(x',y') - I(x + x',y + y'))^2 R(x,y)=x′,y′∑(T(x′,y′)−I(x+x′,y+y′))2
T 为模板图像,I 为匹配图像;在匹配图像的**(x,y)位置,向右 x',向下y'** 框定识别区域。通过计算模板与图像区域的平方差来进行匹配,最好的匹配值为0,匹配越差,匹配值越大。

1.2 归一化的平方和

R ( x , y ) = ∑ x ′ , y ′ ( T ( x ′ , y ′ ) − I ( x + x ′ , y + y ′ ) ) 2 ∑ x ′ , y ′ T ( x ′ , y ′ ) 2 ⋅ ∑ x ′ , y ′ I ( x + x ′ , y + y ′ ) 2 R(x,y) = \frac{\sum_{x',y'}(T(x',y') - I(x + x',y + y'))^2}{\sqrt{\sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'}I(x + x',y + y')^2}} R(x,y)=∑x′,y′T(x′,y′)2⋅∑x′,y′I(x+x′,y+y′)2 ∑x′,y′(T(x′,y′)−I(x+x′,y+y′))2

其中,**R(x,y)表示原始图像中以 (x,y)**为中心的区域与模板的归一化平方差匹配程度。分母部分是对原始图像区域和模板图像的像素值进行归一化处理,使得匹配结果不受图像亮度和对比度的影响。

这种方法通过计算归一化的平方差来衡量原始图像与模板图像的相似性。最佳匹配结果为0,表示两个图像完全匹配。匹配越差,匹配值越大,但最大不会超过1。

1.3 互相关

R ( x , y ) = ∑ x ′ , y ′ ( T ( x ′ , y ′ ) ⋅ I ( x + x ′ , y + y ′ ) ) R(x,y) = \sum_{x',y'}(T(x',y') \cdot I(x + x',y + y')) R(x,y)=x′,y′∑(T(x′,y′)⋅I(x+x′,y+y′))

其中,**R(x,y)表示原始图像中以 (x,y)为中心的区域与模板的相关性。 x' y'遍历模板图像的所有像素坐标。 T(x',y')表示模板图像在 (x',y')位置的像素值, I(x+x',y+y')表示原始图像在 (x+x',y+y')**位置的像素值。

这种方法通过计算模板和图像区域的内积来衡量它们的相似性。较大的值表示较好的匹配,而较小的值表示较差的匹配。最佳匹配位置在值最大的地方。

1.4 归一化互相关

R ( x , y ) = ∑ x ′ , y ′ ( T ( x ′ , y ′ ) ⋅ I ( x + x ′ , y + y ′ ) ) ∑ x ′ , y ′ T ( x ′ , y ′ ) 2 ⋅ ∑ x ′ , y ′ I ( x + x ′ , y + y ′ ) 2 R(x,y) = \frac{\sum_{x',y'}(T(x',y') \cdot I(x + x',y + y'))}{\sqrt{\sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'}I(x + x',y + y')^2}} R(x,y)=∑x′,y′T(x′,y′)2⋅∑x′,y′I(x+x′,y+y′)2 ∑x′,y′(T(x′,y′)⋅I(x+x′,y+y′))

其中,**R(x,y)表示原始图像中以 (x,y)**为中心的区域与模板的归一化相关性。分母部分对模板图像和原始图像区域的像素值进行归一化处理。

这种方法通过计算归一化的相关性来衡量模板和图像的相似性。最佳匹配结果为1,表示两个图像完全匹配。匹配越差,匹配值越小,但不会小于-1。

1.5 相关系数互相关

R ( x , y ) = ∑ x ′ , y ′ ( T ′ ( x ′ , y ′ ) ⋅ I ′ ( x + x ′ , y + y ′ ) ) R(x,y) = \sum_{x',y'}(T'(x',y') \cdot I'(x + x',y + y')) R(x,y)=x′,y′∑(T′(x′,y′)⋅I′(x+x′,y+y′))

其中
T ′ ( x ′ , y ′ ) = T ( x ′ , y ′ ) − 1 w ⋅ h ⋅ ∑ x ′ ′ , y ′ ′ T ( x + x ′ ′ , y + y ′ ′ ) I ′ ( x + x ′ , y + y ′ ) = I ( x + x ′ , y + y ′ ) − 1 w ⋅ h ⋅ ∑ x ′ ′ , y ′ ′ I ( x + x ′ ′ , y + y ′ ′ ) T'(x',y') = T(x',y') - \frac1{w \cdot h} \cdot \sum_{x'',y''}T(x + x'',y + y'') \\ I'(x + x',y + y') = I(x + x',y + y') - \frac1{w \cdot h} \cdot \sum_{x'',y''}I(x + x'',y + y'') T′(x′,y′)=T(x′,y′)−w⋅h1⋅x′′,y′′∑T(x+x′′,y+y′′)I′(x+x′,y+y′)=I(x+x′,y+y′)−w⋅h1⋅x′′,y′′∑I(x+x′′,y+y′′)

这种方法通过计算源图像与模板的归一化相关性来衡量它们的相似性。最佳匹配结果在值等于1处,表示完全匹配。匹配越差,匹配值越小,但不会小于-1。

1.6 归一化相关系数互相关

R ( x , y ) = ∑ x ′ , y ′ ( T ′ ( x ′ , y ′ ) ⋅ I ′ ( x + x ′ , y + y ′ ) ) ∑ x ′ , y ′ T ′ ( x ′ , y ′ ) 2 ⋅ ∑ x ′ , y ′ I ′ ( x + x ′ , y + y ′ ) 2 R(x,y) = \frac{\sum_{x',y'}(T'(x',y') \cdot I'(x + x',y + y'))}{\sqrt{\sum_{x',y'}T'(x',y')^2 \cdot \sum_{x',y'}I'(x + x',y + y')^2}} R(x,y)=∑x′,y′T′(x′,y′)2⋅∑x′,y′I′(x+x′,y+y′)2 ∑x′,y′(T′(x′,y′)⋅I′(x+x′,y+y′))

这种方法是相关系数匹配法的归一化版本。它使用源图像与其均值的差、模板与其均值的差二者之间的相关性进行匹配,并将结果归一化。通过计算归一化的相关性系数来衡量源图像与模板的相似性。最佳匹配结果为1,表示完美匹配。匹配越差,匹配值越小,但不会小于-1。

2. 归一化差的平方和(实战)

给定一个车牌数字的模板库,存放在car_plates下的template文件夹中,要求利用模板匹配法对存放在car_plates/test_pic中的14张车牌数字图片进行识别,并用disp函数显示每张图片被识别为哪个数字以及该图片真正为哪个数字。

a. 依次读取模板库中的每张图片,将其归一化为相同的尺寸3232维的,然后将归一化后图片的unit8类型的像素矩阵转换为double类型的矩阵,将转换后的矩阵拉伸为1 1024维的行向量,作为该图片的特征向量,并存储该图片的类标。对所有模板处理完后,最终会得到一个101024维的特征矩阵template_features和一个101维的类标向量template_labels。

matlab 复制代码
template_folder = '\car_plates\templates\';
% 获取模板文件中的所有图像
template_files = dir(fullfile(template_folder, '*.bmp'));
num_templates = numel(template_files);
% 初始化特征矩阵和类标向量
template_features = zeros(num_templates, 1024);
template_labels = zeros(num_templates, 1);

for i = 1:num_templates
    img = imread(fullfile(template_folder, template_files(i).name)); % 读取图片
    re_img = imresize(img,[32,32]); % resize 32 × 32
    img_double = im2double(re_img); % 转doubel
    img_vec = reshape(img_double,1,[]);  % 压扁成行向量
    templates_features(i,:) = img_vec;
    % split_fname = split(template_files(i).name, '.');
    template_labels(i) = str2double(template_files(i).name(1));
end

b. 依次读取每一张待识别的图片,按照与处理模板图片相同的方法处理待识别图片,将待识别图片转换一个1*1024维的特征向量x,然后开始进行模板匹配,即计算x与template_features矩阵中每一个行向量的欧式距离,存储这10个距离值,找到其中最小的距离对应的模板,记为idx,则将待识别的图片预测为第idx个模板对应的类标。为了得到待识别图片的真实类标,可以对其文件名使用split函数进行分割,第一"."前的字符对应的数字即为其真实类标。用disp函数输出每张图片的预测类标和真实类标,并统计正确分类的图片数,也用disp函数显示。

matlab 复制代码
test_folder = '\car_plates\test_pic';
test_files = dir(fullfile(test_folder, '*.bmp'));  % 读取待识别图像
num_test_img = numel(test_files); % 获取图像数量
correct_count = 0; % 正确分类的图像数量

dist = zeros(num_templates,1);
for i = 1:num_test_img
    test_img = imread(fullfile(test_folder, test_files(i).name));  % 读取待识别图片
    re_test_img = imresize(test_img, [32, 32]); % resize
    test_img_double = im2double(re_test_img);% 转double并归一化
    test_img_vec = reshape(test_img_double, 1,[]);% 压扁成行向量
    for i = 1:num_templates
        dist(i) = norm(template_features(i) - test_img_vec)% 求待识别图像与所有模板的欧氏距离
    end
    [~, idx] = min(dist); % 获取距离最小的那个模板的序号
    predicted_label = template_labels(idx);
    true_label = str2double(test_files(i).name(1))
    % 输出预测类标和真实类标
    disp(['预测类标', test_files(i).name, ': ', num2str(predicted_label)]);
    disp(['真实类标', test_files(i).name, ': ', num2str(true_label)]);
    % 判断是否正确分类
    if predicted_label == true_label
        correct_count = correct_count + 1;
    end
end

以上便是本片文章的全部内容了。倘若大佬发现问题,请直接在评论区斧正,感谢🌞

参考:https://blog.csdn.net/AI_dataloads/article/details/133845344

相关推荐
m0_614523552 小时前
完整教程|输入一句描述,能不能直接生成一段可以继续剪辑的视频:写结构化描述到生成短样片
人工智能·音视频
淡海水2 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
stormzhangV2 小时前
AGI 时代终于来了!
人工智能·openai
清风百草2 小时前
【05】AI辅助文档管理:开发者的效率革命
人工智能·ai辅助文档管理·开发者的效率革命
leobertlan3 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
甲维斯3 小时前
Gemini锐评GPT6:我要泼冷水扒底裤!
人工智能
2501_928996223 小时前
GPT-4o换DeepSeek迁移成本多少?中科热备解析API聚合平台技术账本
前端·数据库·人工智能
敢敢のwings3 小时前
ACT-2 深度解析:家用机器人如何把“会做”推进到“可靠地做”
人工智能·机器人
DM今天肝到几点?3 小时前
AI 安全进入「攻防同频」:Gemini 3.8 Flash Cyber 上线、Astra 触及关键级、HiddenLayer 融资 1 亿美元
网络·人工智能·深度学习·安全·语言模型·开源·知识图谱
Tisfy3 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯