图像旋转后如何重新映射点?

Posted

技术标签:

【中文标题】图像旋转后如何重新映射点?【英文标题】:How can I remap a point after an image rotation? 【发布时间】:2015-05-19 13:51:41 【问题描述】:

我有一个数学问题:假设我使用带有以下命令的 opencv 将图像围绕其中心旋转 30°:

M = cv2.getRotationMatrix2D((cols/2,rows/2),30,1)
img_rotate = cv2.warpAffine(img,M,(cols,rows))

如果a取img_rotate的像素(40,40),如何知道原图中对应的像素是什么?

编辑:换句话说,当我将旋转应用于图像时,我获得了转换后的图像。是否有可能获得点之间的映射?比如新图的(x,y)点对应原图的(x',y')点。

【问题讨论】:

只需对坐标进行相同的数学运算即可找到新值? 我不明白。原图对应值的坐标分别是哪些?我需要知道如何重新映射原始图像上的点 (40,40)。 InverseOfM*point 是您要查找的映射 【参考方案1】:

只需使用Affine Transformations 中描述的矩阵运算和逆矩阵。

# inverse matrix of simple rotation is reversed rotation.
M_inv = cv2.getRotationMatrix2D((100/2, 300/2),-30,1)


# points
points = np.array([[35.,  0.],
                   [175., 0.],
                   [105., 200.],
                   [105., 215.],
                  ])
# add ones
ones = np.ones(shape=(len(points), 1))

points_ones = np.hstack([points, ones])

# transform points
transformed_points = M_inv.dot(points_ones.T).T

【讨论】:

【参考方案2】:

您可以使用transform() 函数将给定的变换应用于点数组。

cv2.transform(pointsToTransform, M)

【讨论】:

太棒了!我是否使用 M 或修改后的矩阵(我认为我必须考虑反向旋转,所以 -30°)? 据我所知,它应该是相同的矩阵 M。 我错了,我认为这不是正确的答案。我需要的是对应点的坐标,而不是变换后的点。 您可以双向使用。从原始图像到您使用cv2.transform(coordinateInOriginalImage, M) 的新图像,反之则使用cv2.transform(coordinateInRotatedImage, M.inverse()) 我不了解 Python,但在 C++ 中它应该是点数组(可能只包含一个点)

以上是关于图像旋转后如何重新映射点?的主要内容,如果未能解决你的问题,请参考以下文章

matlab中图像旋转

如何使用MATLAB围绕不是图像中心点的点旋转图像?

旋转后图像变质

机器视觉学习笔记最近邻插值实现图片任意角度旋转(C++)

图像旋转中原图16×16分块测试2,映射后插入图中,测试边界信息

图像旋转的原理与实现