前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >仿射变换实现组合操作 抠图+缩放+旋转

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

原创
作者头像
Ldpe2G
发布于 2018-06-22 00:38:38
发布于 2018-06-22 00:38:38
8560
举报

前言

之前在工作中需要用仿射变换的方式来实现,用给定的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)

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
仿射变换实现组合操作 抠图+缩放+旋转
前言          之前在工作中需要用仿射变换的方式来实现,用给定的bounding box(标注框)从一张图片 中扣出特定的区域,然后做旋转和缩放等特定操作。然后在网上搜索了一下与仿射变换相关的资料, 看了仿射变换的思想和一些例子,然后结合手头上的代码,做了一些实验,最后终于搞懂了如何实现。 实验代码(提供C++、Scala和Python三种语言的实现): 码云地址 Github地址 正文          根据给定的标注框从原图中裁剪出物体并且对裁剪出的图片做各种随机旋转和缩放变换, 如果这几个步骤
Ldpe2G
2018/07/09
1.8K0
生成组合仿射变换矩阵,裁剪+缩放+平移+斜切+旋转
在翻以前oschina上写的博客的时候,看到这篇觉得还挺有趣的,就重新修改并添加一些新的内容发到再公号上。
BBuf
2020/07/02
4.5K0
常用数据增广方法,解决数据单一问题
寄语:本文将对传统图像算法的数据增广方式进行学习,以最常用的平移和旋转为例,帮助大家梳理几何变换的概念和应用,并对其在OpenCV的框架下进行了实现。
Datawhale
2020/05/29
2.3K0
图像变换-旋转问题来了
上次写了图像变换-旋转问题,试一试?,后面留了个问题,本来就是随便说说的,留给大家一个探索的机会,刚好碰到最近事情也有点多,没空弄。
叶子陪你玩
2022/01/05
3930
图像变换-旋转问题来了
【愚公系列】2023年04月 Halcon机器视觉-仿射变换详解
仿射变换,即在二维平面内,对象进行平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和斜切(Shear)等操作。
愚公搬代码
2023/04/07
1.8K0
【愚公系列】2023年04月 Halcon机器视觉-仿射变换详解
【opencv实践】仿射变换和透视变换
上面这副图就是我们今天要处理的了,我们想把它从拍照视角变成鸟瞰图,这是机器人导航中的常用手段,以便在该平面上进行规划和导航。
周旋
2020/06/04
5.6K1
10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换 OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)数字图像
  图像几何变换又称为图像空间变换,它将一副图像中的坐标位置映射到另一幅图像中的新坐标位置。我们学习几何变换就是确定这种空间映射关系,以及映射过程中的变化参数。图像的几何变换改变了像素的空间位置,建立一种原图像像素与变换后图像像素之间的映射关系,通过这种映射关系能够实现下面两种计算:
vv彭
2020/10/27
3.9K0
10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换
    


OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)数字图像
【走进OpenCV】重映射与仿射变换
其中的 f 就是映射方式,也就说,像素点在另一个图像中的位置是由 f 来计算的。
小白学视觉
2019/10/24
1.2K0
计算机视觉:6.2~6.5 图像的基本变换与仿射变换
图像的基本变换与仿射变换 6.2 图像的翻转和旋转 图像的翻转 flip(src, flipCode) flipCode=0:上下翻转; flipCode>0:左右翻转; flipCode<0:上下 + 左右翻转; # 图像的翻转 import cv2 import numpy as np # 读取图片 doge = cv2.imread('./doge.jpg') new_doge1 = cv2.flip(doge, flipCode=0) new_doge2 = cv2.flip(doge, fl
DioxideCN
2022/08/05
7870
计算机视觉:6.2~6.5 图像的基本变换与仿射变换
番外篇: 仿射变换与透视变换
常见的2D图像变换从原理上讲主要包括基于2×3矩阵的仿射变换和基于3×3矩阵透视变换。
CodecWang
2021/12/07
2.1K0
番外篇: 仿射变换与透视变换
【从零学习OpenCV 4】图像仿射变换
经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《从零学习OpenCV 4》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。
小白学视觉
2019/11/30
9400
基于FPGA的图像旋转设计
图像旋转是指图像按照某个位置转动一定角度的过程,旋转中图像仍保持这原始尺寸。图像旋转后图像的水平对称轴、垂直对称轴及中心坐标原点都可能会发生变换,因此需要对图像旋转中的坐标进行相应转换。
数字积木
2021/04/15
1.1K0
opencv仿射变换之图像平移
仿射变换是图像旋转,缩放,平移的总称。具体的做法是通过一个矩阵和原图坐标进行计算,得到新的坐标,完成变换。所以关键就是这个矩阵。
淼学派对
2023/10/14
2120
opencv仿射变换之图像平移
经典重读 | 深度学习方法:卷积神经网络结构变化——Spatial Transformer Networks
作者 | 大饼博士X 本文具体介绍Google DeepMind在15年提出的Spatial Transformer Networks,相当于在传统的一层Convolution中间,装了一个“插件”,可以使得传统的卷积带有了[裁剪]、[平移]、[缩放]、[旋转]等特性。 理论上,作者希望可以减少CNN的训练数据量,以及减少做data argument,让CNN自己学会数据的形状变换。相信这篇论文会启发很多新的改进,也就是对卷积结构作出更多变化,还是比较有创意的。 背景知识:仿射变换、双线性插值 在理解
AI科技大本营
2018/04/27
1.8K0
经典重读 | 深度学习方法:卷积神经网络结构变化——Spatial Transformer Networks
仿射变换与透视变换
仿射变换保证物体形状的“平直性”和“平行性”。透视变换不能保证物体形状的“平行性”。仿射变换是透视变换的特殊形式。 将透视变换写成3*3矩阵形式,即为M; 以下面这张图为例,实现仿射变换,包括旋转,平
一棹烟波
2018/01/12
1.3K0
仿射变换与透视变换
OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】
OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)(python为工具) 【Open_CV系列(五)】
全栈程序员站长
2022/11/16
1.1K0
OpenCV图像几何变换专题(缩放、翻转、仿射变换及透视)【python-Open_CV系列(五)】
WebGL简易教程(五):图形变换(模型、视图、投影变换)
通过之前的教程,对WebGL中可编程渲染管线的流程有了一定的认识。但是只有前面的知识还不足以绘制真正的三维场景,可以发现之前我们绘制的点、三角形的坐标都是[-1,1]之间,Z值的坐标都是采用的默认0值,而一般的三维场景都是很复杂的三维坐标。为了在二维视图中绘制复杂的三维场景,需要进行相应的的图形变换;这一篇教程,就是详细讲解WebGL的图形变换的过程,这个过程同样也适合OpenGL/OpenGL ES,甚至其他3D图形接口。
charlee44
2019/10/08
2.9K0
WebGL简易教程(五):图形变换(模型、视图、投影变换)
OpenCV系列之图像的几何变换 | 十四
OpenCV提供了两个转换函数cv.warpAffine和cv.warpPerspective,您可以使用它们进行各种转换。cv.warpAffine采用2x3转换矩阵,而cv.warpPerspective采用3x3转换矩阵作为输入。
磐创AI
2019/12/03
7840
opencv仿射变换之获取变换矩阵
.getAffineTransform(src[],dst[])通过三点可以确定变换后的位置,相当于解方程,3个点对应三个方程,能解出偏移的参数和旋转的角度。
淼学派对
2023/10/14
3910
opencv仿射变换之获取变换矩阵
【OpenCV】Chapter3.图像的仿射变换
仿射变换其实包含了一系列的操作:平移,缩放,旋转等,不过所有的操作都可以通过这个仿射变换矩阵来实现。
zstar
2022/09/22
1.2K0
【OpenCV】Chapter3.图像的仿射变换
推荐阅读
相关推荐
仿射变换实现组合操作 抠图+缩放+旋转
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文