主要内容

基于特征的全景图像拼接

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

概述

特征检测与匹配是计算机视觉应用中的重要技术,如图像配准、跟踪和目标检测等。在这个例子中,基于特征的技术被用来自动缝合一组图像。图像拼接是基于特征的图像配准的扩展。与其配准单个图像对,不如将多个图像对相对于彼此依次配准以形成一个全景图。

步骤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 = im2gray(我);点= detectSURFFeatures (grayImage);[features, points] = extractFeatures(grayImage,points);%将所有变换初始化为单位矩阵。请注意,%投影变换在这里使用,因为建筑图像是相当靠近相机。如果从更远的地方捕捉到这个场景,一个仿射变换就足够了。numImages =元素个数(buildingScene.Files);tforms (numImages) = projective2d(眼(3));%初始化变量以保持图像大小。图象尺寸= 0 (numImages, 2);%遍历剩余的图像对n = 2: numImages%存储点和特性I(n-1)。pointsPrevious =点;featuresPrevious =功能;%读我(n)。I = readimage(buildingScene, n);%将图像转换为灰度。grayImage = im2gray(我);%保存图像大小。图象尺寸大小(n:) = (grayImage);%对I(n)进行SURF特征检测和提取。点= detectSURFFeatures (grayImage);[features, points] = extractFeatures(grayImage, points);%找出I(n)和I(n-1)之间的对应关系。indexPairs = matchFeatures(features, featuresPrevious,“独特的”,真正的);matchedPoints = points(indexPairs(:,1),:);matchedPointsPrev = pointsPrevious(indexPairs(:,2),:);%估计I(n)和I(n-1)之间的变换。tforms(n) = estimateGeometricTransform2D(matchedPoints, matchedPointsPrev,...“射影”“信心”, 99.9,“MaxNumTrials”, 2000);%计算T(n) * T(n-1) *…* T (1)tforms (n)。T= tforms(n).T * tforms(n-1).T;结束

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

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

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

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

avgXLim = mean(xlim, 2);[~, idx] = (avgXLim)进行排序;地板centerIdx =((元素个数(tforms) + 1) / 2);centerImageIdx = idx (centerIdx);

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

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

步骤3 -初始化全景图

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

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

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 (:)));全景图的宽度和高度。width = round(xMax - xMin);height = round(yMax - yMin);%初始化“空的”全景图。全景=零([高宽3],“喜欢”,我);

步骤4 -创建全景图

使用imwarp将图像映射到全景图中并使用愿景。alphablend将图像叠加在一起。

搅拌机=愿景。alphablend (“操作”“二元掩模”...“MaskSource”输入端口的);%创建一个二维空间参考对象,定义全景图的大小。xlimit = [xMin xMax];ylimit = [yMin yMax];全景视图= imref2d([height width], xLimits, yLimits);创建全景图。i = 1:numImages i = readimage(buildscene, i);%变换I到全景图。= imwarp(I, tforms(I)),“OutputView”, panoramaView);%生成二进制掩码。mask = imwarp(true(size(I,1),size(I,2)), tforms(I),“OutputView”, panoramaView);%在全景图上叠加warpedImage全景= step(blender,全景,warpedImage, mask);结束图imshow(全景)

图中包含一个轴。轴包含一个图像类型的对象。

结论

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

参考文献

[1] Matthew Brown和David G. Lowe, 2007。使用不变特征的自动全景图像拼接。Int。j .第一版。视觉74,1(2007年8月),59-73。