医疗图像三维重建方法小结(python+VTK+ITK+Mayavi)

环境简介

语言是python,主要介绍可能用到的库

  • Scipy
  • ITK
  • VTK
  • Mayavi
  • TVTK
  • Matplotlib

方法

在尝试重建三维模型的过程中,查询了不同版本的方法,在这里记录一下。

方法一 Poly3DCollection+matplotlib

使用mpl_toolkits 的Poly3DCollection,其中使用的是marching_cubes算法。
使用matplotlib进行显示。

import numpy as np
import pandas as pd
import os
import scipy.ndimage
import matplotlib.pyplot as plt
from skimage import measure, morphology
from mpl_toolkits.mplot3d.art3d import Poly3DCollection

def plot_3d(image, threshold=-300):
    
    # Position the scan upright, 
    # so the head of the patient would be at the top facing the camera
    p = image.transpose(2,1,0)
    p = p[:,:,::-1]
    
    verts, faces = measure.marching_cubes(p, threshold)

    fig = plt.figure(figsize=(10, 10))
    ax = fig.add_subplot(111, projection='3d')

    # Fancy indexing: `verts[faces]` to generate a collection of triangles
    mesh = Poly3DCollection(verts[faces], alpha=0.1)
    face_color = [0.5, 0.5, 1]
    mesh.set_facecolor(face_color)
    ax.add_collection3d(mesh)

    ax.set_xlabel("x-axis")
    ax.set_ylabel("y-axis")
    ax.set_zlabel("z-axis")

    ax.set_xlim(0, p.shape[0])  # a = 6 (times two for 2nd ellipsoid)
    ax.set_ylim(0, p.shape[1])  # b = 10
    ax.set_zlim(0, p.shape[2])  # c = 16

    plt.show()

优点:轻量化可以嵌入ipython里
缺点:

  • 不能旋转视图观察,可以使用poltly进行交互式显示。
  • 显示效果差,smooth的效果差。可以自己造轮子对源数据进行插值。然而插值始终不是基于Isosurface的,所以显示效果不会太好。

方法二 VTK+ITK

自己造轮子,基于VTK进行重建显示。

import vtk


def main():
    colors = vtk.vtkNamedColors()

    fileName = get_program_parameters()

    colors.SetColor("SkinColor", [255, 125, 64, 255])
    colors.SetColor("BkgColor", [51, 77, 102, 255])

    # Create the renderer, the render window, and the interactor. The renderer
    # draws into the render window, the interactor enables mouse- and
    # keyboard-based interaction with the data within the render window.
    #
    aRenderer = vtk.vtkRenderer()
    renWin = vtk
  • 13
    点赞
  • 177
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
CT 断层图像三维重建是指通过医学诊断仪获取连续的二维切面图像,然后将这 些二维图像之间的位置和灰度信息输入计算机,在计算机上进行相应的组合和处理, 最后在显示器上再现人体该器官的立体影像并描绘出器官的三维图像信息。 CT 断层图像三维重建能为医生显示具有真实感的三维图形,便于他们从多角度、 多层次进行观察和分析。本文具体研究了医学图像三维重建所涉及的关键技术之一— —插值技术,提出了适合于 CT 断层图像重建的轮廓形状插值算法,同时通过将该算 法应用到 CT 断层图像三维重建系统中验证其合理性与有效性。 断层图像插值是三维重建过程中的一个必要环节。本文对传统的插值方法进行了 归类,分为灰度插值、形状插值和小波插值三种,通过对这些方法中常用算法的分析 和比较,在实验的基础上讨论了各种算法的优缺点及适用范围,提出了一种基于轮廓 形状的 CT 断层图像插值算法。 本文将 CT 断层图像三维重建系统划分为数据获取模块、数据预处理模块、图 像插值模块、绘制模块和显示模块,并使用相关技术实现了各模块的功能。在详细叙 述插值模块的设计与实现的基础上,将基于轮廓形状的插值算法和其它一些插值算法 应用于系统中进行比较。实验结果表明基于轮廓形状的插值算法能够比较好地保持图 像的边缘轮廓,有效地解决了梯田效应问题,为医学教学以及临床诊断治疗提供了比 较好的辅助。 论文最后对所作的工作进行了总结,并展望了下一步的研究工作。 关键词:CT 断层图像三维重建,插值技术,轮廓形状
要使用PythonVTK实现CT医学影像DICOM文件的体绘制和面绘制三维重建,你可以参考以下源码: ``` python import vtk # 创建一个渲染窗口并设置交互方式 renWin = vtk.vtkRenderWindow() iren = vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) # 读取DICOM文件 reader = vtk.vtkDICOMImageReader() reader.SetDirectoryName("path/to/dicom/files") reader.Update() # 创建体绘制的体素数据集 volumeMapper = vtk.vtkFixedPointVolumeRayCastMapper() volumeMapper.SetInputConnection(reader.GetOutputPort()) # 设置体绘制的颜色和透明度传输函数 volumeProperty = vtk.vtkVolumeProperty() volumeProperty.ShadeOn() volumeProperty.SetColor(vtk.vtkColorTransferFunction()) volumeProperty.SetScalarOpacity(vtk.vtkPiecewiseFunction()) # 创建体绘制的可视化对象 volume = vtk.vtkVolume() volume.SetMapper(volumeMapper) volume.SetProperty(volumeProperty) # 创建面绘制的等值面数据集 contourFilter = vtk.vtkMarchingCubes() contourFilter.SetInputConnection(reader.GetOutputPort()) contourFilter.SetValue(0, thresholdValue) # 设置阈值,提取等值面 # 创建面绘制的Mapper和Actor contourMapper = vtk.vtkPolyDataMapper() contourMapper.SetInputConnection(contourFilter.GetOutputPort()) contourActor = vtk.vtkActor() contourActor.SetMapper(contourMapper) # 创建渲染器和渲染窗口 renderer = vtk.vtkRenderer() renWin.AddRenderer(renderer) renderer.AddActor(volume) renderer.AddActor(contourActor) renderer.SetBackground(0, 0, 0) # 设置背景颜色为黑色 # 设置相机视角 camera = renderer.GetActiveCamera() camera.SetPosition(0, 0, -1) # 设置相机位置 camera.SetFocalPoint(0, 0, 0) # 设置焦点 camera.SetViewUp(0, -1, 0) # 设置视角 # 激活渲染器和交互操作 renderer.ResetCamera() renWin.Render() iren.Start() ``` 请注意,上述代码只提供了一个基本的框架,实际使用时需要根据具体需求进行调整。同时,你需要将代码中的"path/to/dicom/files"替换为实际的DICOM文件路径,并根据需要设置体绘制和面绘制的参数。 希望以上内容对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值