仿射变换实现组合操作 抠图+缩放+旋转

前言

之前在工作中需要用仿射变换的方式来实现,用给定的bounding box(标注框)从一张

图片中扣出特定的区域,然后做旋转和缩放等特定操作。然后在网上搜索了一下与仿射变换相关

的资料,看了仿射变换的思想和一些例子,然后结合手头上的代码,做了一些实验,最后终于搞

懂了如何实现。实验代码(提供C++、Scala和Python三种语言的实现):

码云地址

Github地址

正文

根据给定的标注框从原图中裁剪出物体并且对裁剪出的图片做各种随机旋转和缩放变换,

如果这几个步骤能合成一个仿射变换来做,则代码看起来会更加的简洁和通用。不过之前只了解

如何生成简单的仿射变换矩阵,而且上网上查阅了不少相关的资料,基本都是介绍一些常用的简

单变换,没看到这种有点复杂的组合变换怎么做。后来觉得还是得先了解清楚仿射变换的原理,

才知道怎么实现。首先贴上原图:

现在需要实现把图中的熊猫宝宝裁剪出来,标注框信息:[175,30,250,270], 这四个数字

从左到右的意思是, 标注框左上角x坐标, 标注框左上角y坐标, 框的宽, 框的高。

其实仿射变换的就是把原图上的一个点映射到目标图上的对应点,映射规则由变换矩阵

确定。然后复杂的仿射变换可以通过将简单的仿射变换对应的变换矩阵做矩阵乘法就得到

对应的复杂变换的矩阵。那么把图中的熊猫宝宝裁剪出来的,加上缩放和旋转等的组合变换,

其实可以分解为以下四个变换(这个是我实验的结果,可能还有其他更好的方式):

第一个变换矩阵(crop_mat)

是根据标注框以及裁剪出的大小生成裁剪与缩放组合矩阵,假设标注框信息是

[x, y, bboxW, bboxW],裁剪出的框大小 [outW, outH],这个大小表达的意思是相当于根据

标注框裁剪出物体后,再把该物体缩放的大小。首先我们先计算出物体在原图的中心点以及

物体在变换后的中心点,物体在原图的中心点就是 [x + bboxW / 2, y + bboxH / 2],变换后

的中心点就是 [outW / 2, outH / 2],则变换矩阵定义如下:

这个变换矩阵代表的意思简单来说就是把物体在原图上的中心点映射为裁剪缩放后图的中心点,

做个简单的验证即可,我们知道原图中心点是 [x + bboxW / 2, y + bboxH / 2],做个矩阵向

量乘法就到了[outW / 2, outH / 2]。

第二个变换矩阵(shift_mat1)

是平移矩阵,是做旋转之前的准备工作,把经过第一个变换后的中心点

(就是[outW / 2, outH / 2])平移到原点,矩阵定义:

第三个变换矩阵(rotate_map)

是旋转矩阵,给定旋转的角度 a,变换矩阵定义如下:

需要注意的是,用于计算公式中的cos和sin是弧度,所以要先把角度转为弧度,就是

先除以180再乘以pi。

第四个变换矩阵(shift_mat2)

是平移矩阵,把经过中心点平移回原来的位置,矩阵定义:

然后四个矩阵连续做矩阵乘法(注意不是矩阵点乘)就得到组合矩阵,哪个变换先做,

则优先排在右边,所以最后的矩阵是 shift_mat2 * rotate_mat * shift_mat1 * crop_mat:

有兴趣的读者可以自己推导下。

实验结果

标注框信息:[175,30,250,270]。

实验一、裁剪后图片大小设为[250,270],旋转0度

实验二、裁剪后图片大小设为[250,270],旋转20度

实验三、裁剪后图片大小设为[500,540],旋转-20度

实验四、裁剪后图片大小设为[125,135],旋转0度

相关资料

[1] 仿射变换

[2] 图像几何变换之仿射变换

[3] 何为仿射变换(Affine Transformation)

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CVer

[计算机视觉论文速递] ECCV 2018 专场2

Amusi 将日常整理的论文都会同步发布到 daily-paper-computer-vision 上。名字有点露骨,还请见谅。喜欢的童鞋,欢迎star、for...

660
来自专栏用户2442861的专栏

Torch深度学习入门

lua和torch的安装官网都有,lua的语法基础知识网上有很多。请看本文前自行学习。本文简单介绍了torch做深度学习模型的简单用法,并给出了CIFAR-10...

602
来自专栏Fish

Andrew Ng的机器学习课程概述(一)

写在最前面 吴神的机器学习神课,网上也有很多写得很好的笔记了比如:很好的中文版;更好的英文版 在视频看累的时候看看这个基本上也错过不了知识点。 这门课基本...

1789
来自专栏机器之心

资源 | 谷歌官方开源tf-seq2seq:一种通用编码器-解码器框架

选自Google 机器之心编译 参与:吴攀 谷歌又开源了!tf-seq2seq 是一个用于 TensorFlow 的通用编码器-解码器框架(encoder-de...

2927
来自专栏算法channel

案例实战|泰坦尼克号船员获救预测(XGBoost提交结果)

01 — 回顾 泰坦尼克号的案例系列已经推送了2个,分别解决了数据预处理:特征工程,数据清洗等,包括模型的BaseLine阶段的求解,关于这两篇文章,请参考: ...

4166
来自专栏深度学习之tensorflow实战篇

归一化与标准化详解

归一化(Normalization) 1.把数据变为(0,1)之间的小数。主要是为了方便数据处理,因为将数据映射到0~1范围之内,可以使处理过程更加便捷、快速。...

4318
来自专栏专知

春节充电系列:李宏毅2017机器学习课程学习笔记09之Tip for training DNN

【导读】我们在上一节的内容中已经为大家介绍了台大李宏毅老师的机器学习课程的简单实践,这一节将主要针对讨论训练DNN的小技巧。本文内容涉及机器学习中训练DNN的若...

3768
来自专栏算法channel

矩阵特征值的求解例子

《实例》阐述算法,通俗易懂,助您对算法的理解达到一个新高度。包含但不限于:经典算法,机器学习,深度学习,LeetCode 题解,Kaggle 实战。期待您的到来...

3137
来自专栏CVer

风格迁移三部曲(一)之普通风格迁移

风格迁移(Style Transfer)是一个很有意思的任务,通过风格迁移可以使一张图片保持本身内容大致不变的情况下呈现出另外一张图片的风格。风格迁移三步曲将绍...

730
来自专栏贾志刚-OpenCV学堂

OpenCV图像处理之基于积分图实现NCC快速相似度匹配

基于Normalized cross correlation(NCC)用来比较两幅图像的相似程度已经是一个常见的图像处理手段。在工业生产环节检测、监控领域对对象...

611

扫码关注云+社区