Rotated image coordinates after scipy.ndimage.interpolation.rotate?

后端 未结 1 1634
没有蜡笔的小新
没有蜡笔的小新 2020-12-15 01:24

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

相关标签:
1条回答
  • 2020-12-15 01:52

    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()
    

    0 讨论(0)
提交回复
热议问题