文章目录

图像匹配

图像匹配:通过对图像内容、特征、结构、关系、纹理及灰度等的对应关系,相似性和一致性的分析,寻求相似图像目标的方法。
如:已知两幅图像AB,在图像A中寻找最相似的图像B。


图像匹配的方法有很多,比如基于灰度的匹配及基于特征的匹配等,本文主要介绍基于灰度的匹配算法中的NCC算法。

NCC算法

  • NCC(normalization cross-correlation)归一化相关性匹配算法,在图像匹配领域占据重要地位,对噪声具有一定的鲁棒性,不受亮度变化的影响,但是它对存在旋转的图像不能进行匹配
  • 在图像采集中往往会因为环境变化等出现亮度的变化,该算法能很好地解决亮度变化的问题。但是我们一般用NCC算法进行粗匹配,目前匹配算法采用更多的还是基于特征的匹配方法,但是基于特征的匹配会丢弃很多点,精度有所下降。
  • NCC算法是区域匹配算法,就可以对特征区域部分进行匹配,可以提高单个特征匹配的精度,还能提升整体模型的速度,同时抵消灰度变化带来的影响。

NCC算法基本原理

  • 首先规定一个一定大小的模板图像灰度矩阵,让它在参考图像的所有可能的灰度阵列中,按某种相似性度量方法进行逐像素的搜索比较,从而进行匹配。
  • 核心思路:归一化待匹配目标之间的相关程度,将NCC处理的结果归到[-1,1]范围内。越接近1说明相关性越大,说明两幅图像越相似,反之反之相似度越低,导致无法匹配。因此NCC输出结果的好坏,即可设置一个阈值,通过比较来确定。
    由此,NCC不仅可以作为图像匹配算法,还可作为图像拼接融合的客观评价指标,进行相似性的判别

NCC算法优缺点

缺点:

  • 需要遍历所有点的组合,计算时间久。
  • 匹配结果受区域块大小的影响。如果区域特征块选取的范围太大,对于含有特征点少的区域块来说就会产生大量的冗余计算,从而算法效率低,如果选取的区域块过小,那么特征点周围的灰度信息不能很好的表达,从而容易导致误匹配。
  • 改进方法:可优化点集,将相关性低的特征点剔除(计算目标点与临近点的距离,并设置阈值来剔除)。分析特征块大小对相关系数的影响,从而选择更合适的块大小。

优点:

  • 不受灰度值线性变化影响,因此可解决亮度变化问题。
  • 适用于纹理、模糊图像以及边缘微变形图像。
  • 匹配精度高,不易出现误匹配

NCC计算公式

S:参考图像;参考图像尺寸M_N;R:NCC计算后的输出匹配值;T模板图像;模板图像尺寸:m_n,也称为匹配窗口。
分子是某点灰度值减去平均灰度值的求和。分母是两幅图像灰度标准偏差的乘积。
如果一个图像线性依赖于另一个图像,那么(m,n)∈C,其中C表示重合区域;T = a_S + b ,则NCC值为1,正相关,如果a是负数,那么值为-1,负相关。


方法:将匹配窗口置于参考图像上,然后左上角点(i,j)称为参考点。NCC是计算模板区域与参考图像覆盖区域的匹配度,然后将模板窗口在参考图像由左向右,由上到下的进行平移,逐像素的遍历整个参考图像,最终在整个参考图像中找到匹配度最高的子图作为匹配的结果。

NCC归一化相关匹配算法的Matlab实现

步骤如下:

  1. 读入参考图像和模板图像
  2. 获取模板像素并计算均值与标准方差
  3. 根据模板大小,在目标图像上从左到右,从上到下移动窗口,从而逐像素的计算窗口内像素与模板像素的ncc值,与阈值比较,大于阈值记录位置
  4. 根据位置信息,采用红色矩形标记出模板匹配的结果。


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算法是逐像素进行计算的,因此计算速度比_较慢,我们验证该算法,即可采用两个比较小尺寸的图像来进行,节约运行的时间,我这里的参考图像是645_210,模板图像是450*185,所需要的时间是788秒。

图像配准精度计算

这里补充一个图像配准精度的计算方法,其中图像配准精度由匹配率和正确率构成。

   匹配率=匹配数/特征点数;

   正确率=正确配准数/匹配数;

问题:
可以正常的匹配图像,在Matlab输入如下的命令也可以进行NCC值的输出,但是输出值出现问题,却没有影响匹配,给了两张几乎一样的图像,本应该输出一个接近1的数值,但是却输出了一个接近-1的数值。但是有一个规律,如果重合区域偏左边,值为负数,如果偏右边为正数,但是不管正负,只要有重合区域就会被搜索到并框选出来。