6

我有一系列基本的 2D 图像(现在为简单起见 3 个),它们彼此相关,类似于电影中的帧:

在 python 中,我如何将这些切片堆叠在一起,如 image1->image2->image-3?我正在使用 pylab 来显示这些图像。理想情况下,堆叠框架的等距视图会很好,或者是允许我在代码/渲染图像中旋转视图的工具。

任何帮助表示赞赏。显示的代码和图像:

from PIL import Image
import pylab
  
fileName = "image1.png"
im = Image.open(fileName)
pylab.axis('off')
pylab.imshow(im)
pylab.show()

Image1.png 这里 Image2.png 在这里 Image3.png 在这里

4

3 回答 3

10

你不能用 imshow 做到这一点,但你可以用contourf,如果这对你有用。不过,这有点杂乱无章:

在此处输入图像描述

from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.gca(projection='3d')

x = np.linspace(0, 1, 100)
X, Y = np.meshgrid(x, x)
Z = np.sin(X)*np.sin(Y)

levels = np.linspace(-1, 1, 40)

ax.contourf(X, Y, .1*np.sin(3*X)*np.sin(5*Y), zdir='z', levels=.1*levels)
ax.contourf(X, Y, 3+.1*np.sin(5*X)*np.sin(8*Y), zdir='z', levels=3+.1*levels)
ax.contourf(X, Y, 7+.1*np.sin(7*X)*np.sin(3*Y), zdir='z', levels=7+.1*levels)

ax.legend()
ax.set_xlim3d(0, 1)
ax.set_ylim3d(0, 1)
ax.set_zlim3d(0, 10)

plt.show()

在 3D 中实现的文档在这里

正如 ali_m 建议的那样,如果这对您不起作用,如果您能想象到,您可以使用 VTk/MayaVi 来实现。

于 2013-03-23T04:40:53.103 回答
4

据我所知,matplotlib 没有 3D 等效项imshow可以让您将 2D 数组绘制为 3D 轴内的平面。但是,mayavi似乎具有您正在寻找的功能

于 2013-03-23T01:42:42.823 回答
4

这是使用 matplotlib 和剪切变换完成的一种完全愚蠢的方法(您可能需要更多地调整变换矩阵,以便堆叠的图像看起来正确):

import numpy as np
import matplotlib.pyplot as plt

from scipy.ndimage.interpolation import affine_transform


nimages = 4
img_height, img_width = 512, 512
bg_val = -1 # Some flag value indicating the background.

# Random test images.
rs = np.random.RandomState(123)
img = rs.randn(img_height, img_width)*0.1
images = [img+(i+1) for i in range(nimages)]

stacked_height = 2*img_height
stacked_width  = img_width + (nimages-1)*img_width/2
stacked = np.full((stacked_height, stacked_width), bg_val)

# Affine transform matrix.
T = np.array([[1,-1],
              [0, 1]])

for i in range(nimages):
    # The first image will be right most and on the "bottom" of the stack.
    o = (nimages-i-1) * img_width/2
    out = affine_transform(images[i], T, offset=[o,-o],
                           output_shape=stacked.shape, cval=bg_val)
    stacked[out != bg_val] = out[out != bg_val]

plt.imshow(stacked, cmap=plt.cm.viridis)
plt.show()

剪切变换堆栈

于 2018-02-19T17:11:33.063 回答