旋转后计算边界框

时间:2019-04-09 14:48:30

标签: numpy image-processing

我有一张图像,相应的4点边界框看起来像[685,601,832,743],我想执行一些旋转,如90、180、270等。

我不确定在旋转图像90后如何获取图像的边界框。我正在使用imagemagick进行旋转,我寻找了在旋转图像后会给我边界框的任何功能图片,但我找不到任何图片,我已经坚持了3个多小时。此刻的任何建议都将非常有帮助。谢谢您。

1 个答案:

答案 0 :(得分:0)

使用ImageMagick和一些bash shell脚本,这是计算方法。

使用基本点旋转方程式。 (请参见https://en.wikipedia.org/wiki/Rotation_of_axes)。但是,由于旋转是围绕中心,因此必须从点坐标中减去输入的中心坐标,进行旋转,然后再将输出图像的中心加回去。

请注意,ImageMagick旋转为顺时针旋转,而通常的坐标转换方程式指定为逆时针旋转。所以我必须取消旋转角度。

还要注意,Y在图像坐标中向下为正,法向坐标旋转时Y向上。因此,图像与法线直角坐标系之间的方程式中存在符号交换。

这是我创建的测试图像:

convert -size 300x300 xc:skyblue -size 100x100 xc:pink -geometry +50+50 -composite test.png


enter image description here

显然(从ImageMagick命令),四个角是:

pt1=50,50
pt2=149,50
pt3=149,149
pt4=59,149


较大的值(149)比粉色尺寸加上起始坐标(100-1 + 50 = 149)小1,因为在ImageMagick中索引从0开始。偏移量相对于0。

接下来,我旋转图像:

convert test.png -background black -rotate 20 test2.png


enter image description here

因此要计算输出中的4个点,我首先需要知道给定旋转角度下输出的大小。

angle=20
ww=300
hh=300
ang=-$angle
wwr=$(convert xc: -format "%[fx:($ww*cos(pi*abs($ang)/180)+$hh*sin(pi*abs($ang)/180))]" info:)
hhr=$(convert xc: -format "%[fx:($ww*sin(pi*abs($ang)/180)+$hh*cos(pi*abs($ang)/180))]" info:)
echo "$wwr x $hhr"
384.514 x 384.514

Rounding to whole numbers, it would be
wwr=385
hhr=385

Note for computing the new dimensions, I use the abs of the sin and cos and all positive signs


接下来,我将4个点重新格式化为X和Y数组,以备后用。

pt1=50,50
pt2=149,50
pt3=149,149
pt4=59,149
list="$pt1 $pt2 $pt3 $pt4"
echo "$list"
i=0
for pt in $list; do
xArr[$i]=$(echo "$pt" | cut -d, -f1)
yArr[$i]=$(echo "$pt" | cut -d, -f2)
i=$((i+1))
done
echo "${xArr[*]}"
50 149 149 59
echo "${yArr[*]}"
50 50 149 149


现在,我计算旋转的4个角坐标:

angle=20
xlast=299
ylast=299
wwr=385
hhr=385
for ((i=0; i<4; i++)); do
xr=$(convert xc: -format "%[fx:((${xArr[$i]}-300/2)*cos(pi*$ang/180)+(${yArr[$i]}-300/2)*sin(pi*$ang/180)) + $wwr/2]" info:)
yr=$(convert xc: -format "%[fx:((${yArr[$i]}-300/2)*cos(pi*$ang/180)-(${xArr[$i]}-300/2)*sin(pi*$ang/180)) + $hhr/2]" info:)
echo "$xr,$yr"
done
132.733,64.3287
225.762,98.1887
191.902,191.218
107.33,160.436


您可以在输出图像中对其进行测量以查看它们是否正确。您可以根据需要四舍五入为整数。

如果要使用矩形边界框,则只需计算minx,miny,maxx,maxy值即可。