基于功能的全景图像拼接
这个例子展示了如何使用基于特征的图像配准技术自动创建一个全景。
概述
特征检测和匹配是强大的技术用在许多计算机视觉应用,如图像配准、跟踪和检测对象。在这个例子中,基于特征的技术用于自动缝合在一起的一组图像。图像拼接的过程是一个扩展的基于特征的图像配准。而不是注册一副图像,先后注册多个图像对相对于彼此形成一个全景。
步骤1 -加载图片
这个示例中所使用的图像集包含一个建筑的照片。这些都被席卷未校准的智能手机的相机相机沿着地平线从左到右,捕捉建筑的所有部分。
所示,图像相对不受任何透镜畸变影响相机校正并不是必需的。然而,如果透镜畸变,相机应该校准,图像不失真之前创建全景。您可以使用相机校准器如果需要应用校准相机。
%加载图片。buildingDir = fullfile (toolboxdir (“愿景”),“visiondata”,“建筑”);buildingScene = imageDatastore (buildingDir);%显示图像缝合。蒙太奇(buildingScene.Files)
步骤2 -注册图像对
创建全景,先注册连续图像对使用下列程序:
检测和匹配特性 和 。
估计几何变换, ,地图 来 。
计算转换映射 全景形象 。
%读第一个图像从图像集。I = readimage (buildingScene, 1);%初始化特性对我(1)grayImage = im2gray(我);点= detectSURFFeatures (grayImage);(特性,分)= extractFeatures (grayImage点);%初始化所有单位矩阵的转换。请注意,这里使用%射影变换,因为建筑图片相当%的相机。进一步的场景拍摄距离,你可以使用%的仿射变换。numImages =元素个数(buildingScene.Files);tforms (numImages) = projtform2d;%初始化变量来保存图像大小。图象尺寸= 0 (numImages, 2);%迭代剩余图像对为n = 2: numImages%保存点和功能因为我(n - 1)。pointsPrevious =点;featuresPrevious =功能;%读我(n)。I = readimage (buildingScene n);%将图像转换为灰度。grayImage = im2gray(我);%保存图像大小。图象尺寸大小(n:) = (grayImage);%检测和提取冲浪特性(n)。点= detectSURFFeatures (grayImage);(特性,分)= extractFeatures (grayImage点);%之间找到通讯(n)和我(n - 1)。indexPairs = matchFeatures(特性、featuresPrevious“独特的”,真正的);matchedPoints =点(indexPairs (: 1):);matchedPointsPrev = pointsPrevious (indexPairs (:, 2):);%估计之间的转换(n)和我(n - 1)。tforms (n) = estgeotform2d (matchedPoints matchedPointsPrev,…“射影”,“信心”,99.9,“MaxNumTrials”,2000);%计算T (1) * (2) *……* T (n - 1) * T (n)。tforms (n)。一个= tforms (n - 1)。* tforms (n)。;结束
在这一点上,所有的转换tforms
相对于第一个形象。这是一个方便的方式代码图像配准过程,因为它允许所有图片的顺序处理。然而,使用第一个形象开始的全景不会产生了最美观的全景,因为它往往会扭曲的大多数图像形成全景。更好的全景可以通过修改创建的转换,这样场景中心是最不扭曲。这是通过反相转换的中心形象和应用转换所有其他人。
首先使用projtform2d
outputLimits
找到输出限制为每个变换方法。然后使用输出限制自动找到大致的图像中心的场景。
%计算输出限制为每个转换。为i = 1:元素个数(tforms) [xlim(我,:),ylim(我,:)]= outputLimits (tforms(我),(1)图象尺寸(我,2)]、[1图象尺寸(我,1)));结束
接下来,计算平均X限制每个转换,找到图像的中心。这里只使用了X限制因为现场是水平的。如果使用另一组图片,X和Y的范围可能需要用于查找中心的形象。
avgXLim =意味着(xlim, 2);[~,idx] = (avgXLim)进行排序;地板centerIdx =((元素个数(tforms) + 1) / 2);centerImageIdx = idx (centerIdx);
最后,应用中心形象的逆变换其他。
Tinv =反转(tforms (centerImageIdx));为i = 1:元素个数(tforms) tforms(我)。一个= Tinv。* tforms(我)。;结束
步骤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 (:)));%全景图片的宽度和高度。宽度=圆(xMax - xMin);身高=圆(yMax - yMin);%初始化“空”的全景。全景= 0([高度宽度3],“喜欢”,我);
步骤4——创建全景
使用imwarp
将图像映射到全景和使用vision.AlphaBlender
一起叠加到图像。
搅拌机= vision.AlphaBlender (“操作”,“二元掩模”,…“MaskSource”,输入端口的);%定义创建一个二维空间引用对象的大小。xLimits = [xMin xMax];yLimits = [yMin yMax];panoramaView = imref2d(高度宽度,xLimits yLimits);%创建全景。为我=我= 1:numImages readimage (buildingScene,我);%将我改造成全景。warpedImage = imwarp(我tforms(我),“OutputView”,panoramaView);%生成一个二进制的面具。掩码= imwarp (true(大小(我,1),大小(我,2)),tforms(我),“OutputView”,panoramaView);%覆盖warpedImage到全景。全景=步骤(搅拌机、全景、warpedImage面具);结束图imshow(全景)
结论
这个例子向您展示了如何使用基于特征的图像配准技术自动创建一个全景。额外的技术可以被纳入改善混合的例子[1]和对齐的全景图像。
引用
[1]马修·布朗和大卫·g·劳。2007。自动全景图像拼接使用不变的特性。Int。j .第一版。展望74,1(2007年8月),59 - 73。