这个例子展示了如何自动确定一对图像之间的几何变换。当一幅图像因旋转和缩放而相对于另一幅图像发生畸变时,请使用detectSURFFeatures
和estimateGeometricTransform2D
求旋转角度和比例因子。然后,您可以转换扭曲的图像,以恢复原始图像。
将图像带入工作区。
原始= imread (“cameraman.tif”);imshow(原始);文本(大小(原始的,2),大小(原始的,1)+ 15,...图片由麻省理工学院提供,...“字形大小”7“HorizontalAlignment”,“对”);
规模= 0.7;J = imresize(original, scale);尝试改变比例因子。θ= 30;扭曲= imrotate (J,θ);试着改变角度。图中,imshow(扭曲)
你可以通过改变输入图像的比例和旋转来进行实验。但是,请注意,在特征检测器无法找到足够的特征之前,您可以改变规模的数量是有限制的。
检测两个图像的特征。
ptsOriginal = detectSURFFeatures(原始);ptsDistorted = detectSURFFeatures(扭曲);
提取特征描述符。
[featuresOriginal, validptsororiginal] = extractFeatures(original, ptsororiginal);[featuresdistortion, validptsdistortion] = extractFeatures(扭曲的,扭曲的);
通过使用特征描述符匹配特征。
indexPairs = matchFeatures(featuresOriginal, featuresdistortion); / /匹配特征
检索每个图像对应点的位置。
matchedOriginal = validPtsOriginal (indexPairs (: 1));matchedDistorted = validPtsDistorted (indexPairs (:, 2));
显示假定的点匹配。
图;showMatchedFeatures(原始、扭曲、matchedOriginal matchedDistorted);标题(“假定匹配点(包括异常值)”);
使用统计鲁棒m估计样本一致性(MSAC)算法找到匹配点对对应的变换,MSAC算法是RANSAC算法的一种变体。它在计算变换矩阵时去除离群值。由于MSAC算法采用的随机抽样,你可能会看到变换计算的不同结果。
[tform, inlierIdx] = estimateGeometricTransform2D(...matchedDistorted matchedOriginal,“相似”);inlierdistortion = matcheddistortion (inlierIdx,:);inlierOriginal = matchedOriginal(inlierIdx,:);
显示在变换计算中使用的匹配点对。
图;showMatchedFeatures(原始、扭曲、inlierOriginal inlierDistorted);标题('匹配点(仅内联)');传奇(“ptsOriginal”,“ptsDistorted”);
使用几何变换,以恢复比例和角度。由于我们计算了从失真到原始图像的变换,我们需要计算它的逆来恢复失真。
设sc = s*cos()设ss = s*sin()
Then, Tinv = [sc -ss 0;党卫军sc 0;tx泰1]
其中tx和ty分别是x和y的平移。
计算逆变换矩阵。
Tinv = tform.invert.T;党卫军= Tinv (2, 1);sc = Tinv (1,1);scalercovered = sqrt(ss*ss + sc*sc
scalercovered = single 0.7010 thetaRecovered = single 30.2351
恢复的值应该匹配您选择的比例和角度值步骤2:调整大小和旋转图像.
通过对畸变图像的变换恢复原始图像。
outputView = imref2d(大小(原始));恢复= imwarp (tform扭曲,“OutputView”, outputView);
比较恢复
来原始
通过在蒙太奇里并排看他们。
图,imshowpair(原始的,恢复,“蒙太奇”)
的恢复
(右)图像质量不匹配原始
(左)图像因失真而恢复的过程。特别是图像的缩小会导致信息的丢失。边缘周围的伪影是由于转换的精度有限。如果你发现更多的点第三步:寻找图像之间的匹配特征,转换会更准确。例如,我们可以使用角点检测器detectFASTFeatures来补充查找斑点的SURF特征检测器。图像内容和图像大小也会影响被检测特征的数量。