首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用imshow或其他函数在matplotlib中创建相交图像

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

Stack Overflow用户
提问于 2014-08-13 13:44:10
回答 3查看 7K关注 0票数 5

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

我基本上是想创造一个围栏。在这些站点上可以找到此类地块的一些示例:color.gif refl/fence.png

我通常使用imshow单独显示二维图像进行分析.然而,我对imshow功能的研究表明,它不适用于3D轴。有办法绕过这件事吗?或者还有另一种绘图功能,它可以复制隐显功能,但可以与三维轴相结合?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-13 20:57:50

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

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

票数 2
EN

Stack Overflow用户

发布于 2014-08-13 20:13:23

也许有更好的方法,但至少你可以做一个平面网格并给它着色:

代码语言:javascript
复制
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)

这就产生了:

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

请注意,篱笆杆和栅栏有一个轻微的问题,即与补丁的数目相比,网格有多一个顶点。

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

有关此方法,请参见image.html

另外,您可以使用OpenCV及其cv2.warpAffine函数在用imshow显示图像之前扭曲图像。如果你用透明的颜色填充周围的环境,那么你就可以对图像进行分层,以得到一个像你的例子一样的结果。

为了让你了解plot_surface的可能性,我试着把莉娜绕在半圆柱上:

代码语言:javascript
复制
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)

她的确弯得很好,但对图像的所有操作都相当缓慢:

票数 15
EN

Stack Overflow用户

发布于 2019-10-10 05:51:50

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25287861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档