概述:

本文实现了 Python C++ 版本 的 四视图,MPR 和 三维重建;同时有C++ Qt版本

效果展示:

视频展示:

VTK四视图

vtkImageViewer2

一个方便易用的2D图像显示类,它封装了vtkRenderWindow, vtkRender, vtkImageActor和vtkImageMapToWinowLevelColors。同时,包含了一个vtkInteractorStyleImage的交互方式,使得显示和交互变得更加简单。

3D医学图像有很多,不仅只有CT,还有MRI,超声波,X-光等,各具有独特的诊断优势。下面以CT图像数据作为示例:

效果:

1. DICOM 数据读取

    reader = vtk.vtkDICOMImageReader()reader.SetDirectoryName("D:/datasource/fei/ScalarVolume_13")reader.Update()

2.设置imageViewer
可以设置slice,3维数据的方向,以及窗口大小、窗宽、窗位等等

    imageviewer = vtk.vtkImageViewer2()imageviewer.SetInputConnection(reader.GetOutputPort())interactor = vtk.vtkRenderWindowInteractor()imageviewer.SetupInteractor(interactor)  # 添加交互器# imageviewer.SetSize(400, 400)imageviewer.SetColorLevel(100)  # 窗位imageviewer.SetColorWindow(3000)  # 窗宽imageviewer.SetSliceOrientationToXY()  # 设置切片方向为XYimageviewer.SetSlice(imageviewer.GetSliceMin())  # 设置切片起始位置为切片最小值

all code; 可以设置 :横断面,冠状面,矢状面

import vtk
reader = vtk.vtkDICOMImageReader()
reader.SetDirectoryName("CT")
reader.Update()
imageviewer = vtk.vtkImageViewer2()
imageviewer.SetInputConnection(reader.GetOutputPort())
interactor = vtk.vtkRenderWindowInteractor()
imageviewer.SetupInteractor(interactor)#添加交互器
#imageviewer.SetSize(400, 400)
imageviewer.SetColorLevel(100)#窗位
imageviewer.SetColorWindow(3000)#窗宽
imageviewer.SetSliceOrientationToXY()#设置切片方向为XY
imageviewer.SetSlice(imageviewer.GetSliceMin())#设置切片起始位置为切片最小值
#imageviewer.SetSliceOrientationToXZ()
#imageviewer.SetSliceOrientationToYZ()
#print(imageviewer.GetSliceOrientation())#打印切片方向,XY为2,XZ为1,YZ为0
imageviewer.Render()
interactor.Start()

Using vtkResliceImageViewer or vtkImageViewer2 with Python3+PyQt5

import sys
import vtk
from PyQt5 import QtCore, QtGui
from PyQt5 import QtWidgetsfrom vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractorclass MainWindow(QtWidgets.QMainWindow):def __init__(self, parent = None):QtWidgets.QMainWindow.__init__(self, parent)self.frame = QtWidgets.QFrame()self.vl = QtWidgets.QVBoxLayout()self.vtkWidget = QVTKRenderWindowInteractor(self.frame)self.vl.addWidget(self.vtkWidget)pathDicomDir = "/path/to/dicom/data"reader = vtk.vtkDICOMImageReader()reader.SetDirectoryName(pathDicomDir)reader.Update()self.viewer = vtk.vtkImageViewer()# self.viewer = vtk.vtkImageViewer2()# self.viewer = vtk.vtkResliceImageViewer()self.viewer.SetInputData(reader.GetOutput())self.viewer.SetupInteractor(self.vtkWidget)self.viewer.SetRenderWindow(self.vtkWidget.GetRenderWindow())self.viewer.Render()self.frame.setLayout(self.vl)self.setCentralWidget(self.frame)self.show()if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)window = MainWindow()sys.exit(app.exec_())     

C++:

#include "vtkSmartPointer.h"
#include "vtkObjectFactory.h"
#include "vtkRenderWindow.h"
#include "vtkGenericRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkActor.h"#include "vtkDICOMImageReader.h"
#include "vtkImageViewer2.h"
#include "vtkInteractorStyleImage.h"class myVtkInteractorStyleImage : public vtkInteractorStyleImage
{
public:static myVtkInteractorStyleImage* New();vtkTypeMacro(myVtkInteractorStyleImage, vtkInteractorStyleImage);protected:vtkImageViewer2* ImageViewer;int Slice;int MinSlice;int MaxSlice;public:void SetImageViewer(vtkImageViewer2* imageViewer){this->ImageViewer = imageViewer;this->MinSlice = imageViewer->GetSliceMin();this->MaxSlice = imageViewer->GetSliceMax();this->Slice = (this->MinSlice + this->MaxSlice) / 2;this->ImageViewer->SetSlice(this->Slice);this->ImageViewer->Render();}protected:virtual void OnMouseWheelForward(){if (this->Slice < this->MaxSlice){this->Slice += 1;this->ImageViewer->SetSlice(this->Slice);this->ImageViewer->Render();}}virtual void OnMouseWheelBackward(){if (this->Slice > this->MinSlice){this->Slice -= 1;this->ImageViewer->SetSlice(this->Slice);this->ImageViewer->Render();}}
};vtkStandardNewMacro(myVtkInteractorStyleImage);int main(int argc, char* argv[])
{if (argc < 2){std::cout << "Usage: " << argv[0] << " DicomDirectory" << std::endl;return EXIT_FAILURE;}auto reader = vtkSmartPointer<vtkDICOMImageReader>::New();reader->SetDirectoryName(argv[1]);reader->Update();auto imageViewer = vtkSmartPointer<vtkImageViewer2>::New();imageViewer->SetInputConnection(reader->GetOutputPort());auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();imageViewer->SetupInteractor(interactor);imageViewer->SetSize(400, 400);imageViewer->SetColorLevel(500);imageViewer->SetColorWindow(1000);imageViewer->SetSliceOrientationToXY();imageViewer->GetRenderer()->SetBackground(1, 1, 1);auto myStyle = vtkSmartPointer<myVtkInteractorStyleImage>::New();myStyle->SetImageViewer(imageViewer);interactor->SetInteractorStyle(myStyle);imageViewer->Render();imageViewer->GetRenderer()->ResetCamera();imageViewer->Render();interactor->Start();return EXIT_SUCCESS;
}

三维重建 PyQt Python VTK 医学图像的可视化 vtkImageView2三视图(横断面,冠状面,矢状面)相关推荐

  1. 三维重建 医学图像的可视化 PyQt Python VTK 四视图(横断面,冠状面,矢状面,3D)

    本文实现了 Python C++ 版本 的 四视图,横断面,冠状面,矢状面,3D 主要功能: 1:可以通过进度条换层       2:鼠标双击放大/缩小窗口 3:按住鼠标中键拖动图像 4:鼠标右键滑动 ...

  2. Python+pyqt+dicom+vtk 使用pyinstaller打包软件时正常,运行报错vtkmodules.all、pydicom.encoders.pylibjpeg等错误

    ** Python+pyqt+dicom+vtk 使用pyinstaller打包软件时正常,运行时报vtkmodules.all.pydicom.encoders.pylibjpeg.No modul ...

  3. Python+vtk 实现激光点云数据可视化学习(2021.7.12)

    Python+VTK实现激光点云数据可视化学习 2021.7.12 1.激光点云与VTK简介 2.配置Python环境(Conda+PyCharm+Python3.6+VTK) 3.点云数据(大约60 ...

  4. C#开发PACS医学影像三维重建(一):使用VTK重建3D影像

    VTK简介: VTK是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的. 因为使用C#语言开发,而VTK是C++ ...

  5. python.freelycode.com-Python数据可视化2018:为什么这么多的库?

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 本文是三篇系列文章中的第一篇,描述了Python数据可视化工具的状态以及SciPy2018的发展趋势. 作 ...

  6. Python vtk学习(1)

    Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有 ...

  7. python vtk dicom_Python vtk读取并显示dicom文件示例

    因为做项目的原因,所以接触到了医学图像dicom文件.vtk刚开始看,这里仅仅只是其最简单的读取显示功能.此处用到了vtk库,可自行百度安装方法. 下面附上代码: from vtk import * ...

  8. python 科学计算三维可视化笔记(第三周 高级进阶)

    python 科学计算三维可视化笔记 第三周 高级进阶 python 科学计算三维可视化笔记 第三周 高级进阶 一.Mayavi 入门 1. Mayavi 库的基本元素 2. 快速绘制实例 3. Ma ...

  9. Python QtGUI与数据可视化编程(一)想写GUI程序?来试试Python Qt吧!

    ✅作者简介:大家好我是五维星空,目前是某国企的一名Java全栈程序员,热爱技术.喜欢代码,希望我的文章能给大家带来收获. ✅个人主页:五维星空的csdn博客 ✅系列专栏:Python QtGUI与可视 ...

最新文章

  1. 《Linux内核原理与分析》第二周作业
  2. 解决gcc报错:error: implicit declaration of function ‘inet_addr’ [-Werror=implicit-function-declaration]
  3. python中if错误-Python中常见的异常处理
  4. ssh(Spring+Spring mvc+hibernate)——IDeptService.java和IEmpService.java
  5. 剪映专业版 下载与安装介绍
  6. 实战干货:基于Redis6.0 部署迷你版本消息队列
  7. excel表格导入功能
  8. mysql not in性能分析_SQL 中的 in 与 not in、exists 与 not exists 的区别以及性能分析...
  9. 【SQL基础】SQL查询语句实例
  10. 中文简历表格提取,手写汉字识别(Python+OpenCV)
  11. 字符串拼接用逗号隔开的四种方法
  12. 单臂路由之一,单网口软路由实现主路由功能,光猫或交换机剩余网口实现上网功能
  13. unity3D---插件obi Rope---实现绳子效果
  14. 用ajax做级联操作,学习笔记之MVC级联及Ajax操作
  15. 网站判断是否是苹果系统和使用微信浏览器
  16. Js 显示 服务器 目录,js获得服务器目录
  17. 追求最优选择的后果,往往是事与愿违,往往是善良的愿望,把人类带入了人间地狱
  18. java gif转jpg_Java gif图片转换为jpg格式|chu
  19. 怎么添加附件链接到微信公众号推文
  20. 利用mysql上传木马_通过Mysql语句生成后门木马的方法_MySQL

热门文章

  1. Cocos2d-x常见面试题
  2. u盘无法linux,Linux 3.18U盘无法正确使用
  3. mysql数据库进阶书_mysql数据库进阶篇
  4. Pymc 包(贝叶斯模型 python工具):(1)安装版本提示
  5. 直播带货系统,带货直播系统中发布商品的逻辑处理流程
  6. 【​观察】得生态者得云天下 阿里、腾讯、浪潮、华为对决云计算2.0
  7. 软件测试培训出来真的很难找到工作嘛?
  8. == 和 equal
  9. FPGA错误集锦(二):Output pins are stuck at VCC or GND
  10. Jupyter Notebook使用过程中的七七八八