基于VTK的CPR曲面重建

2023-11-03 13:40
文章标签 重建 曲面 vtk cpr

本文主要是介绍基于VTK的CPR曲面重建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、问题

        在医学成像中,管状结构(如:血管、支气管和结肠)的评估是一个备受关注的课题。CT和MRI提供了人体的三维容积数据集,其中包含这些感兴趣的对象。然而,从CT和MRI获得的数据包含许多不感兴趣的部份,使得无预处理的体绘制(VR、MIP、MinIP、SSD)通常不可能或不准确。此外,感兴趣的对象很难完全位于一个平面内。

        一种可视化小直径结构的常用方法是根据从中心线检测过程中获得的高级信息重新采样并可视化数据集,这个过程被称为CPR(Curved Planar Reformation)曲面重建。通过这种技术,管状结构的整个长度显示在一幅图像中,便于医生对血管异常(如:狭窄、闭塞、动脉瘤和血管壁钙化)进行观察。

        CPR本质上是一种曲面的多平面重建技术MPR(Multi-Planar Reformation / Reconstruction),是常用的后处理技术。MPR将在某个平面(通常是轴位)获取的成像模式中的数据转换到另一个平面。

        下面的 Python 代码在CT序列数据上,输入自定义的折线点坐标,采用插值算法拟合成一条曲线,沿曲线生成曲面。

二、代码

# CPR曲面重建import vtk;# 由曲线生成曲面
def SweepLine(line, direction, distance, cols):rows = line.GetNumberOfPoints();    #待生成的surface的行数为曲线上点的个数spacing = distance / cols;          #列方向上的spacingsurface = vtk.vtkPolyData();# 生成点cols += 1;numberOfPoints = rows * cols;             #surface内点的个数numberOfPolys = (rows - 1) * (cols - 1);  #单元个数points = vtk.vtkPoints();points.Allocate(numberOfPoints);polys = vtk.vtkCellArray();polys.Allocate(numberOfPolys * 4);#生成每行每列的点坐标,x = [0.0, 0.0, 0.0];cnt = 0;for row in range(rows):for col in range(cols):p = [0.0, 0.0, 0.0];line.GetPoint(row, p);x[0] = p[0] + direction[0] * col * spacing;x[1] = p[1] + direction[1] * col * spacing;x[2] = p[2] + direction[2] * col * spacing;points.InsertPoint(cnt, x);cnt += 1;# 生成四边形pts = [0, 0, 0, 0];for row in range(rows-1):for col in range(cols-1):pts[0] = col + row * cols;pts[1] = pts[0] + 1;pts[2] = pts[0] + cols + 1;pts[3] = pts[0] + cols;polys.InsertNextCell(4, pts);   #每临近的四个点构成一个单元surface.SetPoints(points);surface.SetPolys(polys);return surface;if __name__ == '__main__':inputImage = 'E://data//01//CT1.25mm';# 读取CT序列imageReader = vtk.vtkDICOMImageReader();imageReader.SetDataByteOrderToLittleEndian();imageReader.SetDirectoryName(inputImage);imageReader.Update();resolution = 100;extent = [255, 255];thickness = 1.0;spacing = [1.0, 1.0];# 输入自定义折线顶点坐标points = vtk.vtkPoints()# (a, b, c, d)其中a表示点的序号,(b,c,d)表示点的三维坐标points.InsertPoint(0, 1.0, 0.0, 0.0)points.InsertPoint(1, 200, 100, 0.0)points.InsertPoint(2, 100, 200, 0.0)points.InsertPoint(3, 200, 300, 0.0)# 将点插值拟合成一条曲线spline = vtk.vtkParametricSpline()spline.SetPoints(points)splineFilter = vtk.vtkParametricFunctionSource()splineFilter.SetParametricFunction(spline)splineFilter.Update()# 由曲线生成曲面direction = [0.0, 0.0, 1.0];distance = 160;surface = SweepLine(splineFilter.GetOutput(), direction, distance, resolution);sampleVolume = vtk.vtkProbeFilter();sampleVolume.SetInputConnection(1, imageReader.GetOutputPort());sampleVolume.SetInputData(0, surface);# 根据数据源的数据范围设置映射表的窗宽窗位wlLut = vtk.vtkWindowLevelLookupTable();range = imageReader.GetOutput().GetScalarRange()[1] - imageReader.GetOutput().GetScalarRange()[0];level = (imageReader.GetOutput().GetScalarRange()[1] + imageReader.GetOutput().GetScalarRange()[0]) / 2.0;wlLut.SetWindow(range);wlLut.SetLevel(level);# 创建映射器和角色mapper = vtk.vtkDataSetMapper();mapper.SetInputConnection(sampleVolume.GetOutputPort());mapper.SetLookupTable(wlLut);mapper.SetScalarRange(0, 255);actor = vtk.vtkActor();actor.SetMapper(mapper);# 创建渲染器、渲染窗口和交互ren = vtk.vtkRenderer();renwin = vtk.vtkRenderWindow();renwin.AddRenderer(ren);renwin.SetWindowName("CurvedReformation");iren = vtk.vtkRenderWindowInteractor();iren.SetRenderWindow(renwin);# 将角色添加到场景ren.AddActor(actor);colors = vtk.vtkNamedColors();ren.SetBackground(colors.GetColor3d("DarkSlateGray"));# 设置相机以查看图像ren.GetActiveCamera().SetViewUp(0, 0, 1);ren.GetActiveCamera().SetPosition(0, 0, 0);ren.GetActiveCamera().SetFocalPoint(1, 0, 0);ren.ResetCamera();# 渲染和交互renwin.Render();iren.Start();

三、结果

这篇关于基于VTK的CPR曲面重建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/338557

相关文章

初步了解VTK装配体

VTK还不太了解,根据资料, vtk.vtkAssembly 是 VTK库中的一个重要类,允许通过将多个vtkActor对象组合在一起来创建复杂的3D模型。 import vtkimport mathfrom vtk.util.colors import *filenames = ["cylinder.stl","sphere.stl","torus.stl"]dt = 1.0renW

005:VTK世界坐标系中的相机和物体

VTK医学图像处理---世界坐标系中的相机和物体 左侧是成像结果                                                    右侧是世界坐标系中的相机与被观察物体 目录 VTK医学图像处理---世界坐标系中的相机和物体 简介 1 在三维空间中添加坐标系 2 世界坐标系中的相机 3 世界坐标系中vtkImageData的参数 总结:

Python(TensorFlow和PyTorch)两种显微镜成像重建算法模型(显微镜学)

🎯要点 🎯受激发射损耗显微镜算法模型:🖊恢复嘈杂二维和三维图像 | 🖊模型架构:恢复上下文信息和超分辨率图像 | 🖊使用嘈杂和高信噪比的图像训练模型 | 🖊准备半合成训练集 | 🖊优化沙邦尼尔损失和边缘损失 | 🖊使用峰值信噪比、归一化均方误差和多尺度结构相似性指数量化结果 | 🎯训练荧光显微镜模型和对抗网络图形转换模型 🍪语言内容分比 🍇Python图像归一化

004: VTK读入数据---vtkImageData详细说明

VTK医学图像处理---vtkImageData类 目录 VTK医学图像处理---vtkImageData类 简介: 1 Mricro软件的安装和使用 (1) Mricro安装 (2) Mricro转换DICOM为裸数据  2 从硬盘读取数据到vtkImageData 3 vtkImageData转RGB或RGBA格式 4 练习 总结 简介:         对于医

JD 1385:重建二叉树

OJ题目:click here~~ 题目分析:给前序遍历序列和中序遍历序列,重构二叉树并输出后序遍历序列 剑指offer 面试题6 AC_CODE int pre[1008] , in[1008] ;struct Node{int x ;Node *left ;Node *right ;};bool buildsubtree(Node*& root , int* spre , in

Activity转屏重建之 Activity.onConfigurationChanged

偶尔也会遇到由于转屏引起的一些问题。 有些时候,并不希望由于转屏使得Activity取重建。 再如键盘消失后的重建。 下面以一个demo为例子,小小总结一下用法。 如果想在转屏后,屏幕上立马打印出当前处于什么横竖屏状态 1.都知道有个属性android:configChanges可以用来定义什么情况下可以使得Activity不会restart。 android:configC

Activity生命周期 与 重建

每一个Android应用程序在运行时,对于底层的Linux Kernel而言都是一个单独的进程,但是对于Android系统而言,因为局限于手机画面的大小与使用的考虑,不能把每一个运行中的应用程序窗口都显示出来。   所以通常手机系统的界面一次仅显示一个应用程序窗口,Android使用了Activity的概念来表示界面。   运行中的应用程序分为五大类,分别是:     前景模式

【conda】导出和重建 Conda 环境

目录 1. 导出 Conda 环境1.1 激活环境1.2 导出环境配置1.3 检查和编辑环境配置文件(可选)1.4 共享或重建环境 2. 常见问题及解决方案2.1 导出环境时出现 “PackagesNotFoundError”2.2 导出的 `environment.yml` 文件在其他系统上无法使用2.3 导出的环境文件过大2.4 如何处理 Conda 环境中的 pip 包2.5 在导出或

001:VTK的学习资料与方法

VTK 医学图像处理---VTK学习资料 简介:       本节主要介绍学习VTK的一些资料和学习方法,仅供参考,可以根据自己的实际情况来调整。学习资料主要以VTK官网提供的资料为主,不管对于入门还是深入研究都足够了;但为了让入手VTK的难度更低一点,所以在有了本系列博文。 VTK 医学图像处理---VTK学习资料 简介: 1 官网免费电子书(好像有中文翻译版,建议看原版)

nurbs曲面和贝塞尔曲面的区别是什么

NURBS曲面和贝塞尔曲面的主要区别如下:   定义与理论基础:   NURBS曲面:全称非均匀有理B样条曲面,是NURBS曲线在二维空间上的扩展。它结合了非均匀性、有理性和B样条的特性,能够更灵活地表示复杂曲面。 贝塞尔曲面:通过Bernstein基函数的张量积为加权系数对控制顶点进行线性组合所构造的参数曲面。它具有良好的连续性和插值性质。   控制点的灵活性与局部性:   N