アップデート:
十分に文書化された ipython ノートブックを作成しました。コードだけが必要な場合は、最初の回答を見てください。
質問
40x40x40 のボリュームのグレースケール値があります。これは、回転/シフト/せん断する必要があります。
以下は同種変換の有用なコレクションです: http://www.lfd.uci.edu/~gohlke/code/transformations.py.html
ボリューム内のすべてのボクセルを (位置ベクトル、値) のペアのように扱う必要があります。次に、位置を変換し、変換されたベクトルのセットから各座標の新しい値をサンプリングします。
サンプリングはかなり難しいようで、これを見つけてうれしかったです :
指定された行列とオフセットを使用して、出力の各ポイントについて、アフィン変換によって入力の対応する座標を見つけます。これらの座標での入力の値は、要求された次数のスプライン補間によって決定されます。入力の境界外のポイントは、指定されたモードに従って塗りつぶされます。
いいね。
しかし、使い方は非常にトリッキーです。ここでは、誰かがそのコードを使用して画像を回転させています。彼の回転行列は 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
しかし、カスタム変換マトリックスを使用したいと思います。