此示例显示如何自动确定一对图像之间的几何变换。当一个图像通过旋转和缩放相对于另一个图像被扭曲时,使用探测拍摄
和estimateGeometricTransform2d.
找到旋转角度和比例因子。然后,您可以转换扭曲的图像以恢复原始图像。
将图像带入工作区。
原始= imread('cameraman.tif');imshow(原创);文字(尺寸(原件,2),尺寸(原版,1)+15,......“图片由马萨诸塞州理工学院提供”那......'字体大小'7,'水平对齐'那'正确的');
Scale = 0.7;j = imresize(原始,规模);%尝试改变比例因子。θ= 30;扭曲= imrotate(j,θ);%尝试改变角度,θ。图,imshow(扭曲)
您可以通过改变输入图像的比例和旋转来进行实验。但请注意,在特征检测器无法找到足够的功能之前,您可以在尺度上变化的数量限制。
检测两个图像中的特征。
ptsoriginal =探测器(原版);ptsdistorted =检测到(扭曲);
提取功能描述符。
[特征诡计,validptsoriginal] =提取物(原始,冒号);[具有截图,validptsdistorted] =提取物(扭曲,ptordistored);
使用其描述符匹配功能。
IndexPairs = MatchFeatures(特点,具有特色);
检索每个图像的对应点的位置。
matchedoriginal = validptsoriginal(indexpairs(:,1));matcheddistored = validptsdistorted(indexPairs(:,2));
显示推定点匹配。
数字;ShowMatchedFeatures(原版,扭曲,Matchedoriginal,MatchedDistorted);标题('提供匹配的积分(包括异常值)');
使用统计上鲁棒的M估计的样本共识(MSAC)算法找到与匹配点对对应的转换,这是RANSAC算法的变型。计算转换矩阵时,它会删除异常值。由于MSAC算法采用的随机采样,您可能会看到变换计算的变化结果。
[tform,inlieridx] = estimateGeometricTransform2D(......matcheddistorted,matchedoriginal,'相似');Inlierdistorted = matchedDistorted(Inlieridx,:);Inlieriginal = MatchedOriginal(Inlieridx,:);
显示匹配点对用于计算转换。
数字;ShowMatchedFeatures(原始,扭曲,inlieriginal,Inlierdistort);标题('匹配点(仅限最基于)');传奇('ptsoriginal'那'ptsdistorted');
使用几何变换,tform,恢复比例和角度。由于我们从扭曲到原始图像的转换,我们需要计算其反向恢复失真的反向。
让sc = s * cos(theta)让ss = s * sin(θ)
然后,TINV = [SC -SS 0;ss sc 0;TX TY 1]
其中tx和ty分别是x和y翻译。
计算逆变换矩阵。
tinv = tform.invert.t;ss = tinv(2,1);sc = tinv(1,1);scalerecovered = sqrt(ss * ss + sc * sc)thetarecovered = atan2(ss,sc)* 180 / pi
scalerecovered =单个0.7010 Thetarecovered =单身30.2351
恢复的值应符合所选的比例和角度值第2步:调整大小并旋转图像。
通过转换扭曲的图像来恢复原始图像。
OutputView = IMREF2D(大小(原始));恢复= imwarp(扭曲,tform,'OutputView',OutputView);
比较恢复
至原来的
通过在蒙太奇中并排看他们。
图,imshowpair(原始,恢复,'剪辑')
这恢复
(右)图像质量不匹配原来的
(左)图像由于失真和恢复过程。特别地,图像缩小导致信息损失。边缘周围的伪影是由于变换的有限精度。如果你要检测更多要点第3步:查找图像之间的匹配功能,转型将更加准确。例如,我们可以使用拐角探测器检测到,以补充找到斑点的冲浪特征检测器。图像内容和图像大小也影响了检测到的功能的数量。