图像旋转后如何重新映射点?
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++ 中它应该是点数组(可能只包含一个点)以上是关于图像旋转后如何重新映射点?的主要内容,如果未能解决你的问题,请参考以下文章