5

地中レーダ データの 2 つの 3 次元配列があります。各配列は、基本的にタイムラプス 2D 画像のコレクションであり、時間が 3 次元に沿って増加します。各配列の 2 次元画像と交差する 3 次元プロットを作成したいと考えています。

私は本質的にフェンス プロットを作成しようとしています。このタイプのプロットのいくつかの例は、次のサイトにあり ます 。 seismic_refl/fence.png

通常は imshow を使用して、分析用に 2 次元画像を個別に表示します。ただし、 imshow の機能に関する私の調査では、3D 軸では機能しないことが示唆されています。これを回避する方法はありますか?または、imshow 機能を複製できるが、3D 軸と組み合わせることができる別のプロット関数はありますか?

4

3 に答える 3

14

もっと良い方法があるかもしれませんが、少なくともいつでも平面メッシュを作成して色を付けることができます:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

# create a 21 x 21 vertex mesh
xx, yy = np.meshgrid(np.linspace(0,1,21), np.linspace(0,1,21))

# create some dummy data (20 x 20) for the image
data = np.random.random((20, 20))

# create vertices for a rotated mesh (3D rotation matrix)
X = np.sqrt(1./3) * xx + np.sqrt(1./3) * yy
Y = -np.sqrt(1./3) * xx + np.sqrt(1./3) * yy
Z = np.sqrt(1./3) * xx - np.sqrt(1./3) * yy

# create the figure
fig = plt.figure()

# show the reference image
ax1 = fig.add_subplot(121)
ax1.imshow(data, cmap=plt.cm.BrBG, interpolation='nearest', origin='lower', extent=[0,1,0,1])

# show the 3D rotated projection
ax2 = fig.add_subplot(122, projection='3d')
ax2.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=plt.cm.BrBG(data), shade=False)

これにより、次が作成されます。

ここに画像の説明を入力

(回転行列にはあまり注意を払っていませんでした。独自の投影法を作成する必要があります。実際の回転行列を使用することをお勧めします。)

フェンス ポールとフェンスにはわずかな問題があることに注意してください。つまり、パッチの数に比べてグリッドの頂点が 1 つ多くなっています。


高解像度の画像がある場合、上記のアプローチはあまり効率的ではありません。彼らにとっては役に立たないかもしれません。次に、アフィン画像変換をサポートするバックエンドを使用する可能性があります。残念ながら、変換を自分で計算する必要があります。とてつもなく難しいわけではありませんが、それでも少しぎこちなく、回転などの実際の 3D 画像が得られません。

このアプローチについては、http://matplotlib.org/examples/api/demo_affine_image.htmlを参照してください。

または、OpenCV とそのcv2.warpAffine関数を使用して、画像を で表示する前にワープすることもできますimshow。周囲を透明色で塗りつぶすと、画像を重ねて、例の iamge のような結果を得ることができます。


の可能性を示すためにplot_surface、半円柱の周りにレナをワープさせてみました。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

# create a 513 x 513 vertex mesh
xx, yy = np.meshgrid(np.linspace(0,1,513), np.linspace(0,1,513))

# create vertices for a rotated mesh (3D rotation matrix)
theta = np.pi*xx
X = np.cos(theta)
Y = np.sin(theta)
Z = yy

# create the figure
fig = plt.figure()

# show the 3D rotated projection
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=plt.imread('/tmp/lena.jpg')/255., shade=False)

彼女は確かによく曲がりますが、画像に対するすべての操作は非常に遅いです。

ここに画像の説明を入力

于 2014-08-13T20:13:23.250 に答える
2

別のプロット ライブラリ (つまり、matplotlib ではない) の使用を喜んで検討する場合は、mayavi / tvtk を検討する価値があるかもしれません (学習曲線は少し急ですが)。あなたが望むものに最も近いのは、 http: //wiki.scipy.org/Cookbook/MayaVi/Examples のスカラー カット プレーンです。

ドキュメントの大部分は http://docs.enthought.com/mayavi/mayavi/index.htmlにあります。

于 2014-08-13T20:57:50.760 に答える