2016-11-10 3 views
3

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

Но я предпочел бы использовать нестандартную матрицу преобразования.

ответ

2

Я нашел другой вариант: map_coordinates

С NumPy это можно сгенерировать meshgrid координат, а затем изменить форму/складывают их для формирования векторов позиции. Эти векторы преобразуются и преобразуются обратно в формат координат мешграда. Наконец, с проблемой map_coordinates проблема выборки решена.

Я думаю, что это общая проблема, и создали IPython ноутбук, который объясняет все шаг за шагом:

http://nbviewer.jupyter.org/gist/lhk/f05ee20b5a826e4c8b9bb3e528348688

Существует еще одна проблема: порядок координат странно. Вам нужно переупорядочить meshgrids неинтуитивным способом. Может быть ошибкой в ​​моем коде.

Помните, что это переупорядочение координат влияет на оси преобразований. Если вы хотите повернуть что-то вокруг оси x, соответствующий вектор не равен (1,0,0), но (0,1,0), это действительно странно.

Но это работает, и я думаю, что принцип ясен.

+0

Я думаю, что странное поведение связано с (r, c, z) соглашением, которое есть (y, x, z), поэтому соответствующий вектор для вращения по координатам x равен (0, 1, 0) – Ariel

Смежные вопросы