生成组合仿射变换矩阵,裁剪+缩放+平移+斜切+旋转

Posted 浩瀚之水_csdn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成组合仿射变换矩阵,裁剪+缩放+平移+斜切+旋转相关的知识,希望对你有一定的参考价值。

前言

在翻以前oschina上写的博客的时候,看到这篇觉得还挺有趣的,就重新修改并添加一些新的内容发到再公号上。

一般对图像做 augmentation 都会用仿射变换去实现,如果是用OpenCV来实现就是生成一个放射变换矩阵再调用OpenCV的warpAffine 函数,传入变换矩阵和图片得到变换后的输出,这里的难点在于如何生成这个仿射变换矩阵。

本文通过结合一个实际的例子(根据 bounding box 从图片中裁剪出特定的区域,然后做旋转、斜切和缩放等操作)来讲解如何通过一个简单的方法生成组合操作的仿射变换矩阵。

本文实验代码(包含了C++、Scala 和 Python 的实现):

https://github.com/Ldpe2G/CodingForFun/tree/master/AffineTransformationEx

实际例子

下面来看下一个实际的例子,比如下图,根据给定的标注框从原图中裁剪出熊猫宝宝,并且对其做旋转、斜切和缩放等操作。

标注框

[175,30,250,270]

, 这四个数字从左到右的意思分别是, 标注框左上角

x

坐标, 标注框左上角

y

坐标, 框的宽和高。

其实仿射变换原理就是把原图上的一个点映射到目标图上的对应点,映射规则由变换矩阵确定。然后复杂的仿射变换可以通过将简单的仿射变换矩阵做矩阵乘法就得到。

像上面的例子,把图中的熊猫宝宝裁剪出来的,加上缩放、斜切和旋转等的组合变换,其实可以分解为6个变换(这个6个矩阵的顺序是我实验的结果,可能还有其他更好的方式):

裁剪、缩放、平移、旋转、斜切、平移

1、裁剪矩阵

第一个变换矩阵,是根据标注框生成裁剪的矩阵,假设标注框信息是

[x,y,bboxW,bboxW]

,则裁剪出的框大小为。

首先计算出物体在原图的中心点以及物体在变换后的中心点,物体在原图的中心点坐标是

[x+bboxW/2,y+bboxH/2]

,而变换后的中心点坐标是

[bboxW/2,bboxH/2]

,则裁剪变换矩阵定义如下:

cropMat=⎡⎢⎣10−x01−y001⎤⎥⎦

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

做个简单的验证即可,物体在原图中心点坐标是

[x+bboxW/2,y+bboxH/2,1]

,做个矩阵向量乘法就得到了

[bboxW/2,bboxH/2,1]

2、缩放矩阵

第二个矩阵是根据输出大小作缩放,假设裁剪出来之后需要把图片大小缩放为 [outW,outH],则缩放矩阵为:

scaleMat=⎡⎢⎣outW/bboxW000outH/bboxH0001⎤⎥⎦

3、平移矩阵

第三个矩阵是为了第四个旋转做准备的,首先把图中心点平移到左上角的原点,经过前两个变换之后,图片中心点变为[outW/2,outH/2],相当于把该点平移到左上角的原点,则平移矩阵为:

shiftMat1=⎡⎢⎣10−(outW/2)01−(outH/2)001⎤⎥⎦

4、旋转矩阵

然后以原点为中心旋转

a

度,则旋转矩阵如下:

rotateMat=⎡⎢⎣cos(a)sin(a)0−sin(a)cos(a)0001⎤⎥⎦

需要注意的是计算公式中的

a

表示的是弧度,所以要把角度转为弧度,就是要先把角度除以 180 再乘以

pi

5、斜切矩阵

接着假设斜切变换因子是

sf

x

y

方向可以单独设置,这里是统一设为一个值了,则斜切矩阵如下:

shearMat=⎡⎢⎣1sf0sf10001⎤⎥⎦

6、平移矩阵

最后做完变换之后,再把原点平移回原来的中心点,平移矩阵如下:

shiftMat2=⎡⎢⎣10(outW/2)01(outH/2)001⎤⎥⎦

得到最后的组合矩阵

最后把这6个矩阵做矩阵乘法(注意不是矩阵点乘)就得到最终的组合矩阵,注意哪个变换先做则优先排在右边,所以最后的矩阵是:

shiftMat2∗shearMat∗rotateMat∗shiftMat1∗scaleMat∗cropMat

实验结果

标注框信息:

[175,30,250,270]

实验一、裁剪后图片大小设为

[250,270]

,旋转0度

实验二、裁剪后图片大小设为

[250,270]

,逆时针旋转20度

实验三、裁剪后图片大小设为

[500,540]

,顺时针旋转20度

实验四、裁剪后图片大小设为

[500,540]

,斜切系数-0.2

实验四、裁剪后图片大小设为

[500,540]

,顺时针旋转20度,斜切系数0.2

参考资料

  • [1] https://blog.csdn.net/xbcreal/article/details/52549629
  • [2] https://www.cnblogs.com/liekkas0626/p/5238564.html
  • [3] https://www.cnblogs.com/bnuvincent/p/6691189.html
  • [4] https://www.mathworks.com/discovery/affine-transformation.html#:~:text=Affine%20transformation%20is%20a%20linear,with%20non%2Dideal%20camera%20angles.

以上是关于生成组合仿射变换矩阵,裁剪+缩放+平移+斜切+旋转的主要内容,如果未能解决你的问题,请参考以下文章

对图像的仿射变换

opencv 图像平移缩放旋转翻转 图像仿射变换

OpenCV从仿射矩阵得到旋转量平移量缩放量

OpenCV从仿射矩阵得到旋转量平移量缩放量

halcon几何变换(仿射变换)

opencv 图像变换原理详解 图像平移 图像旋转 图像缩放