【问题标题】:Python 3D isosurface from a set of 2D images来自一组 2D 图像的 Python 3D 等值面
【发布时间】:2015-09-27 09:35:04
【问题描述】:

我正在使用此代码:

z = np.asarray(image_list)
mydata = z[::1,::1]
fig = pl.figure(facecolor='w')

ax2 = fig.add_subplot(1,1,1,projection='3d')
x,y = np.mgrid[:mydata.shape[0],:mydata.shape[1]]
ax2.plot_surface(x,y,mydata,cmap=pl.cm.jet,rstride=1,cstride=1,linewidth=0.,antia liased=False)
ax2.set_title('3D')
ax2.set_zlim3d(0,200)
pl.show()

使用包含一组图像的列表绘制 3D 图像,但出现此错误:

Traceback (most recent call last):
ax2.plot_surface(x,y,mydata,cmap=pl.cm.jet,rstride=1,cstride=1,linewidth=0.,antialiased=False)

File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py", line 1553, in plot_surface 
X, Y, Z = np.broadcast_arrays(X, Y, Z)

File "/usr/lib/python2.7/dist-packages/numpy/lib/stride_tricks.py", line 100, in broadcast_arrays 
"incompatible dimensions on axis %r." % (axis,))

ValueError: shape mismatch: two or more arrays have incompatible dimensions on axis 2

谁能帮我解决这个错误或建议一些其他技术来从包含 2D 图像的图像列表创建 3D 图像?

【问题讨论】:

标签: python numpy 3d


【解决方案1】:

我不记得我在哪里找到了这个(这是另一个 StackOverflow 线程),但这是工作代码 - 你的代码看起来像我的示例 - 只需更改要加载的文件名:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pylab as pl
from PIL import Image
import numpy as np
import pylab

img = Image.open('natureWallpaper.jpg').convert('L')
z   = np.asarray(img)
#slice notation: "start:stop:step" - here it's referring to the z matrix's x and y dimensions, get the whole of each
mydata = z[::1,::1]
fig = pl.figure(facecolor='w')
# subplot(nrows, ncols, plotnumber)
ax1 = fig.add_subplot(1,2,1)
# im = ax1.imshow(mydata,interpolation='nearest',cmap=pl.cm.jet)
im = ax1.imshow(mydata,interpolation='none',cmap=pl.cm.jet)
ax1.set_title('2D')

ax2 = fig.add_subplot(1,2,2,projection='3d')
x,y = np.mgrid[:mydata.shape[0],:mydata.shape[1]] ax2.plot_surface(x,y,mydata,cmap=pl.cm.jet,rstride=10,cstride=10,linewidth=0.antialiased=False)
ax2.set_title('3D')
ax2.set_zlim3d(0,255)
pl.show()

【讨论】:

  • 一次只做一张图片。如果您想要一个图像列表,我想您总是可以将所有这些都放在一个函数中,然后为该函数提供一系列文件名或类似的东西。该图在大图像上有点慢,因此您需要一种在加载下一个之前获取输入的方法。
  • 看起来你的图片列表行真的很麻烦。
  • 问题是 pl.show() 是为了一次显示一个图像。可能有一种方法可以并排放置一些图像。如果我这个周末这样做,我会回到这里并把代码也放上去。
  • 啊,在这里查看底部评论:stackoverflow.com/questions/29620874/… ...显然,如果您在 for 循环内增加数字/在外部调用 pl.show(),您将为每个您加载的图像。
  • 这里是我获得原始代码的地方:stackoverflow.com/questions/15581935/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2020-04-27
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多