模板匹配算法(有案例)

导航栏

  • [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

相关推荐
北京搜维尔科技有限公司4 分钟前
搜维尔科技:【应用】Xsens在荷兰车辆管理局人体工程学评估中的应用
人工智能·安全
说私域7 分钟前
基于开源 AI 智能名片 S2B2C 商城小程序的视频号交易小程序优化研究
人工智能·小程序·零售
YRr YRr7 分钟前
深度学习:Transformer Decoder详解
人工智能·深度学习·transformer
知来者逆12 分钟前
研究大语言模型在心理保健智能顾问的有效性和挑战
人工智能·神经网络·机器学习·语言模型·自然语言处理
云起无垠21 分钟前
技术分享 | 大语言模型赋能软件测试:开启智能软件安全新时代
人工智能·安全·语言模型
老艾的AI世界35 分钟前
新一代AI换脸更自然,DeepLiveCam下载介绍(可直播)
图像处理·人工智能·深度学习·神经网络·目标检测·机器学习·ai换脸·视频换脸·直播换脸·图片换脸
南宫生1 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
翔云API1 小时前
PHP静默活体识别API接口应用场景与集成方案
人工智能
浊酒南街1 小时前
吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.9-4.10
人工智能·深度学习·神经网络·cnn
Tony聊跨境1 小时前
独立站SEO类型及优化:来检查这些方面你有没有落下
网络·人工智能·tcp/ip·ip