主要内容

基于特征的全景图像拼接

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

概述

特征检测和匹配是许多计算机视觉应用中使用的强大技术,如图像配准、跟踪和目标检测。在本例中,使用基于特征的技术自动将一组图像拼接在一起。图像拼接是基于特征的图像配准的扩展。不再是对单个图像进行配准,而是将多个图像对彼此相对地先后配准,形成全景图。

步骤1 -加载图像

本例中使用的图像集包含建筑物的图片。这些照片是用一台未校准的智能手机相机从左到右沿着地平线拍摄的,捕捉到了建筑物的所有部分。

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

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

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

步骤2 -注册镜像对

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

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

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

  3. 计算映射的变换 n 成全景图像为 T 1 T 2 T n - 1 T n

从图像集中读取第一个图像。I = readimage(buildingScene,1);初始化I(1)的特征grayImage = im2gray(I);points = detectSURFFeatures(grayImage);[features, points] = extractFeatures(grayImage,points);初始化单位矩阵的所有变换。注意这里使用射影变换,因为建筑图像是公平的%靠近相机。对于从更远的距离拍摄的场景,您可以使用%仿射变换。numImages = nummel (buildingScene.Files);tforms(numImages) = projtform2d;初始化变量以保存图像大小。imageSize = 0 (numImages,2);%遍历剩余的图像对n = 2:numImages存储I(n-1)的点和特征。pointsPrevious =点数;featuresPrevious =特征;%读取I(n)。I = readimage(buildingScene, n);将图像转换为灰度。grayImage = im2gray(I);保存图像大小。imageSize(n,:) = size(grayImage);检测并提取I(n)的SURF特征。points = 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) = estgeotform2d(matchedPoints, matchedPointsPrev,...“射影”“信心”, 99.9,“MaxNumTrials”, 2000);%计算T(1) * T(2) *…* T(n-1) * T(n)tforms (n)。A = tforms(n-1)。A * tforms(n).A;结束

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

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

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

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

avgXLim = mean(xlim, 2);[~,idx] = sort(avgXLim);centerIdx = floor((数字(tforms)+1)/2);centerImageIdx = idx(centerIdx);

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

Tinv = invert(tforms(centerImageIdx));I = 1: number (tforms) tforms(I)。A = Tinv。A * tforms(i).A;结束

步骤3 -初始化全景

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

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

i = 1:元素个数(tforms) [xlim(我,:),ylim(我,:)]= outputLimits (tforms(我),(1)图象尺寸(我,2)]、[1图象尺寸(我,1)));结束maxImageSize = max(imageSize);找到最小和最大输出限制。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);初始化“空”全景图。全景图= 0([高宽3],“喜欢”,我);

步骤4 -创建全景图

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

搅拌机=视觉。alphablend (“操作”“二元掩模”...“MaskSource”输入端口的);创建一个二维空间引用对象,定义全景图的大小。xLimits = [xMin xMax];yLimits = [yMin yMax];panoramaView = imref2d([高度宽度],xLimits, yLimits);创建全景图。i = 1:numImages i = readimage(buildingScene, i);将I转换为全景图。warpedImage = imwarp(I, tforms(I)“OutputView”, panoramaView);生成二进制掩码。mask = imwarp(true(size(I,1),size(I,2)), tforms(I),“OutputView”, panoramaView);将warpedImage覆盖到全景图上。全景=步骤(搅拌机,全景,warpedImage,蒙版);结束图imshow(全景)

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

结论

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

参考文献

马修·布朗,大卫·g·洛,2007。使用不变特征的自动全景图像拼接。Int。j .第一版。愿景74,1(2007年8月),59-73。