matlab 通过矩阵变换使图像旋转平移_图像的几何变换

学习图像中的仿射变换(affine transform), 这是一种线性变换(涵盖旋转,平移,错切(shear), 缩放等线性变换),既然是线性变换则可以通过线性变换(矩阵)来获得。仿射变换矩阵M为2*3的矩阵。仿射变换的性质有“平直性”和“平行性”。即直线经过affine以后还是直线,两条平行的线经过affine以后依旧是平行的。
透视变换(prespective transform),也是一种线性变换,只不过其中3*3的矩阵来表达,其拥有8个自由度。其数学原理和affine_transform是一样的。
表达式为:

3327b89dda6fcff1bda3595e472950b0.png


其中

表示变换后的坐标, [x,y]表示原始坐标。

所以一般的逻辑步骤为,首先我们获取src ---> dst的变换矩阵,然后将这个矩阵应用到原始图像上去。
但是实际中这样的做是有风险的。首先所面临的风险是采样失真,原因是因为经过变换后原始图像的整数像素点可能变为小数像素点。这涉及到插值的部分,但是因为有可能目标图像上该点周围并无整数点像素而 无法使用周围四个点进行双线性插值,第二个风险就是原始图像上的某些点经过映射后超出了图像的画幅,这时需要策略来处理这种情况。所以我们可以这样做,求dst ---> src的变换,即通过目标图像的像素来求原始图像上对应点。这里其实需要处理两个问题:

9fda5119dbb3c71d97d3403ee5b8d6c4.png
参考信息来自opencv官方文档


外推原始图像上不存在的像素点插值有小数点位置的像素值。opencv中有cv2.getAffineTransform(src, dst)方法来获取仿射矩阵。这里面src和dst表示对应的三个非共线点的坐标以及目标图像对应的三个点的坐标。(为什么需要三个点?因为这里涉及到解线性方程问题,而仿射矩阵有6个自由度,那么至少需要三个点就能解出方程了,为自由度的一半。这个最简单的方法是x+y=1, 两个自由度,给出x就能求出y了)。获得仿射矩阵以后,使用cv2.warpAffine(img, affine_matrix, dsize).这表面上是从src-->dst的过程。但是实际上计算的时候是计算从dst --> src (可以用cv2.invertAffineTransform(affine_matrix)将仿射矩阵的逆操作计算出来),这样的话每次就是从dst对应的坐标中寻找src所对应的像素点(也许是整数点,也许的带小数点的,也是不在src的图像范围内)。整数点就直接copy, 小数点就直接双线性插值,超出边界了要么外推该像素点的像素要么就不改变该点的像素值。说完了opencv是怎么做的,那么来看看torch中的是怎么实现这个的。Torch.nn.functional 中也有实现类似变换的过程。但是这里面就直接是从dst --> src。所以输入的仿射矩阵就应该是dst --> src。 而不是像opencv中从src ---> dst 这样来输入仿射矩阵。这里面需要两个函数配合使用。grid = affine_grid(invert_affine_matrix, input_size), 获取输出的每个点对应与输入的索引。 然后使用grid_sample(image, grid)得到最终的输出图像。里面原理我怀疑和opencv的类似。

5a9b23be444716fedbf038b1f659db2a.png

有了上面的讲解我们就不难理解这个仿射矩阵所作的事是对原始图像方法一倍。(原始仿射矩阵[[2, 0, 0], [0, 2, 0]], 逆仿射矩阵为[[0.5, 0, 0], [0, 0.5, 0]])参考资料:
【pytorch affine_grid的用法】
【opencv 几何变换】
【图像中的坐标变换(刚体变换、相似变换、仿射变换、投影变换)】
【Spatial Transformer Networks 详细解析】

(STN网络的本质就是学习一个仿射变换矩阵,使得 图像/特征 应用这个仿射矩阵后可以将一些例如旋转,缩放,平移等形变给cover到,因此使得网络得到了cover形变的能力,但是因为对于形变处理这部分是没有监督信息的,所以整个的形变效果是严重依赖数据集的形变分布的)
知识延伸:将STN模块组合目标检测中去 ? 未完待续。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值