肺部CT图像处理与重建
期末大作业占比:50分
任务描述:
给定肺部一组CT DICOM图像,提取肺部结构,重建其肺部三维模型。具体如下:
1:基于阈值或其他方法对肺部实质图像(a)进行分割
2:通过图像形态学去除粘连或填空洞等,得到类似(b)的肺实质
3:勾出肺部边界并计算面积(只针对某一幅图像)
4:肺部模型重建:通过对每一张CT切片进行分割,得到一组肺部结构图。将多张切片的分割结果存储在一个三维数组中,通过marching_cubes方法计算三维数据中的曲面并显示肺部的三维模型。
5:可选功能,可自行选择增加其他功能,如分割、可视化肺内气管等。
完成代码,进行演示(25分)演示代码、运行结果,从代码结构、算法、演示效果评分
撰写实验报告(25分),
1)说明算法、实现过程、结果与分析、总结(包括特色和遇到问题解决方法)
2)评分:报告上述内容充实,格式规范,图文并茂,分析清晰。
下面是个人操作演示结果,满分通过:
处理后的掩码图像:
软件演示: 下方有链接可以显示动态演示效果的视频
左侧显示每一张肺实质分割图像,也就是掩码图像,右侧是三维可交互的肺实质重建结果,可以任意方向旋转,立体的,按住CTRL键可以放大缩小。
下面是点击左侧的任意一张肺实质分割图像,然后会显示计算面积按钮,点击即可勾画出轮廓,并显示面积大小。
代码运行和动态演示效果:点击下方链接可查看
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
部分代码:
import vtk
# 定义渲染窗口、交互模式
aRender = vtk.vtkRenderer()
Renwin = vtk.vtkRenderWindow()
Renwin.AddRenderer(aRender)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(Renwin)
# 定义个图片读取接口
# 读取PNG图片就换成PNG_Reader = vtk.vtkPNGReader()
PNG_Reader = vtk.vtkPNGReader()
PNG_Reader.SetNumberOfScalarComponents(1)
PNG_Reader.SetFileDimensionality(2) # 说明图像是三维的
# 定义图像大小,本行表示图像大小为(512*512*240)
PNG_Reader.SetDataExtent(0, 511, 0, 511, 1, 89)
# 设置图像的存放位置
name_prefix = ['mask/mask_']
PNG_Reader.SetFilePrefix(name_prefix[0])
# 设置图像前缀名字
# 表示图像前缀为数字(如:0.jpg)
PNG_Reader.SetFilePattern("%s%d.png")
PNG_Reader.Update()
PNG_Reader.SetDataByteOrderToLittleEndian()
spacing = [1.0, 1.0, 2.5] # x, y 方向上的间距为 2 像素,z 方向上的间距为 2.5 像素
PNG_Reader.GetOutput().SetSpacing(spacing)
# 高斯平滑
gauss = vtk.vtkImageGaussianSmooth()
gauss.SetInputConnection(PNG_Reader.GetOutputPort())
gauss.SetStandardDeviations(1.0, 1.0, 1.0)
gauss.SetRadiusFactors(1.0, 1.0, 1.0)
gauss.Update()
# 创建等值面提取器
contour = vtk.vtkMarchingCubes()
gauss.GetOutput().SetSpacing(spacing)
contour.SetInputConnection(gauss.GetOutputPort())
contour.ComputeNormalsOn()
contour.SetValue(0, 100)
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(contour.GetOutputPort())
mapper.ScalarVisibilityOff()
actor = vtk.vtkActor()
actor.SetMapper(mapper)
# 创建渲染器,设置背景颜色
renderer = vtk.vtkRenderer()
renderer.SetBackground([1.0, 1.0, 1.0])
renderer.AddActor(actor)
window = vtk.vtkRenderWindow()
window.SetSize(512, 512)
window.AddRenderer(renderer)
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(window)
下面是包含所有文件的压缩包:
- 文件全部代码
- 原始数据文件
- 满分实验报告
需要的可以在评论区点击下载