NCC多尺寸模板匹配MATLAB

NCC多尺寸模板匹配MATLAB

模板匹配

模板匹配首先给出一份模板,通过对于目标图像中的检索,找到目标图像中区域与模板最为契合的部分。
再本次程序中,流程如下:

  1. 获得模板与原图像的 RGB 图像,转化为灰度图,并且获得尺寸信息 。
  2. 计算模板灰度平均值,开始依次遍历原图像中的模板尺寸子图像。
  3. 对每一个分割图像,计算平均灰度值后,执行 NCC 算法,保存于二维矩阵中。
  4. 遍历完成,找到二维矩阵中最大值,记录坐标,绘图保存。

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~

  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
NCC(Normalized Cross-Correlation)模板匹配是一种常用的模板匹配算法,它通过计算模板图像与目标图像之间的归一化互相关系数来确定模板在目标图像中的位置。在 MATLAB 中,可以使用 `normxcorr2` 函数来实现 NCC 模板匹配。 下面是一个简单的示例,展示如何使用 `normxcorr2` 函数进行 NCC 模板匹配: ```matlab % 读取目标图像和模板图像 target = imread('target.png'); template = imread('template.png'); % 计算模板图像和目标图像的归一化互相关系数 corr = normxcorr2(template, target); % 找到最大相关系数的位置 [max_corr, max_corr_idx] = max(corr(:)); [y, x] = ind2sub(size(corr), max_corr_idx); % 在目标图像中标记匹配结果 figure; imshow(target); rectangle('Position', [x-size(template,2), y-size(template,1), size(template,2), size(template,1)], 'EdgeColor', 'r', 'LineWidth', 2); ``` 上述代码中,`target.png` 和 `template.png` 是目标图像和模板图像的文件名,可以根据实际情况进行修改。`normxcorr2` 函数返回的 `corr` 是一个二维数组,表示目标图像和模板图像之间的归一化互相关系数。通过找到 `corr` 中最大值的位置,就可以确定模板在目标图像中的位置。最后,使用 `rectangle` 函数在目标图像中标记匹配结果。 在实际应用中,NCC 模板匹配可能会耗费较长的时间,特别是在处理大尺寸图像时。为了加快计算速度,可以使用积分图(Integral Image)来优化算法。积分图是一种用于快速计算图像区域和的技术,在 MATLAB 中可以使用 `integralImage` 函数生成积分图,并使用 `integralLookup` 函数从积分图中快速提取区域和。下面是一个使用积分图优化 NCC 模板匹配的示例: ```matlab % 读取目标图像和模板图像 target = imread('target.png'); template = imread('template.png'); % 计算目标图像和模板图像的积分图 target_integral = integralImage(target); template_integral = integralImage(template); % 定义模板图像的大小 template_size = size(template); % 计算归一化互相关系数 corr = zeros(size(target)); for y = 1:size(target,1)-template_size(1) for x = 1:size(target,2)-template_size(2) % 提取目标图像中的子图像 subimage = target(y:y+template_size(1)-1, x:x+template_size(2)-1); % 计算子图像的积分值 subimage_integral = integralLookup(target_integral, [y, x, template_size(1)-1, template_size(2)-1]); % 计算归一化互相关系数 corr(y,x) = normxcorr2(template, subimage - subimage_integral/(template_size(1)*template_size(2))); end end % 找到最大相关系数的位置 [max_corr, max_corr_idx] = max(corr(:)); [y, x] = ind2sub(size(corr), max_corr_idx); % 在目标图像中标记匹配结果 figure; imshow(target); rectangle('Position', [x-template_size(2), y-template_size(1), template_size(2), template_size(1)], 'EdgeColor', 'r', 'LineWidth', 2); ``` 上述代码中,`integralImage` 函数分别计算了目标图像和模板图像的积分图。在循环中,使用 `integralLookup` 函数从目标图像的积分图中提取子图像的积分值,然后通过计算模板图像和子图像之间的归一化互相关系数来确定匹配度。为了避免计算子图像的平均值,可以通过从子图像的积分值中减去平均值的方式,避免重复计算。 通过使用积分图优化 NCC 模板匹配算法,可以大大加快计算速度,特别是在处理大尺寸图像时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值