当前位置: 首页 > 编程日记 > 正文

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模块组合目标检测中去 ? 未完待续。

相关文章:

用伪代码模拟洗衣机的运转流程

今天的软导课又学到了不少“骚操作”,其中就包括Pseudocode和Top-down design。 不如现在就借着介绍洗衣机的运转流程向大家介绍一下这两个简单的东西。 题目如下 仔细观察您洗衣机的运作过程,运用Top-down设计方法和Pseudocode 描述洗衣机控制程序。 假…

使用 PHP 在站点上构建类似 Twitter 的系统

2019独角兽企业重金招聘Python工程师标准>>> 如果您曾经留意过,就会知道 Twitter 是 Web 2.0 世界最大的轰动事件之一。简单来说,Twitter(Twitter.com 上提供的一个服务)是一个简单的微博客服务,用户可以发…

Python中的变量以及赋值语句

列表的拷贝区别。 就是在Python中的任何的变量只是一个单纯的名字。名字只是数据的一个贴纸,名字可以来回的变动 赋值语句: 变量就像临时的“存储器”(就像厨房中的锅碗瓢盆),它的强大之处就在于,我们在操…

UE4制作程序背景游戏 Make a game with Procedural Backgrounds in UE4

使用虚幻引擎4蓝图创建一个程序背景的游戏 你会学到什么 学习虚幻引擎4要领 使用程序切片创建标高 保存并加载某些游戏元素 创造一个无止境的跑步者角色 创建和完成游戏的良好习惯和实践 MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz 语言:英…

android pop3与imap方式接收邮件(javamail)

需要下载3个jar包&#xff1a;mail.jar/ activation.jar/ additionnal.jar 1.pop3/** * 以pop3方式读取邮件&#xff0c;此方法不能读取邮件是否为已读&#xff0c;已经通过测试 * */ private void getEmail() { List<Map<String, Object>> list new A…

什么是条件组合覆盖_物史政组合分析,新高考最终受益者丨选科17期

导读&#xff0c;规划物理历史政治是新高考33模式下存在的选科组合&#xff0c;为了给马上面临选科问题的高一、高二考生提供有效帮助&#xff0c;自主选拔在线选科模型解读第17期就来分析一下该组合的学科特性、适合人群、优势劣势、专业覆盖及往年选考情况。说明&#xff1a;…

进击时代!王雪红的谦卑与坚守

节前&#xff0c;HTC董事长王雪红发表了一封内部信&#xff0c;王雪红在心中表示&#xff0c;2015年&#xff0c;HTC不仅要在质量、创新能力与工作效率方面更进步&#xff0c;并表示&#xff0c;“我们未来企业成长的动能不仅包含智能手机&#xff0c;还会加入新的领域如RE、虚…

Python中的过滤器

寄语&#xff1a;新的有一天&#xff0c;开始了&#xff0c;让我们把内心的一些想法都放一放&#xff0c;努力去学习吧。 《Python基础教程&#xff08;第2版&#xff0c;修订版&#xff09;&#xff09;》 Assignment 赋值 Variable 变量 Nan是一种特殊的简写 not a numb…

UE4材质着色器全面学习教程

你会学到什么 通过所有着色器类型和设计的实际演示&#xff0c;学习创建材质 要求 对虚幻的基本理解会有所帮助 了解纹理的一般知识(不仅限于UE4)也很有用 描述 在这个系列中&#xff0c;我将带你设置大量不同的材料&#xff0c;教你如何以实用的方式使用虚幻4材料系统。我们…

codeforces #310 div1 C

操作无论是U还是L&#xff0c;都会使原图形分裂成两个图形&#xff0c;且两个图形的操作互不影响 我们又发现由于操作点只可能在下斜线上&#xff0c;如果将操作按x排序 那么无论是U还是L&#xff0c;都会将操作序列完整分割成两半&#xff0c;且两个操作序列互不影响 这样我们…

硬盘温度70度正常吗_70多岁老年人原来血压160,现在130正常吗?医生为你分析实情...

70多岁的老年人&#xff0c;原来有高血压&#xff0c;高压160左右&#xff0c;现在是130左右&#xff0c;正常吗&#xff1f;这个问题问的太过笼统&#xff0c;我们只好通过这个问题&#xff0c;来分享一些老年高血压患者血压控制的一些知识点&#xff0c;希望能够对老年人的高…

使用python愉快地做高数线代题目~

今天接触到了python&#xff0c;发现真是极易上手啊&#xff01;对比c语言是什么鬼东西 诶&#xff0c;等下&#xff0c;看完教学文章发现TA在下面写了这句话 如果做了前面的内容你可能已被吸引了&#xff0c;觉得c语言真的是废材! 不。。。不是的。。。python 基础库几乎都…

Docker总结

2019独角兽企业重金招聘Python工程师标准>>> 查看docker的子命令&#xff0c;直接敲docker或完整的docker help就可以了: bash-3.2$ docker Usage: docker [OPTIONS] COMMAND [arg...] A self-sufficient runtime for linux containers. Options:-D, --debugfalse …

Python中的对象,类,super()函数

对象&#xff1a;&#xff08;1&#xff09;外观的特征 &#xff08;2&#xff09;正在做的事情 比如&#xff1a;那个穿蓝色衣服的正在打球的帅哥 类&#xff1a;属性&#xff08;静态的变量&#xff09;方法&#xff08;函数&#xff09;是对对象的近似 类名约定是以大写字…

Blender赛车动画制作学习教程 Learn Race Car Animation with Blender

使用Blender 2.93创建您自己的惊人汽车动画 你会学到什么 Blender的界面和导航 建模 UV制图 材料 动画 照明设备 渲染 合成 要求 下载并安装Blender。免费下载和免费用于任何目的。 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&…

数据结构-线性表的顺序结构

1 #include "stdio.h"2 #include "stdlib.h"3 4 typedef int ElemType; //线性表存储基本类型5 typedef int Status; //基本操作函数类型6 #define LIST_INT_SIZE 50 //线性表初始化存储空间分配量7 #define LISTINCREMENT 10 //线…

项目背景怎么描述_课程游戏背景下幼儿户外活动的组织和实施 ——记岱山县课程项目实施组活动...

课程游戏背景下幼儿户外活动的组织与实施——记岱山县课程项目实施组活动为了深入推进园本化课程实施的实践与研究&#xff0c;加强项目组幼儿园课程的建设与实施&#xff0c;提升项目组幼儿园课程质量。11月23日&#xff0c;县课程项目实施组活动在东沙镇中心幼儿园开展。本次…

兔子生兔子递归的理解

重要的是找规律&#xff01; 古典问题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数为多少&#xff1f; 月份 兔子对数 1 …

美团App首页实现之Category_HeaderView可翻页实现

一。主要实现功能&#xff1a;自定义indicator&#xff0c;侧滑页面切换页面内容&#xff0c;indicator跟着变化&#xff1b;二。实现步奏&#xff1a;1.自定义ViewPagerIndicator①&#xff1a;定义三个不同颜色的画笔②&#xff1a;在画布上画三个静态圆③&#xff1a;改变CX…

爬虫与浏览器的区别,爬虫产生(出自简书)

一篇文章了解爬虫技术现状 - 简书https://www.jianshu.com/p/fbdad6f77d0c 需求万维网上有着无数的网页&#xff0c;包含着海量的信息&#xff0c;无孔不入、森罗万象。但很多时候&#xff0c;无论出于数据分析或产品需求&#xff0c;我们需要从某些网站&#xff0c;提取出我们…

Unity2D游戏开发和C#编程大师班

本课程采用现代游戏开发的最新内容和最新技术(Unity 2D 2022) 学习任何东西的最好方法是以一种真正有趣的方式去做&#xff0c;这就是这门课程的来源。如果你想了解你看到的这些不可思议的游戏是如何制作的&#xff0c;没有比这门课更好的起点了。我们确保本课程具备从初学者(即…

python实训总结报告书_20172304 实验四python综合实践报告

20172304 实验四python综合实践报告 姓名&#xff1a;段志轩 学号&#xff1a;20172304 指导教师&#xff1a;王志强 课程&#xff1a;Python程序设计 实验时间&#xff1a;2020年5月13日至2020年6月14日 实验分析 本次是使用python来进行软件开发&#xff0c;python是一个有很…

Tornado框架

Tornado介绍Tornado 是 FriendFeed 使用的可扩展的异步非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像web.py&#xff08;豆瓣用这个写的&#xff09; 或者 Google 的 webapp&#xff0c;不过为了能有效利用非阻塞式服务器环境&#xff0c;这个 Web 框…

重组系统分区时设置系统盘

在快速分区那里选择另外一个模式&#xff0c;并且只选一个主分区

Javascript:DOM动态创建元素实例应用

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Dom:动态创建元素</title> </head> <body><ul id"demo1"> </ul> <input type"text" id"t…

上帝和面向对象的七天

上帝用7天创造了“面向对象” |【Python之父客串】http://bbs.fishc.com/thread-102596-1-1.html(出处: 鱼C论坛) 第一天&#xff1a; 计算机的诞生使得人类使用汇编语言进行编程&#xff0c;上帝说这个太复杂了&#xff0c;于是将编译的秘密告诉约翰.巴克斯.于是巴克斯创造了…

Maya游戏角色绑定入门学习教程 Game Character Rigging for Beginners in Maya

准备好开始为游戏制作自己的角色动画了吗&#xff1f; 你会学到什么 了解Maya的界面 优化并准备好你的模型&#xff0c;为游戏做准备 了解关节以及如何使用它们来构建健壮的角色骨骼&#xff0c;以便在任何游戏引擎中制作动画 了解IK和FK系统之间的区别 组织我们的3d场景以获得…

KMP算法简单分析

定义问题 字符串匹配是这样一个问题&#xff1a; 对于两个包含且仅包含字母表∑中的字母的串P&#xff0c;T&#xff0c;计算出所有有效的**移进**s使得P[1..|P|] T[s1..s|P|]。(|P|为P的长度)。 或者说&#xff1a;求出在什么位置P被T完全包含。 为了表达方便&#xff0c;定…

mysql查询并设置高亮_Thinkphp3.2.3设置MySql主从读写分离后,简单调用主数据库查询

图/文&#xff1a;迷神Thinkphp是一款不错的国产框架&#xff0c;使用范围广&#xff0c;应用也比较多。随着网站访问增大往往需要使用mysql主从同步功能&#xff0c;本身Thinkphp自带了主从读写分离的功能了。但是我们经常有一个场景就是某些特定的查询需要从主库进行查询&…