Python、VTK和QTdesigner重建三维体

emmm好了现在又到了CSDN记录美好生活的时候了,不过写这个也是做一个记录吧,怕自己之后搞的时候忘了。。。

捣鼓了一天终于又有所小突破

在原有框架的基础上变成了显示CT重建后的人体段,环境还是老的环境。

CT图像总共是328张,大概重建时间2秒不到,感觉还是OK的Python、VTK和QTdesigner重建三维体_第1张图片

上个效果先~绿色代表健康顺便加上了一键清除的功能

Python、VTK和QTdesigner重建三维体_第2张图片

代码分段来吧有点长。。。

这边是按下打开按钮后子函数里的代码。。。我定义成

def on_open_action(self):

首先初始化一波要调用的函数我这边使用GPU来对CT影像进行重构反正就是听起来厉害一点

self.GPU_volumeMapper = vtk.vtkGPUVolumeRayCastMapper()
self.GPU_volumeProperty = vtk.vtkVolumeProperty()
self.GPU_compositeOpacity = vtk.vtkPiecewiseFunction()
self.GPU_gradientOpacity = vtk.vtkPiecewiseFunction()
self.GPU_color = vtk.vtkColorTransferFunction()
self.GPU_volume = vtk.vtkVolume()
self.GPU_render = vtk.vtkRenderer()

接着当然是打开序列图像喽,这边用的是QT自带打开目录的函数

self.path = QFileDialog.getExistingDirectory(self, '选择文件夹', 'C:/Users/QYC/Desktop/')
reader = vtk.vtkDICOMImageReader()  # 用于读取DICOM 图像,DICOM(*.dcm)产生输出数据。
reader.SetDirectoryName(self.path)
reader.Update()  # 这句一定要,不然没有体

接着这一波是对CT进行各种设置,透明度,光影等等,最后使用AddVolume()加入体

self.GPU_volumeMapper.SetInputData(reader.GetOutput())

self.GPU_volumeProperty.SetInterpolationTypeToLinear()
self.GPU_volumeProperty.ShadeOn(0)
self.GPU_volumeProperty.SetAmbient(0, 0.4)
self.GPU_volumeProperty.SetDiffuse(0, 0.6)
self.GPU_volumeProperty.SetSpecular(0, 0.2)

# 下面两段是添加透明度函数和对应分段函数(可以不要的)
self.GPU_compositeOpacity.AddPoint(100, 0.0)
self.GPU_compositeOpacity.AddPoint(140, 0.4)
self.GPU_compositeOpacity.AddPoint(180, 0.6)
self.GPU_volumeProperty.SetScalarOpacity(0, self.GPU_compositeOpacity)

self.GPU_gradientOpacity.AddPoint(10, 0.0)
self.GPU_gradientOpacity.AddPoint(90, 0.5)
self.GPU_gradientOpacity.AddPoint(100, 1.0)
self.GPU_volumeProperty.SetGradientOpacity(0, self.GPU_gradientOpacity)

self.GPU_color.AddRGBPoint(1, 0, 0, 1) # 设置显示的体颜色

self.GPU_volumeProperty.SetColor(0, self.GPU_color)
self.GPU_volume.SetMapper(self.GPU_volumeMapper)
self.GPU_volume.SetProperty(self.GPU_volumeProperty)

self.GPU_render.AddVolume(self.GPU_volume) #添加体数据
self.GPU_render.SetBackground(0, 1, 0) # 设置背景颜色(绿色代表健康)
self.GPU_render.ResetCamera()   # 这一句是为了每次打开体数据以后设置体中心为交互中心

self.qvtkWidget.GetRenderWindow().Render() # 添加Render
self.qvtkWidget.GetRenderWindow().AddRenderer(self.GPU_render) # 显示,一定要有这个

至此显示体数据就结束了

后面是脑子突然冒出个骚想法想搞的。就是删除这个题,后期可以加入隐藏功能

这边就把退出按钮设置成了关闭显示(删除体数据的按钮)

这边找了好多资料。。。难受的一批,最终勉强能用大佬请轻喷

定义了一个槽函数

def on_close_action(self):

# 第一步删除体数据,后面再载入一次,emmm虽然这么搞效率有点低

self.GPU_render.RemoveVolume(self.GPU_volume)  
self.qvtkWidget.GetRenderWindow().Render()
self.qvtkWidget.GetRenderWindow().AddRenderer(self.GPU_render)

下面是用了以后的效果:

Python、VTK和QTdesigner重建三维体_第3张图片

欢迎各路大佬指点

你可能感兴趣的:(Python、VTK和QTdesigner重建三维体)