概述:
本文实现了 Python 版本 的 四视图,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 vtkreader = 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()#设置切片方向为XYimageviewer.SetSlice(imageviewer.GetSliceMin())#设置切片起始位置为切片最小值#imageviewer.SetSliceOrientationToXZ() #imageviewer.SetSliceOrientationToYZ() #print(imageviewer.GetSliceOrientation())#打印切片方向,XY为2,XZ为1,YZ为0imageviewer.Render()interactor.Start()
Using vtkResliceImageViewer or vtkImageViewer2 with Python3+PyQt5
import sysimport vtkfrom PyQt5 import QtCore, QtGuifrom 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_())