gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:56 25 4
gpt4 key购买 nike

我有两个探地雷达数据的 3-D 阵列。每个阵列基本上都是延时二维图像的集合,其中时间沿三维增加。我想创建一个 3-D 图,它与每个阵列的 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 轴结合使用?

最佳答案

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

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

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

请注意,栅栏杆和栅栏存在一个小问题,即与面片数量相比,网格多了一个顶点。


如果您有高分辨率图像,上述方法不是很有效。它甚至可能对他们没有用。那么另一种可能性是使用支持仿射图像变换的后端。不幸的是,您将不得不自己计算变换。这并不难,但仍然有点笨拙,然后你得不到可以旋转的真实 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)

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

enter image description here

关于python - 使用 imshow 或其他函数在 matplotlib 中创建相交图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25287861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com