Я недоумеваю от 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()
Я получаю
который, к сожалению, не вращается вокруг центра.
Итак, какой трюк мне здесь не хватает?