导航栏
- [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