Я недоумеваю от API до scipy.ndimage.interpolation.affine_transform. И, судя по этот вопрос, я не единственный. На самом деле я хочу делать более интересные вещи с помощью affine_transform, чем просто поворачивать изображение, но поворот для стартеров. (И да, я хорошо знаю scipy.ndimage.interpolation.rotate, но выяснение того, как управлять affine_transform, меня интересует здесь).
Когда я хочу делать такие вещи в таких системах, как OpenGL, я думаю с точки зрения вычисления преобразования, которое применяет матрицу вращения 2x2 R о центре c, и поэтому мышление о точках p преобразуется (p-c)R+c= pR+c-cR, что дает член c-cR, который будет использоваться в качестве трансляционной составляющей преобразования. Однако, в соответствии с вышеизложенным, scipy affine_transform делает "смещение первым", поэтому нам действительно нужно вычислить смещение s, чтобы (p-c)R+c=(p+s)R, который с бит перестановки дал s=(c-cR)R' где R' является обратным к R.
Если я подключу его к ноутбуку ipython (режим pylab, код ниже, возможно, потребует дополнительного импорта):
img=scipy.misc.lena()
#imshow(img,cmap=cm.gray);show()
centre=0.5*array(img.shape)
a=15.0*pi/180.0
rot=array([[cos(a),sin(a)],[-sin(a),cos(a)]])
offset=(centre-centre.dot(rot)).dot(linalg.inv(rot))
rotimg=scipy.ndimage.interpolation.affine_transform(
img,rot,order=2,offset=offset,cval=0.0,output=float32
)
imshow(rotimg,cmap=cm.gray);show()
Я получаю

который, к сожалению, не вращается вокруг центра.
Итак, какой трюк мне здесь не хватает?




