UPDATE:трансформирующих и Ресэмплирование 3D объема с NumPy/SciPy
Я создал хорошо документирован IPython ноутбука. Если вы просто хотите код, посмотрите на первый ответ.
Вопрос
У меня объем 40x40x40 из полутоновых значений. Это необходимо повернуть/сдвинуть/сдвинуть.
Вот полезный набор однородных преобразований: http://www.lfd.uci.edu/~gohlke/code/transformations.py.html
мне нужно относиться к каждому вокселя в моем объеме, как пара (положение вектора, значение). Затем я бы преобразовал положение и проба новых значений для каждой координаты из набора преобразованных векторов.
Выборка кажется довольно сложным, и я был рад найти это: https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.ndimage.affine_transform.html#scipy.ndimage.affine_transform
The given matrix and offset are used to find for each point in the output the corresponding coordinates in the input by an affine transformation. The value of the input at those coordinates is determined by spline interpolation of the requested order. Points outside the boundaries of the input are filled according to the given mode.
Звуки идеально.
Но использование очень сложное. Here кто-то использует этот код для поворота изображения. Его матрица вращения 2x2, поэтому она не находится в однородных координатах. Я попытался пропускание матрицы перевода в однородных координатах (2D) к функции:
dim =10
arr=np.zeros((dim,dim))
arr[0,0]=1
mat=np.array([[1,0,1],[0,1,0],[0,0,1]])
out3=scipy.ndimage.affine_transform(arr,mat)
print("out3: ",out3)
который производит ошибку:
Traceback (most recent call last):
File "C:/Users/212590884/PycharmProjects/3DAugmentation/main.py", line 32, in <module>
out3=scipy.ndimage.affine_transform(arr,mat)
File "C:\Users\212590884\AppData\Local\Continuum\Anaconda2\lib\site-packages\scipy\ndimage\interpolation.py", line 417, in affine_transform
raise RuntimeError('affine matrix has wrong number of rows')
RuntimeError: affine matrix has wrong number of rows
Видимо, это не работает с однородными координатами. Как я могу использовать это для переноса данных?
И это было только в 2D, в 3D я не могу даже повернуть объем:
dim =10
arr=np.zeros((dim,dim,dim))
arr[0,0]=1
angle=10/180*np.pi
c=np.cos(angle)
s=np.sin(angle)
mat=np.array([[c,-s,0,0],[s,c,0,0],[0,0,1,0],[0,0,0,1]])
out3=scipy.ndimage.affine_transform(arr,mat)
print("out3: ",out3)
Сообщение об ошибке является тем же самым: affine matrix has wrong number of rows
Можно ли использовать этот метод для преобразования мой том?
я нашел коллекцию вспомогательных методов, они предлагают сдвиг и поворот, но не стричь: https://docs.scipy.org/doc/scipy-0.14.0/reference/ndimage.html
Но я предпочел бы использовать нестандартную матрицу преобразования.
Я думаю, что странное поведение связано с (r, c, z) соглашением, которое есть (y, x, z), поэтому соответствующий вектор для вращения по координатам x равен (0, 1, 0) – Ariel