scipy.ndimage.interpolation.rotate之后旋转的图像坐标? [英] Rotated image coordinates after scipy.ndimage.interpolation.rotate?

查看:335
本文介绍了scipy.ndimage.interpolation.rotate之后旋转的图像坐标?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个numpy数组,用于从FITS文件读取的图像.我使用scipy.ndimage.interpolation.rotate将其旋转了N度.然后我想弄清楚原始非旋转帧中某个点(x,y)最终在旋转图像中的位置-即旋转的帧坐标(x',y')是什么?

I have a numpy array for an image that I read in from a FITS file. I rotated it by N degrees using scipy.ndimage.interpolation.rotate. Then I want to figure out where some point (x,y) in the original non-rotated frame ends up in the rotated image -- i.e., what are the rotated frame coordinates (x',y')?

这应该是一个非常简单的旋转矩阵问题,但是如果我执行常规的基于数学或编程的旋转方程式,则新的(x',y')不会以它们原来的位置结束.我怀疑这也与需要转换矩阵有关,因为scipy旋转函数是基于原点(0,0)而不是图像阵列的实际中心.

This should be a very simple rotation matrix problem but if I do the usual mathematical or programming based rotation equations, the new (x',y') do not end up where they originally were. I suspect this has something to do with needing a translation matrix as well because the scipy rotate function is based on the origin (0,0) rather than the actual center of the image array.

有人可以告诉我如何获得旋转的镜架(x',y')吗?例如,您可以使用

Can someone please tell me how to get the rotated frame (x',y')? As an example, you could use

from scipy import misc
from scipy.ndimage import rotate
data_orig = misc.face()
data_rot = rotate(data_orig,66) # data array
x0,y0 = 580,300 # left eye; (xrot,yrot) should point there

P.S.以下两个相关问题的答案对我没有帮助:

P.S. The following two related questions' answers do not help me:

使用scipy旋转图像后的新坐标. ndimage.rotate

推荐答案

与旋转一样,通常需要平移到原点,然后旋转,然后再平移.在这里,我们可以将图像的中心作为原点.

As usual with rotations, one needs to translate to the origin, then rotate, then translate back. Here, we can take the center of the image as origin.

import numpy as np
import matplotlib.pyplot as plt
from scipy import misc
from scipy.ndimage import rotate

data_orig = misc.face()
x0,y0 = 580,300 # left eye; (xrot,yrot) should point there

def rot(image, xy, angle):
    im_rot = rotate(image,angle) 
    org_center = (np.array(image.shape[:2][::-1])-1)/2.
    rot_center = (np.array(im_rot.shape[:2][::-1])-1)/2.
    org = xy-org_center
    a = np.deg2rad(angle)
    new = np.array([org[0]*np.cos(a) + org[1]*np.sin(a),
            -org[0]*np.sin(a) + org[1]*np.cos(a) ])
    return im_rot, new+rot_center


fig,axes = plt.subplots(2,2)

axes[0,0].imshow(data_orig)
axes[0,0].scatter(x0,y0,c="r" )
axes[0,0].set_title("original")

for i, angle in enumerate([66,-32,90]):
    data_rot, (x1,y1) = rot(data_orig, np.array([x0,y0]), angle)
    axes.flatten()[i+1].imshow(data_rot)
    axes.flatten()[i+1].scatter(x1,y1,c="r" )
    axes.flatten()[i+1].set_title("Rotation: {}deg".format(angle))

plt.show()

这篇关于scipy.ndimage.interpolation.rotate之后旋转的图像坐标?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆