emmm好了现在又到了记录美好生活的时候了,不过写这个也是做一个记录吧,怕自己之后搞的时候忘了。。。捣鼓了一天终于又有所小突破
在原有框架的基础上变成了显示CT重建后的人体段,环境还是老的环境。
CT图像总共是328张,大概重建时间2秒不到,感觉还是OK的
上个效果先~绿色代表健康
顺便加上了一键清除的功能
代码分段来吧有点长。。。
这边是按下打开按钮后子函数里的代码。。。我定义成
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)
下面是用了以后的效果:
欢迎各路大佬指点