图像匹配
图像匹配:通过对图像内容、特征、结构、关系、纹理及灰度等的对应关系,相似性和一致性的分析,寻求相似图像目标的方法。 如:已知两幅图像AB,在图像A中寻找最相似的图像B。 图像匹配的方法有很多,比如基于灰度的匹配及基于特征的匹配等,本文主要介绍基于灰度的匹配算法中的NCC算法。
NCC算法
NCC算法基本原理
NCC算法优缺点
缺点:
优点:
NCC计算公式
S:参考图像;参考图像尺寸MN;R:NCC计算后的输出匹配值;T模板图像;模板图像尺寸:mn,也称为匹配窗口。 分子是某点灰度值减去平均灰度值的求和。分母是两幅图像灰度标准偏差的乘积。 如果一个图像线性依赖于另一个图像,那么**(m,n)∈C,其中C表示重合区域**;T = a*S + b ,则NCC值为1,正相关,如果a是负数,那么值为-1,负相关。 方法:将匹配窗口置于参考图像上,然后左上角点(i,j)称为参考点。NCC是计算模板区域与参考图像覆盖区域的匹配度,然后将模板窗口在参考图像由左向右,由上到下的进行平移,逐像素的遍历整个参考图像,最终在整个参考图像中找到匹配度最高的子图作为匹配的结果。
NCC归一化相关匹配算法的Matlab实现
步骤如下:
- 读入参考图像和模板图像
- 获取模板像素并计算均值与标准方差
- 根据模板大小,在目标图像上从左到右,从上到下移动窗口,从而逐像素的计算窗口内像素与模板像素的ncc值,与阈值比较,大于阈值记录位置
- 根据位置信息,采用红色矩形标记出模板匹配的结果。
clear all;
close all;
src=imread('1p.jpg');%读入参考图
[a b d]=size(src);%获取图像长宽以及通道数
if d==3
src=rgb2gray(src);%判断是否灰度图,若不是则转为灰度图,基于灰度的匹配
end
mask=imread('3p.png');%读入模板图
[m n d]=size(mask);
if d==3
mask=rgb2gray(mask);
end
mask=im2double(mask);
N=n;%模板尺寸
M=m;
P=a;%待搜索图像尺寸
Q=b;
%%进行匹配
dst=zeros(P-M,Q-N);%创建矩阵,存放模板计算出的结果
S=M*N;
for i=1:P-M %子图选取,逐个像素
for j=1:Q-N
temp=src(i:i+M-1,j:j+N-1);%当前子图
temp=im2double(temp); %注意要将int转为double型
temp_m=mean(mean(temp));
mask_m=mean(mean(mask));
a=((sum(sum((temp-temp_m).*(mask-mask_m)))));
b=(sqrt(sum(sum(((temp-temp_m).^2))))* sqrt(sum(sum(((mask-mask_m).^2)))));
dst(i,j)=a/b; %NCC值
end
end
abs_max=max(max(dst));%%寻找最小值
[x,y]=find(dst==abs_max);
figure;
imshow(mask);title('模板');
figure;
imshow(src);
hold on;
rectangle('position',[y,x,N-1,M-1],'edgecolor','r');%在参考图上框选匹配出的结果
hold off;title('搜索参考图');
toc
disp(toc) %显示运行时间
%命令行输入如下,进行ncc值的输出,对NCC取阈值,即可判断匹配效果是否符合要求
%dst(i,j)
我们用下面两张图像来模拟同一个相机连续拍摄的两张图像(此时相机没有旋转),其中有一个位置是重复出现在两帧图像中的,(相当于我们图像拼接中的重叠区域)因此我们采用NCC算法进行匹配,并将匹配的区域进行框选。
效果图如下: 左是模板图,右是搜索参考图,红色框的位置是匹配结果。
通过效果图可看出,我们在参考图中找到了相似度最高的模板图,也就实现了匹配。
因此我们即可通过NCC算法来衡量两个区域之间的相似度,可以作为图像拼接融合的评价指标,重叠拼接部分越相似,说明拼接融合效果越好。
补充: 为什么我们给的模板图像和参考图像都是在同一水平线上的?
这里构建相关窗口的前提是两帧图像之间已经校正到水平位置,即光心处于同一水平线上,此时极线是水平的,这样的画,匹配过程无需在倾斜的极线方向上完成,能节约更多计算资源。所以我们在图像拼接质量评估的时候,也是基于水平图像的一种匹配计算。
为什么给予小尺寸图像进行测试? NCC算法是逐像素进行计算的,因此计算速度比较慢,我们验证该算法,即可采用两个比较小尺寸的图像来进行,节约运行的时间,我这里的参考图像是645210,模板图像是450*185,所需要的时间是788秒。
图像配准精度计算
这里补充一个图像配准精度的计算方法,其中图像配准精度由匹配率和正确率构成。
匹配率=匹配数/特征点数;
正确率=正确配准数/匹配数;
问题: 可以正常的匹配图像,在Matlab输入如下的命令也可以进行NCC值的输出,但是输出值出现问题,却没有影响匹配,给了两张几乎一样的图像,本应该输出一个接近1的数值,但是却输出了一个接近-1的数值。但是有一个规律,如果重合区域偏左边,值为负数,如果偏右边为正数,但是不管正负,只要有重合区域就会被搜索到并框选出来。
|