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

如何在Open3D Python中查看3D图像切片及医学研究适用性咨询

在同一窗口查看STL网格的所有切片

要在同一窗口交互查看STL网格的所有切片,可通过Open3D的VisualizerWithKeyCallback实现按键切换切片的功能,步骤如下:

  1. 将STL网格转换为体素网格,便于按高度提取切片;
  2. 编写按键回调函数,实现切片的前后切换;
  3. 在可视化窗口中同时显示原始网格(可选)和当前切片。

示例代码:

import open3d as o3d
import numpy as np

# 读取并预处理STL网格
mesh = o3d.io.read_triangle_mesh("MyImage.stl")
mesh.compute_vertex_normals()

# 转换为体素网格(voxel_size需根据模型尺寸调整)
voxel_grid = o3d.geometry.VoxelGrid.create_from_triangle_mesh(mesh, voxel_size=1.0)

# 获取Z轴范围,生成所有切片高度
voxel_indices = np.array([v.grid_index for v in voxel_grid.get_voxels()])
z_min, z_max = voxel_indices[:, 2].min(), voxel_indices[:, 2].max()
slice_heights = list(range(z_min, z_max + 1))
current_idx = 0

# 创建带按键回调的可视化窗口
vis = o3d.visualization.VisualizerWithKeyCallback()
vis.create_window(window_name="STL切片查看", left=1000, top=2000, width=800, height=650)

# 初始化当前切片点云
current_slice = o3d.geometry.PointCloud()

def update_display():
    """更新当前切片的显示内容"""
    global current_slice
    vis.remove_geometry(current_slice, reset_bounding_box=False)
    # 提取当前高度的体素并转为点云
    target_z = slice_heights[current_idx]
    slice_voxels = [v for v in voxel_grid.get_voxels() if v.grid_index[2] == target_z]
    slice_points = np.array([voxel_grid.get_voxel_center_coordinate(v.grid_index) for v in slice_voxels])
    current_slice.points = o3d.utility.Vector3dVector(slice_points)
    current_slice.paint_uniform_color([1, 0, 0])  # 红色标记切片
    vis.add_geometry(current_slice, reset_bounding_box=False)
    vis.update_renderer()

# 注册按键回调:右箭头切下一切片,左箭头切上一切片
def next_slice(vis):
    global current_idx
    if current_idx < len(slice_heights) - 1:
        current_idx += 1
        update_display()
    return False

def prev_slice(vis):
    global current_idx
    if current_idx > 0:
        current_idx -= 1
        update_display()
    return False

vis.register_key_callback(262, next_slice)  # 右箭头键
vis.register_key_callback(263, prev_slice)  # 左箭头键

# 添加半透明原始网格作为参考(可选)
mesh.paint_uniform_color([0.5, 0.5, 0.5])
mesh.compute_vertex_normals()
vis.add_geometry(mesh)

# 初始化显示第一个切片
update_display()

vis.run()
vis.destroy_window()

注:若需查看X/Y轴方向的切片,只需修改提取体素的条件(如v.grid_index[0] == target_x)。

Open3D是否适用于医学图像研究

Open3D在医学图像研究中具有一定适用性,但需结合研究方向判断:

适用场景

  • 3D重建与网格生成:支持将CT/MRI体素数据、医学点云转换为结构化网格,提供泊松重建、贪婪投影三角化等算法,满足医学模型的网格生成需求。
  • 几何预处理:可对医学网格进行简化、平滑、法线计算、孔洞填充等操作,适配后续分析或3D打印需求。
  • 交互式可视化:支持医学3D模型的切片查看、自定义标注等交互,便于研究结果的展示与验证。

局限性

  • 缺乏原生医学格式支持:无法直接读取DICOM等医学专用格式,需借助pydicom等工具转换为点云/体素后再导入Open3D。
  • 医学专用算法不足:在医学图像分割、配准、病灶检测等领域,Open3D的功能不如ITK、SimpleITK等专业医学库完善。

总结

若研究核心是医学3D模型的网格生成、几何处理与可视化,Open3D是轻量高效的选择;若涉及大量医学图像的前期分割、配准等操作,建议结合专业医学库与Open3D配合使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:12:47