模板匹配
模板匹配首先给出一份模板,通过对于目标图像中的检索,找到目标图像中区域与模板最为契合的部分。
再本次程序中,流程如下:
- 获得模板与原图像的 RGB 图像,转化为灰度图,并且获得尺寸信息 。
- 计算模板灰度平均值,开始依次遍历原图像中的模板尺寸子图像。
- 对每一个分割图像,计算平均灰度值后,执行 NCC 算法,保存于二维矩阵中。
- 遍历完成,找到二维矩阵中最大值,记录坐标,绘图保存。
NCC
在此过程中,关键的因素就是找寻最为相似的区域,即为,如何设计一 个公式,衡量两个区域之间的相似度。NCC 就是这样一个评估函数,归一化积相关算法。
图片引用自 图像处理之基于NCC模板匹配识别
运行结果
原图像
裁出来的模板
模板匹配结果
加上NCC值矩阵标准化后的热力图
每个NCC匹配值保存在左上角,所以下面和右边没有
具体代码
clear all;
tic;
image = imread('C:\Users\75215\Desktop\计算机视觉\test.jpg');
target = imread('C:\Users\75215\Desktop\计算机视觉\cug_90.jpg');
im_gray = double(rgb2gray(image));
tar_gray = double(rgb2gray(target));
[target_x,target_y] = size(tar_gray);
[image_x,image_y] = size(im_gray);
xy = target_x *target_y;
avgray_tar =double(0);
for x =1:target_x
for y = 1: target_y
avgray_tar = avgray_tar + tar_gray(x,y);%计算模板的总灰度值
end
end
avgray_tar = avgray_tar/xy;%模板平均灰度值
for w =1 : (image_x-target_x-1)
disp(w);
for h = 1:(image_y-target_y-1)
avgray_im=double(0);
tempt_image = im_gray(w:w+target_x-1,h:h+target_y-1);%裁剪中模板大小的区域
for x =1:target_x
for y = 1:target_y
avgray_im = avgray_im + tempt_image(x,y);%计算裁剪区域的总灰度值
end
end
avgray_im = avgray_im/xy;%裁剪部分的平均灰度值
err_tar =double(0);%模板的灰度误差
err_img =double(0);%裁剪区域的灰度误差
err_all = double(0);%二者相乘
var_img =double(0);%裁剪区域标准差
var_tar = double(0);%模板标准差
for x=1:target_x
for y=1:target_y
err_tar = (tar_gray(x,y) - avgray_tar);
err_img = (tempt_image(x,y)-avgray_im);
err_all = err_all+err_tar*err_img;
var_tar = power((tar_gray(x,y)-avgray_tar),2)+var_tar;
var_img =power((tempt_image(x,y)-avgray_im),2)+var_img;
end
end
ncc(w,h) = ((err_all)/(sqrt(var_tar)*sqrt(var_img)))/(xy-1);%计算NCC值
end
end
max_ncc = max(max(ncc));
[max_x,max_y] = find(ncc == max(max(ncc))); %找到最大匹配值的位置
figure(1)
imshow(uint8(target));
ncc=mapminmax(ncc,-1,1);%归一化到[-1,1]
figure(2)
imshow(uint8(image));%画原图
hold on;
show = imagesc(ncc); %根据矩阵变为热力图
set(show,'AlphaData',0.6); %设置透明度
rectx =[max_y,max_x,target_y,target_x]; %设置矩形区域
rectangle('Position',rectx,'Edgecolor','r','LineWidth',2);%画矩形,红shai,粗2
toc
disp(toc)
总结
CUG计算机视觉课作业之一
唯一一份手写的作业
MATLAB不太常用,写的稀烂,NCC值似乎有些小毛病
不管怎样,but it works~