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

2024-06-01 04:59:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个三维的探地雷达数据。每个数组基本上都是一个时间推移二维图像的集合,其中时间沿第三维度增加。我想创建一个三维图,它与每个数组的二维图像相交。在

我基本上是想创造一个篱笆图。在这些网站上可以找到此类地块的一些示例: http://www.geogiga.com/images/products/seismapper_3d_seismic_color.gifhttp://www.usna.edu/Users/oceano/pguth/website/so461web/seismic_refl/fence.png

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


Tags: 数据图像功能http示例网站www时间
3条回答

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

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

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

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)

这将产生:

enter image description here

(请注意,我对旋转矩阵不是很仔细,您必须创建自己的投影。使用真实的旋转矩阵可能真的是个好主意。)

只需注意,围栏杆和围栏有一个小问题,即与面片数量相比,栅格多了一个顶点。在


如果你有高分辨率的图像,上面的方法不是很有效。它甚至可能对他们没有用。另一种可能是使用支持仿射图像变换的后端。不幸的是,您将不得不自己计算转换。这不是可怕的困难,但仍然有点笨拙,然后你没有得到一个真正的三维图像,可以旋转,等等

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

{eicv{eicv>可以使用OpenCV}函数来交替显示。如果使用透明颜色填充周围环境,则可以对图像进行分层以获得与示例图像类似的结果。在


为了让你知道plot_surface的可能性,我试着把Lena绕在一个半圆柱上:

^{pr2}$

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

enter image description here

使用matplotlib无法做到这一点。@DrV的答案是近似值。Matplotlib实际上并不显示原始图像的每个单独像素,而是显示一些重新缩放的图像。rstride和cstride允许您帮助指定如何缩放图像,但是,输出将不是精确的图像。在

相关问题 更多 >