求解旋转图像的最大内接矩形

工程源码GitHub: yhlleo/ImageDataAugmentation

编译环境:

  • CMake
  • OpenCV
  • Visual Studio 2010

在机器学习和深度学习中,通常使用为了增加数据(Data Augmentation)可以对数据进行例如一系列的旋转(rotate)、镜像(flip)等操作,本文将讲解如何求取旋转图像的最大内接矩形问题,这里的内接矩形,并不是数学上严格的内接概念,而是获得的矩形是不含如图 1所示的旋转导致的空白区域。



图 1



图 2

如图2所示,红色矩形ABCD是绿色矩形旋转一定角度后对应的结果,旋转中心定义在图像的中心,坐标轴方向x->col, y->row,则可有以下推导:

但是测试过程中就会发现,上面的分析,对于col近似等于row的图像会有问题,问题出自哪里呢?如图 3,很容得到的解是这样的蓝色的矩形框,因此,除了上面的极值条件,还必须添加相应的边界条件,从而获得紫色的矩形框边界。



图 3

可以看出,两种情况的最大不同就是, 矩形边AB与坐标轴col相交的点是否位于绿色矩形框的内部,前面推导的结果对于位于绿色矩形框内部是成立的,对于位于外部的情形,可有如下分析:

以上的推导在顺时针旋转角度a属于(0, 90)时成立,当角度位a属于(90, 180) 时等价于180-a,而当a为90°或180°时相对简单,更多的旋转角度也是以180°为周期,因此,整个旋转最大内接矩形的求取过程就分析完毕~