找到图像旋转和缩放
这个例子展示了如何对齐或注册两个因旋转和缩放变化而不同的图像。你可以使用fitgeotrans
手动选取相应的点,得到旋转角度和比例因子。然后,您可以转换扭曲的图像以恢复原始图像。
第一步:读取图像
将图像读入工作区。
原文= imread(“cameraman.tif”);imshow(原始);文本(大小(原始的,2),大小(原始的,1)+ 15,...图片由麻省理工学院提供,...“字形大小”7“HorizontalAlignment”,“对”);
步骤2:调整大小和旋转图像
量表= 0.7;扭曲= imresize(原始,缩放);试着改变比例因子。Theta = 30;扭曲= imrotate(扭曲,theta);试着改变角度。图中,imshow(扭曲)
步骤3:选择控制点
使用控制点选择工具选择至少两对控制点。
movingPoints = [151.52 164.79;131.40 - 79.04);fixedPoints = [135.26 200.15;170.30 - 79.30);
您可以使用这些预先选择的点运行示例的其余部分,但请尝试选择您自己的点,看看结果如何变化。
cpselect(扭曲,原来,movingPoints定点);
控件保存控制点文件菜单,然后保存点到工作区选择。保存这些点,重写变量movingPoints
而且定点
.
步骤4:估计转换
为控制点拟合非反射性相似性转换。
tform = fitgeotrans(movingPoints,fixedPoints,“nonreflectivesimilarity”);
在你完成了步骤5和6之后,重复步骤4到6,但是尝试使用“affine”而不是“nonreflectivesimarity”。会发生什么呢?结果和“非反射相似性”一样好吗?
第五步:求出比例和角度
几何变换,tform
的变换矩阵tform。T
.由于您知道变换只包括旋转和缩放,因此恢复缩放和角度的数学运算相对简单。
令sc = s*cos()
设ss = s*sin(theta)
然后,Tinv = invert(tform),和Tinv。T = [sc -ss 0;
Ss sc 0;
[n .]
其中tx和ty分别是x和y的平移。
tformInv =反转(tform);Tinv = tformInv.T;ss = Tinv(2,1);sc = Tinv(1,1);Scale_recovered =√(ss*ss + sc*sc)
Scale_recovered = 0.7000
Theta_recovered = atan2(ss,sc)*180/pi
Theta_recovered = 29.3741
的恢复值scale_recovered
而且theta_recovered
应该匹配您设置的值吗步骤2:调整大小和旋转图像.
步骤6:恢复原始映像
通过变换恢复原始图像扭曲的
,即旋转缩放后的图像,使用几何变换tform
以及你对空间参照的了解原始
.'OutputView'名称/值对用于指定重采样输出图像的分辨率和网格大小。
Roriginal = imref2d(size(original));恢复= imwarp(扭曲的,tform,“OutputView”, Roriginal);
比较恢复
来原始
用蒙太奇的方式把他们放在一起看。
图,imshowpair(原始的,恢复,“蒙太奇”)
的恢复
(右)图像质量不匹配原始
(左)图像因失真而恢复过程。特别是图像的收缩会造成信息的丢失。边缘周围的伪影是由于变换的精度有限。如果你选择更多的点步骤3:选择控制点时,变换会更准确。