You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将生成的2D圆形图像转换为3D柱体对象?

将2D圆形图像转换为3D柱体对象

我已经编写了以下代码生成随机数据,并通过掩码将方形图像转为圆形图像:

import numpy as np
import matplotlib.pyplot as plt

xx, yy = np.meshgrid(np.linspace(0, 1, 32), np.linspace(0, 1, 32))
X = xx
Y = yy
Z = np.random.rand(32, 32)

##### MASK : SQUARE IMAGE => CIRCLE IMAGE ######
N = 32
m = (N-1)/2
mask = np.ones((N,N))
D = 80
a = D/N
for i in range(N):
    for j in range(N):
        if (i-m)**2+(j-m)**2 < (D/2/a)**2:
            mask[i][j] = 0
################################################

plt.imshow(np.ma.masked_array(Z, mask))
#plt.contourf(X, Y, np.ma.masked_array(Z, mask), zdir='z', offset=0.5, levels=100)
plt.show()

当前代码输出的2D圆形图像如下:
生成的2D圆形图像

我希望将这个2D圆形图像转换为3D柱体对象,也就是通过堆叠多个相同的圆形图像来形成柱体,效果类似以下示例:

  1. 示例1
  2. 示例2

实现方案

下面提供两种可行的实现方式,都能达成堆叠形成3D柱体的效果:

方法1:多层2D图像堆叠(模拟柱体)

直接在不同Z轴高度重复绘制带掩码的2D图像,快速实现柱体视觉效果:

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

# 生成基础数据和掩码
xx, yy = np.meshgrid(np.linspace(0, 1, 32), np.linspace(0, 1, 32))
X = xx
Y = yy
Z_data = np.random.rand(32, 32)

N = 32
m = (N-1)/2
mask = np.ones((N,N))
D = 80
a = D/N
for i in range(N):
    for j in range(N):
        if (i-m)**2+(j-m)**2 < (D/2/a)**2:
            mask[i][j] = 0
masked_Z = np.ma.masked_array(Z_data, mask)

# 创建3D绘图环境
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 定义柱体的高度层数
num_layers = 10
z_levels = np.linspace(0, 1, num_layers)

# 在每个Z高度绘制带掩码的图像
for z in z_levels:
    ax.contourf(X, Y, masked_Z, zdir='z', offset=z, levels=100, cmap='viridis')

# 设置坐标轴参数
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_zlim(0, 1)

plt.show()

方法2:构建3D数据体渲染柱体

将2D数据扩展为3D数组,通过体渲染实现更真实的3D柱体效果:

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

# 生成基础数据和掩码
xx, yy = np.meshgrid(np.linspace(0, 1, 32), np.linspace(0, 1, 32))
X = xx
Y = yy
Z_data = np.random.rand(32, 32)

N = 32
m = (N-1)/2
mask = np.ones((N,N))
D = 80
a = D/N
for i in range(N):
    for j in range(N):
        if (i-m)**2+(j-m)**2 < (D/2/a)**2:
            mask[i][j] = 0

# 将2D数据扩展为3D体数据
num_layers = 10
Z_3d = np.repeat(Z_data[np.newaxis, :, :], num_layers, axis=0)
mask_3d = np.repeat(mask[np.newaxis, :, :], num_layers, axis=0)
masked_3d = np.ma.masked_array(Z_3d, mask_3d)

# 创建3D绘图环境
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 生成3D网格坐标
x, y, z = np.meshgrid(np.linspace(0,1,32), np.linspace(0,1,32), np.linspace(0,1,num_layers))

# 绘制3D柱体
ax.voxels(x, y, z, ~mask_3d, facecolors=cm.viridis(Z_3d/Z_3d.max()), edgecolor='none')

# 设置坐标轴参数
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

plt.show()

内容的提问来源于stack exchange,提问作者DiamondProx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:17:48