7

アップデート:

十分に文書化された 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

しかし、カスタム変換マトリックスを使用したいと思います。

4

1 に答える 1

4

別のオプションを見つけました: map_coordinates

numpy を使用すると、座標のメッシュグリッドを生成し、それらを再形成/スタックして位置ベクトルを形成することができます。これらのベクトルは変換され、meshgrid 座標形式に変換されます。最後にmap_coordinates、サンプリングの問題が解決されます。

これはよくある問題だと思います。すべてを段階的に説明する ipython ノートブックを作成しました。

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

まだ 1 つの問題があります。座標の順序が変です。直感的でない方法でメッシュグリッドを並べ替える必要があります。私のコードのバグかもしれません。

この座標の並べ替えは、変換の軸に影響を与えることに注意してください。x 軸を中心に何かを回転させたい場合、対応するベクトルは (1,0,0) ではなく (0,1,0) です。これは非常に奇妙です。

しかし、それは機能し、原則は明確だと思います。

于 2016-11-10T14:26:48.193 に答える