三维重建 PyQt Python VTK 医学图像的可视化 vtkImageView2三视图(横断面,冠状面,矢状面)
概述:
本文实现了 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三视图(横断面,冠状面,矢状面)相关推荐
- 三维重建 医学图像的可视化 PyQt Python VTK 四视图(横断面,冠状面,矢状面,3D)
本文实现了 Python C++ 版本 的 四视图,横断面,冠状面,矢状面,3D 主要功能: 1:可以通过进度条换层 2:鼠标双击放大/缩小窗口 3:按住鼠标中键拖动图像 4:鼠标右键滑动 ...
- Python+pyqt+dicom+vtk 使用pyinstaller打包软件时正常,运行报错vtkmodules.all、pydicom.encoders.pylibjpeg等错误
** Python+pyqt+dicom+vtk 使用pyinstaller打包软件时正常,运行时报vtkmodules.all.pydicom.encoders.pylibjpeg.No modul ...
- Python+vtk 实现激光点云数据可视化学习(2021.7.12)
Python+VTK实现激光点云数据可视化学习 2021.7.12 1.激光点云与VTK简介 2.配置Python环境(Conda+PyCharm+Python3.6+VTK) 3.点云数据(大约60 ...
- C#开发PACS医学影像三维重建(一):使用VTK重建3D影像
VTK简介: VTK是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的. 因为使用C#语言开发,而VTK是C++ ...
- python.freelycode.com-Python数据可视化2018:为什么这么多的库?
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 本文是三篇系列文章中的第一篇,描述了Python数据可视化工具的状态以及SciPy2018的发展趋势. 作 ...
- Python vtk学习(1)
Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有 ...
- python vtk dicom_Python vtk读取并显示dicom文件示例
因为做项目的原因,所以接触到了医学图像dicom文件.vtk刚开始看,这里仅仅只是其最简单的读取显示功能.此处用到了vtk库,可自行百度安装方法. 下面附上代码: from vtk import * ...
- python 科学计算三维可视化笔记(第三周 高级进阶)
python 科学计算三维可视化笔记 第三周 高级进阶 python 科学计算三维可视化笔记 第三周 高级进阶 一.Mayavi 入门 1. Mayavi 库的基本元素 2. 快速绘制实例 3. Ma ...
- Python QtGUI与数据可视化编程(一)想写GUI程序?来试试Python Qt吧!
✅作者简介:大家好我是五维星空,目前是某国企的一名Java全栈程序员,热爱技术.喜欢代码,希望我的文章能给大家带来收获. ✅个人主页:五维星空的csdn博客 ✅系列专栏:Python QtGUI与可视 ...
最新文章
- 《Linux内核原理与分析》第二周作业
- 解决gcc报错:error: implicit declaration of function ‘inet_addr’ [-Werror=implicit-function-declaration]
- python中if错误-Python中常见的异常处理
- ssh(Spring+Spring mvc+hibernate)——IDeptService.java和IEmpService.java
- 剪映专业版 下载与安装介绍
- 实战干货:基于Redis6.0 部署迷你版本消息队列
- excel表格导入功能
- mysql not in性能分析_SQL 中的 in 与 not in、exists 与 not exists 的区别以及性能分析...
- 【SQL基础】SQL查询语句实例
- 中文简历表格提取,手写汉字识别(Python+OpenCV)
- 字符串拼接用逗号隔开的四种方法
- 单臂路由之一,单网口软路由实现主路由功能,光猫或交换机剩余网口实现上网功能
- unity3D---插件obi Rope---实现绳子效果
- 用ajax做级联操作,学习笔记之MVC级联及Ajax操作
- 网站判断是否是苹果系统和使用微信浏览器
- Js 显示 服务器 目录,js获得服务器目录
- 追求最优选择的后果,往往是事与愿违,往往是善良的愿望,把人类带入了人间地狱
- java gif转jpg_Java gif图片转换为jpg格式|chu
- 怎么添加附件链接到微信公众号推文
- 利用mysql上传木马_通过Mysql语句生成后门木马的方法_MySQL
热门文章
- Cocos2d-x常见面试题
- u盘无法linux,Linux 3.18U盘无法正确使用
- mysql数据库进阶书_mysql数据库进阶篇
- Pymc 包(贝叶斯模型 python工具):(1)安装版本提示
- 直播带货系统,带货直播系统中发布商品的逻辑处理流程
- 【​观察】得生态者得云天下 阿里、腾讯、浪潮、华为对决云计算2.0
- 软件测试培训出来真的很难找到工作嘛?
- == 和 equal
- FPGA错误集锦(二):Output pins are stuck at VCC or GND
- Jupyter Notebook使用过程中的七七八八