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

其中

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

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

参考信息来自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的类似。

有了上面的讲解我们就不难理解这个仿射矩阵所作的事是对原始图像方法一倍。(原始仿射矩阵[[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模块组合目标检测中去 ? 未完待续。

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

  1. matlab 通过矩阵变换使图像旋转平移_数字图像处理|P11 第三章 第四节 图像的几何变换...

    第四节 几何变换 图像生成过程中,由于系统本身具有非线性或拍摄角度不同,会使生成的图像产生几何失真.几何失真一般分为系统失真和非系统失真,系统失真是有规律的.能预测的:非系统失真则是随机的.例如:(1 ...

  2. matlab 通过矩阵变换使图像旋转平移_28. 图像扭曲

    本文同步发表在我的微信公众号"计算摄影学",欢迎扫码关注 你有没有想过,下面这个视频中的特效应该如何实现? Morphing Female Starshttps://www.zhi ...

  3. 图像修复 图像补全_图像修复简介

    图像修复 图像补全 In practical applications, images are often corroded by noise. These noises are dust or wa ...

  4. python图像融合算法_图像融合质量评价方法的python代码实现——MS-SSIM

    图像融合质量评价方法的python代码实现--MS-SSIM 图像融合质量评价方法的python代码实现--MS-SSIM 文章目录 1 前言 2 MS-SSIM介绍 2 MS-SSIM的代码 2.1 ...

  5. java图像灰度直方图_图像灰度变换、二值化、直方图

    1.灰度变换 1)灰度图的线性变换 Gnew = Fa * Gold + Fb. Fa为斜线的斜率,Fb为y轴上的截距. Fa>1 输出图像的对比度变大,否则变小. Fa=1 Fb≠0时,图像的 ...

  6. 图像风格迁移_图像风格迁移—谷歌大脑团队任意图像风格化迁移论文详解

    点击蓝字关注我们 AI研习图书馆,发现不一样的世界 风格迁移 图像风格化迁移是一个很有意思的研究领域,它可以将一张图的风格迁移到另外一张图像上,由此还诞生了Prisma和Ostagram这样的商业化产 ...

  7. python图像去污_图像去雾----暗通道

    暗通道去雾算法原理及实现 1. 算法原理. 暗通道. 所谓暗通道是一个基本假设,这个假设认为,在绝大多数的非天空的局部区域中,某一些像素总会有至少一个颜色通道具有很低的值.这个其实很容易理解,实际生活 ...

  8. python图像下采样_图像的上采样(upsampling)与下采样(subsampled)

    缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有两个:1.使得图像符合显示区域的大小:2.生成对应图像的缩略图. 放大图像(或称为上采样(upsampli ...

  9. matlab 通过矩阵变换使图像旋转平移_opencv图像处理——几何变换

    几何变换大致分为仿射变换.投影变换.极坐标变换 完成几何变换需要两个独立的算法过程: 1.一个用来实现空间坐标变换的算法,用它描述每个像素如何从初始位置移动到终止位置 2.一个插值算法完成输出图像的每 ...

最新文章

  1. 构建前瞻性应用架构的优秀实践
  2. 用实例给新手讲解RSA加密算法
  3. STL常用容器大致对比
  4. 用MATLAB实现神经网络
  5. Java线程面试题TOP50
  6. WCF 内存入口检查失败 Memory gates checking failed
  7. C++从屏幕输入数字以空格分割,存入整型数组
  8. 智能语言-中科院分词系统ICTCLAS(NLPIR)
  9. 模拟电路与数字电路基础之模拟信号与数字信号 学习笔记
  10. ubuntu18字符终端不支持中文问题(汉字菱形)
  11. oracle imp 跳过表,关于oracle imp 导入避开若干表
  12. 小心你的Python程序,它会是你的一面镜子。小方块闯迷宫.py源代码简析。
  13. mysql wresp_mysql
  14. 物理机ping通Centos虚拟机,但虚拟机ping不通物理机的解决方法
  15. 云时代主机托管的现状和趋势
  16. 存储技术(一)-基本概念和技术发展
  17. 毕业论文知识点记录(四)——MaxEnt模型
  18. 看过一个报道湾湾川生态靠着自动售卖机就能很赚一笔
  19. c语言梅森素数求完数,梅森素数与完全数.doc
  20. 网站故事营销:这个真心不能少

热门文章

  1. 从JoinBatchGroup 代码细节 来看Rocksdb的相比于leveldb的写入优势
  2. 良好的用户体验应该...
  3. switch...case结构
  4. 【go】sdk + idea-plugin 开发工具安装
  5. phonegap调用摄像头
  6. 121-Best Time to Buy and Sell Stock
  7. 编码能力的提升?_20131228
  8. MFC最小化到系统托盘
  9. 精通ASP.NET中弹出窗口技术
  10. 使用Gearman做分布式计算