%%
%基于NCC算法(Normalized Cross Correlation)的图像对准。
%%
clear all;
close all; clc;
%1.读取图片
img_A_dir = '.\data\lena.bmp'; %待寻母图
img_A_raw = imread(img_A_dir);
[r1,c1,d1] = size(img_A_raw);
if d1==3 %灰度化
img_A = rgb2gray(img_A_raw);
else
img_A = img_A_raw;
end
img_B_dir = '.\data\refer.bmp'; %模板图
img_B_raw = imread(img_B_dir);
[r2,c2,d2] = size(img_B_raw);
if d2==3
img_B = rgb2gray(img_B_raw);
else
img_B = img_B_raw;
end
%2.计算NCC矩阵
mNCC = zeros(r1-r2,c1-c2);
for i = 1:r1-r2
for j = 1:c1-c2
temp = img_A(i:i+r2-1,j:j+c2-1);
mean_temp = mean(temp(:)); %temp均值
mean_B = mean(img_B(:)); %img_B均值
inp = sum(sum((temp - mean_temp).*(img_B - mean_B))); %两向量内积
mod1 = sqrt(sum(sum((temp - mean_temp).^2))); %模长1
mod2 = sqrt(sum(sum((img_B - mean_B).^2))); %模长2
ncc = inp / (mod1*mod2);
mNCC(i,j) = mNCC(i,j) + ncc;
end
end
%3.定位匹配位置
max_ncc = max(max(mNCC)); %最大ncc值
[x,y] = find(mNCC == max_ncc);
x = x(1); %定位到的第一个位置
y = y(1);
%4.保存结果图
getImg = img_A_raw(x:x+r2-1,y:y+c2-1,1:3);
imwrite(getImg,'.\output\NCC_match.bmp');
fprintf('\n Done. \n');
- 1
- 2
前往页