2014-09-17 1 views
1

Я пытаюсь использовать skimage в питоне, чтобы повернуть изображение, в OpenCV, it seems I can do:питона: центр вращения skimage.transform.AffineTransform

cv.GetRotationMatrix2D(center, angle, scale, mapMatrix) 

, где центр является центром вращения в исходном изображении.

в skimage соответствующей трансформации, кажется, skimage.transform.AffineTransform:

skimage.transform.AffineTransform(matrix=None, scale=None, rotation=None, shear=None, translation=None) 

Но я не могу, как определить центр вращения .... Есть далеко, чтобы определить центр вращения в этом (или, может быть там это еще один метод skimage)

Я проверил в Интернете и инструкции, не находя ничего до сих пор ...

ответ

2

Это возможно в настоящее время путем объединения следующих преобразований:

  1. Сдвиг изображения так, что центр вокруг начала координат
  2. Поворот с N степенями
  3. сдвига изображения назад

Однако один параметр будет сделать это намного проще! Не могли бы вы написать вопрос о GitHub, чтобы мы могли это реализовать?

В то же время, код:

from skimage import data 
from skimage import transform 
import numpy as np 
import matplotlib.pyplot as plt 

image = data.chelsea() 

shift_y, shift_x = np.array(image.shape[:2])/2. 
tf_rotate = transform.SimilarityTransform(rotation=np.deg2rad(30)) 
tf_shift = transform.SimilarityTransform(translation=[-shift_x, -shift_y]) 
tf_shift_inv = transform.SimilarityTransform(translation=[shift_x, shift_y]) 

image_rotated = transform.warp(image, (tf_shift + (tf_rotate + tf_shift_inv)).inverse) 

plt.imshow(image_rotated) 
plt.show() 
+1

Я добавил здесь проблему: https://github.com/scikit-image/scikit-image/issues/1166 –

+1

Теперь это исправлено. См. Https://github.com/scikit-image/scikit-image/pull/1168 –

1

Изображение центра в ответ Стефана, кажется, не правильно, вот исправленный вариант своего кода

from skimage import transform 
import numpy as np 
import matplotlib.pyplot as plt 

image = np.zeros([21, 21]) 
image[10,:] = 1 
image[10,10] = 5 
image[7, 10] = 1 

shift_y, shift_x = (np.array(image.shape)-1)/2. 
tf_rotate = transform.SimilarityTransform(rotation=np.deg2rad(60)) 
tf_shift = transform.SimilarityTransform(translation=[-shift_x, -shift_y]) 
tf_shift_inv = transform.SimilarityTransform(translation=[shift_x, shift_y]) 
image_rotated = transform.warp(image, (tf_shift + (tf_rotate + tf_shift_inv)).inverse, order = 3) 


plt.subplot(121) 
plt.imshow(image) 
plt.subplot(122) 
plt.imshow(image_rotated) 
plt.show() 

print "original image maximum at: ", np.unravel_index(np.argmax(image), image.shape) 
print "rotated image maximum at : ", np.unravel_index(np.argmax(image_rotated), image_rotated.shape) 

оригинальный максимум изображения в: (10 , 10) Максимальное число оборотов при: (10, 10)