如何在缩放和旋转后重新计算点的坐标?

2024-04-24 13:07:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有图像中6个点的坐标

(170.01954650878906, 216.98866271972656)
(201.3812255859375, 109.42137145996094)
(115.70114135742188, 210.4272918701172)
(45.42426300048828, 97.89037322998047)
(167.0367889404297, 208.9329833984375)
(70.13690185546875, 140.90538024902344)

我有一个点作为中心[89.2458, 121.0896]。我尝试使用4个旋转度(从0,90,-90180)和6个缩放因子(0.5,0.75,1,1.10,1.25,1.35,1.5)重新计算点的位置。
我的问题是如何旋转和缩放上述点相对于中心点,并得到这6个点的新坐标?在

非常感谢你的帮助。在


Tags: 图像中心因子中心点
1条回答
网友
1楼 · 发布于 2024-04-24 13:07:17

数学

一种数学方法是将这些数据表示为从中心到图像点的向量,将这些向量转换到原点,应用转换并围绕中心点重新定位它们。让我们详细看看这是如何工作的。在

表示为向量

我们可以在一个网格中显示这些向量,这将产生下面的图像

Representation of the given points as vectors around the center point

这张图片提供了一个很好的观察这些点的方法,所以我们可以用视觉的方式看到我们的行为。中心点在所有箭头的开头用一个点标记,每个箭头的末端是问题中提供的一个点的位置。在

一个向量可以看作是点坐标值的列表

my_vector = [point[0], point[1]]

可能是python中向量的表示,它只保存一个点的坐标,所以问题中的格式可以按原样使用!请注意,在我的答案中,我将使用0作为x坐标,1作为y坐标。在

我只添加了这个表示作为一个视觉辅助,我们可以把任何两个点的集合看作一个向量,不需要计算,这只是看这些点的另一种方式。在

翻译到原点

第一次计算发生在这里。我们需要把这些向量都转换到原点。我们可以很容易地从所有其他点减去中心点的位置,例如(可以在一个简单的循环中完成):

^{pr2}$

结果点现在可以绕原点旋转并相对于原点缩放。新点(作为向量)如下所示:

The same vectors as above, but translated around the origin

在这张图片中,我故意保持比例不变,这样很明显,这些向量(箭头)在大小和方向上完全相同,只是移动到(0,0)左右。在

为什么是起源

那么为什么要把这些点翻译成原点呢?好吧,在原点周围旋转和缩放操作很容易(数学上)做,而在其他点周围就不那么容易了。在

另外,从现在开始,我将只在这些图像中包括第一点、第二点和第四点,以节省一些空间。在

围绕原点缩放

在原点周围缩放操作非常简单。只需将点的坐标乘以比例因子:

scaled_point_x = point[0] * scaling_factor
scaled_point_y = point[1] * scaling_factor

从视觉上看,如下所示(缩放比例均为1.5):

Scaled vectors and original vectors

其中蓝色箭头为原始矢量,红色箭头为缩放矢量。在

旋转

现在轮换一下。这有点难,因为旋转通常是用这个向量的矩阵乘法来描述的。在

与之相乘的矩阵如下

rotation matrix

(来自wikipedia: Rotation Matrix

所以如果V是向量,我们需要执行V_r = R(t) * V来得到旋转向量{}。此旋转将始终逆时针!为了顺时针旋转,我们只需使用R(-t)。在

因为这个问题只需要90°的倍数,矩阵就变成了一个几乎微不足道的问题。逆时针旋转90°时,矩阵为:

Rotation matrix for 90° counterclockwise

基本上是代码:

rotated_point_x = -point[1]    # new x is negative of old y
rotated_point_y = point[0]     # new y is old x

同样,这可以很好地以视觉方式显示:

rotation 90° counterclockwise

我已经匹配了向量的颜色。在

顺时针旋转90度

rotated_counter_point_x = point[1]    # x is old y
rotated_counter_point_y = -point[0]   # y is negative of old x

旋转180°将取负坐标,或者,你可以按-1的因子进行缩放,这基本上是一样的。在

作为这些操作的最后一点,我想补充一下,您可以在一个序列中任意缩放和/或旋转,以获得所需的结果。在

转换回中心点

在缩放操作和/或旋转之后,剩下的唯一事情就是将向量重新传输到中心点。在

retranslated_point_x = new_point[0] + center_point_x
retranslated_point_y = new_point[1] + center_point_y

A一切都结束了。在

只是回顾一下

所以回顾一下这篇长文章:

  1. 从图像点的坐标中减去中心点的坐标
  2. 用简单的坐标相乘的因子进行缩放
  3. 使用矩阵乘法的思想来考虑旋转(你可以很容易地在Google或Wikipedia上找到这些东西)。在
  4. 将中心点的坐标添加到图像点的新坐标

我现在意识到我本可以简要回顾一下,但现在至少有一些视觉帮助和一点数学背景,这篇文章也不错。我真的相信,这样的问题应该从数学的角度来看待,数学描述可以帮助很多。在

相关问题 更多 >