2016-11-10 8 views
3

가 UPDATE scipy NumPy와 /과 3 차원 볼륨을 리샘플링 :변형시키는 및

내가 만든 아니라 노트북 ipython 기록. 코드를 원한다면 첫 번째 대답을보십시오.

내가 그레이 스케일 값의 40x40x40 볼륨을 가지고

질문. 회전/시프 팅/셔링이 필요합니다.

여기서 균질 변환 유용한 컬렉션이다 http://www.lfd.uci.edu/~gohlke/code/transformations.py.html

I는 (위치 벡터 값)의 쌍 등 내 볼륨의 모든 복셀을 치료해야한다. 그러면 변환 된 벡터 집합에서 각 좌표의 위치와 새 값을 변환합니다.

샘플링

오히려 어려운 것, 그리고 나는이를 찾을 수 기뻤습니다 : 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이므로 동질적인 좌표가 아닙니다. I의 함수 동차 좌표 (2D)에서의 변환 행렬을 통과 시도 :

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 

분명히이 동차 좌표와 함께 작동하지 않는다 : 오류가 발생

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) 

한다. 이 방법을 사용하여 데이터를 이동시킬 수 있습니까? affine matrix has wrong number of rows

이 가능 변환하기 위해이 방법을 사용하려면 :

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) 

오류 메시지가 동일합니다

는 그리고 이것은 심지어 볼륨을 회전 할 수 없습니다 3D로, 단지 2D로했다 내 볼륨? https://docs.scipy.org/doc/scipy-0.14.0/reference/ndimage.html

하지만 사용자 정의 변환 행렬을 사용하는 것을 선호 :

나는 그들이 변화를 제공하고 회전하지만 전단하지, 헬퍼 메소드의 컬렉션을 발견했다. NumPy와 함께 map_coordinates

그 다음, 좌표의 meshgrid을 생성 바꿀/위치 벡터를 형성하도록 스택 할 수 있습니다 :

답변

2

가 나는 다른 옵션을 찾았습니다. 이 벡터들은 변환되어 다시 메쉬 그리드 좌표 형식으로 변환됩니다. 마지막으로 map_coordinates을 사용하면 샘플링 문제가 해결됩니다.

나는 이것이 일반적인 문제라고 생각하고 단계별로 모든 단계를 설명하는 ipython 노트북을 만들었습니다 : 아직 한 가지 문제가있다

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

: 좌표의 순서가 이상하다. 직관적 인 방식으로 meshgrid를 재정렬해야합니다. 내 코드의 버그 일 수 있습니다.

이 좌표 재 배열은 변환 축에 영향을줍니다. x 축 주위를 돌리려는 경우 해당 벡터는 (1,0,0)이 아니지만 (0,1,0) 실제로 이상합니다.

하지만 작동 원리는 분명합니다.

+0

이상한 행동은 (y, x, z) 인 (r, c, z) 규칙에 기인한다고 생각합니다. 따라서 x 좌표를 회전시키는 해당 벡터는 (0, 1, 0) – Ariel