使用imshow或其他函数在matplotlib中创建交叉图像

Bla*_*tle 3 python 3d matplotlib imshow

我有两个地面穿透雷达数据的三维阵列.每个阵列基本上是时间推移2-D图像的集合,其中时间沿着第三维度增加.我想创建一个三维图,它与每个阵列的二维图像相交.

我基本上是想创建一个栅栏图.在这些网站上可以找到这类情节的一些例子:http : //www.geogiga.com/images/products/seismapper_3d_seismic_color.gif http://www.usna.edu/Users/oceano/pguth/website/so461web/ seismic_refl/fence.png

我通常使用imshow单独显示二维图像进行分析.但是,我对imshow功能的研究表明它不适用于3D轴.这有什么办法吗?或者是否有另一个绘图功能可以复制imshow功能但可以与3D轴组合?

DrV*_*DrV 8

可能有更好的方法,但至少你可以制作一个平面网格并为其着色:

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)
Run Code Online (Sandbox Code Playgroud)

这会创建:

在此输入图像描述

(请注意,我对旋转矩阵不是很谨慎,你必须创建自己的投影.使用真正的旋转矩阵可能是个好主意.)

请注意,围栏杆和围栏存在轻微问题,即与补丁数量相比,网格有一个顶点.


如果你有高分辨率的图像,上面的方法效率不高.它们甚至可能对它们没用.然后另一种可能性是使用支持仿射图像变换的后端.不幸的是,您必须自己计算变换.这并不是很难,但仍然有点笨拙,然后你没有得到一个可以旋转的真实3D图像,等等.

有关此方法,请参阅http://matplotlib.org/examples/api/demo_affine_image.html

或者,您可以使用OpenCV及其cv2.warpAffine功能在显示图像之前扭曲图像imshow.如果您使用透明颜色填充周围环境,则可以对图像进行分层以获得看起来像您的示例iamge的结果.


为了让你了解它的可能性plot_surface,我试图围绕一个半圆筒扭曲Lena:

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)
Run Code Online (Sandbox Code Playgroud)

她确实弯曲,但图像上的所有操作都很慢:

在此输入图像描述


小智 2

如果您愿意考虑使用不同的绘图库(即不是 matplotlib),那么可能值得考虑 mayavi / tvtk (尽管学习曲线有点陡峭)。我见过的最接近你想要的是标量切平面 http://wiki.scipy.org/Cookbook/MayaVi/Examples

大部分文档位于: http: //docs.enthought.com/mayavi/mayavi/index.html