基于特征的全景图像拼接

这个例子展示了如何使用基于特征的图像配准技术自动创建全景图。

概述

特征检测和匹配是许多计算机视觉应用(如图像配准、跟踪和目标检测)中使用的强大技术。在本例中,基于特征的技术用于自动缝合一组图像。图像缝合过程是基于特征的图像配准的扩展在注册一对图像的过程中,多个图像对彼此连续注册以形成全景。

步骤1-加载图像

本例中使用的图像集包含建筑物的图片。这些图片是使用未校准的智能手机摄像头沿地平线从左向右扫描摄像头拍摄的,捕获建筑物的所有部分。

如下所示,图像相对不受任何镜头畸变的影响,所以不需要相机校准。然而,如果镜头失真,相机应该校准和图像未失真之前创建全景。你可以使用相机校准器应用程序校准相机,如果需要。

%加载图像。buildingDir = fullfile (toolboxdir (“愿景”),“visiondata”“建筑”);buildingScene = imageDatastore (buildingDir);%显示要缝合的图像蒙太奇(buildingScene.Files)

步骤2 -注册图像对

要创建全景图,首先使用以下程序注册连续的图像对:

  1. 检测和匹配之间的特征 n n - 1

  2. 估计几何变换, T n ,地图 n n - 1

  3. 计算映射的转换 n 进入全景图像为 T n T n - 1 T 1

%从图像集中读取第一个图像。I = readimage(buildingScene, 1);%初始化I(1)的功能grayImage = rgb2gray(我);点=检测特征(灰度图像);[特征,点]=提取特征(灰度图像,点);%初始化所有到标识矩阵的转换%投影变换在这里使用,因为建筑图像是公平的靠近相机。如果这个场景是从远处拍摄的,一个仿射变换就足够了。numImages =元素个数(buildingScene.Files);tforms (numImages) = projective2d(眼(3));%初始化变量以保持图像大小。图象尺寸= 0 (numImages, 2);%遍历剩余的图像对n = 2: numImages%存储I(n-1)的点和特性。pointsPrevious =点;featuresPrevious =功能;%读我(n)。I = readimage(buildingScene, n);将图像转换为灰度。grayImage = rgb2gray(我);%保存图像大小。图像大小(n,:)=大小(灰度图像);%检测并提取I(n)的SURF特征。点=检测特征(灰度图像);[特征,点]=提取特征(灰度图像,点);找出I(n)和I(n-1)之间的对应关系。indexPairs = matchFeatures(feature, featuresPrevious,“独一无二”,真正的);matchedPoints = points(indexPairs(:,1),:);matchedPointsPrev = pointprevious (indexPairs(:,2),:); / /索引%估计I(n)和I(n-1)之间的转换。tforms(n)=估计几何变换(匹配点,匹配点EV,“射影”“信心”, 99.9,“MaxNumTrials”, 2000);%计算T(n) * T(n-1) *…* T (1)T=tforms(n).T*tforms(n-1).T;结束

在这一点上,所有的转换tforms是相对于第一幅图像的。这是对图像注册过程进行编码的一种方便方法,因为它允许对所有图像进行顺序处理。但是,使用第一幅图像作为全景图的开始并不能产生最美观的全景图,因为它往往会扭曲构成全景图的大多数图像。通过修改变换,使场景的中心失真最小,可以创建更好的全景。这是通过反转中心图像的变换并将该变换应用于所有其他图像来实现的。

首先使用投影2D输出限制方法查找每个转换的输出限制。然后使用输出限制来自动找到大致位于场景中心的图像。

%计算每个变换的输出限制i = 1:元素个数(tforms) [xlim(我,:),ylim(我,:)]= outputLimits (tforms(我),(1)图象尺寸(我,2)]、[1图象尺寸(我,1)));结束

接下来,计算每个变换的平均X极限,并找到位于中心的图像。这里只使用X限制,因为场景是水平的。如果使用另一组图像,则可能需要使用X和Y限制来找到中心图像。

avgXLim=平均值(xlim,2);[~,idx]=排序(avgXLim);centerIdx=楼层((numel(tforms)+1)/2);centerImageIdx=idx(centerIdx);

最后,将中心图像的逆变换应用于所有其他图像。

Tinv=反转(tforms(centerImageIdx));I = 1:numel(tforms) tforms(I)。T = tforms(我)。T * Tinv.T;结束

步骤3-初始化全景图

现在,创建一个初始的、空的全景图,将所有图像映射到其中。

使用输出限制方法计算所有转换的最小和最大输出限制。这些值用于自动计算全景的大小。

i = 1:元素个数(tforms) [xlim(我,:),ylim(我,:)]= outputLimits (tforms(我),(1)图象尺寸(我,2)]、[1图象尺寸(我,1)));结束maxImageSize = max(图象尺寸);找出最小和最大输出限制xMin=min([1;xlim(:)]);xMax=max([maxImageSize(2);xlim(:)]);yMin=min([1;ylim(:)]);yMax=max([maxImageSize(1);ylim(:)]);%全景图的宽度和高度。宽度=圆形(xMax - xMin);height = round(yMax - yMin);%初始化“空”全景图。全景=零([高宽3],“喜欢”,I);

步骤4 -创建全景图

使用imwarp将图像映射到全景图中并使用视觉.字母混合器将图像叠加在一起。

blender=vision.AlphaBlender(“操作”“二进制掩码”“MaskSource”输入端口的);%创建一个2-D空间参考对象,定义全景图的大小。xLimits = [xMin xMax];yLimits = [yMin yMax];全景视图= imref2d([height width], xLimits, yLimits);创建全景图。i = 1:numImages i = readimage(buildingScene, i);%把我变成全景。= imwarp(I, tforms(I)),“OutputView”,全景图);%生成二进制掩码。mask = imwarp(true(size(I,1),size(I,2)), tforms(I),“OutputView”,全景图);%将翘曲图像覆盖到全景图上。全景=阶跃(混合器、全景、扭曲图像、遮罩);结束图imshow(全景)

结论

本示例演示了如何使用基于特征的图像注册技术自动创建全景图。可以将其他技术合并到示例中,以改进全景图图像的混合和对齐[1]。

工具书类

[1] 马修·布朗和大卫·G·洛。2007使用不变特征的自动全景图像拼接。国际计算机杂志。愿景74,1(2007年8月),59-73。