对于从事医学图像处理的小伙伴而言,医学图像三维重建并不是一个陌生的东西啦~ 例如,在对图像分割结果进行展示或者验证时,我们常常通过对分割结果进行三维可视化的方式进行展示和说明。
那废话不多说,今天就来教大家如何根据自己的分割结果进行三维重建。
这里呢,我用现在正在做的韧带分割进行说明。
首先,通过深度学习或者传统方法对医学图像进行分割,得到二值化的分割结果(如图1所示)。将分割结果放置在一个文件夹里。
图1 分割结果
这里要注意,
我们的分割结果的图片名称,需要按医学图像切片的顺序命名
,不然重建时会出现错乱!!!!
然后,读入数据。这里呢,我们使用的是vtk库。
reader = vtk.vtkPNGReader()
reader.SetDataScalarTypeToUnsignedChar()
reader.SetFileDimensionality(3)
path = r"./sag/" #读取 图像分割结果文件夹 路径
reader.SetFilePrefix(path) # 文件夹路径
reader.SetFilePattern("%s%d.png")
如果是JPG或JPEG格式的图片,可以使用vtk.vtkJPEGReader()函数进行替换。当然png对应的地方也不要忘记进行替换哦~
接下来,是一些参数的设置。这些参数将决定我们重建结果的正确性!!!
reader.SetDataExtent(3, 384, 3, 384, 1, 50) #384是图像大小, 倒数两个参数(1,50):重建的切片范围
这里,需要修改图像大小和重建范围。这里对重建范围进行一下说明,我这里的1,50也就是说,从我分割结果的第1张到第50张进行重建,小伙伴们可以根据自己的需求进行修改。
reader.SetDataSpacing(0.5625, 0.5625, 1.76) #前两个是 像素距离,最后一个是 层厚
这里需要修改的是像素距离和层厚,这个地方,小伙伴们根据自己的医学图像数据进行对应的修改就行。
之后呢,就是vtk三维重建的常规套路啦,建立actor、mapper等等,这里就不过多赘述啦~
这里给大家展示一下我重建的结果(如图2所示)。
图2 重建结果
最后附上代码,希望对各位小伙伴有所帮助鸭~
import vtk
reader = vtk.vtkPNGReader()
reader.SetDataScalarTypeToUnsignedChar()
reader.SetFileDimensionality(3)
path = r"./sag/" #读取文件路径
path2 = "./FX_sag_patella_lig.ply" #保存模型路径
reader.SetFilePrefix(path) # 文件夹路径
reader.SetFilePattern("%s%d.png")
reader.SetDataExtent(3, 384, 3, 384, 1, 50) #384是图像大小, 倒数两个参数(1,50):重建的切片范围
reader.SetDataSpacing(0.5625, 0.5625, 1.76) #前两个是 像素距离,最后一个是 层厚
reader.SetDataOrigin(0, 0, 0)
reader.Update()
skinExtractor = vtk.vtkContourFilter()
skinExtractor.SetInputConnection(reader.GetOutputPort())
skinExtractor.SetValue(0, 255)
skinExtractor.ComputeGradientsOn()
skinExtractor.ComputeScalarsOn()
smooth = vtk.vtkSmoothPolyDataFilter()
smooth.SetInputConnection(skinExtractor.GetOutputPort())
smooth.SetNumberOfIterations(300)
skinNormals = vtk.vtkPolyDataNormals()
skinNormals.SetInputConnection(smooth.GetOutputPort())
skinNormals.SetFeatureAngle(100)
skinNormals.Update()
skinMapper = vtk.vtkPolyDataMapper()
skinMapper.SetInputConnection(skinNormals.GetOutputPort())
skinMapper.ScalarVisibilityOff()
skin = vtk.vtkActor()
skin.SetMapper(skinMapper)
skin.SetOrigin(skin.GetCenter())
arender = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(arender)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
arender.AddActor(skin)
arender.ResetCamera()
arender.SetBackground(.2, .3, .4)
arender.ResetCameraClippingRange()
renWin.SetSize(500, 500)
style = vtk.vtkInteractorStyleTrackballCamera()
iren.SetInteractorStyle(style)
vtkWriter = vtk.vtkPLYWriter()
vtkWriter.SetInputData(skinNormals.GetOutput())
vtkWriter.SetFileName(path2)
vtkWriter.Write()
renWin.Render()
iren.Initialize()
iren.Start()
本代码适用于对CT、MRI等有序医学图像
进行
三维重建
,也可以用于其他针对有序
切片
进行
三维重建
的情况。使用
python
完成。
代码中附带了详细的使用流程,大家只需要按照自己的要求修改指定参数和路径即可。
本代码是使用基于CT、MRI等医学影像基于图像分割得到的二值结果
进行
重建
。因此,在
重建
前需要先对医学图像
进行
图像分割,分割出自己需要的部分,对分割结果
进行
二值化(背景为黑、分割出的部分为白色),这里要注意的是,分割结果需要按照原
切片
序列的顺序
进行
命名。
希望对大家有所帮助!如果大家感兴趣,也可以看看我的其他博客和资源哦~
序言,
VTK
介绍:
VTK
全称为 The Visualization Toolkit (可视化工具),是一个开源、跨平台、自由获取、支持并行计算的图形应用函数;拥有
3D
渲染的最新工具、提供
3D
交互模式以及2D绘图等。
VTK
包含一个C++类库,目前提供了众多语言接口,例如 Java、
Python
、TCL;在三维函数库OpenGL 的基础上采用面向对象设计方法发展起来
图形学基本概念和数据结构...
1.版本:matlab2021a,包含CT
切片
图像库,我录制了仿真操作录像,可以跟着操作出仿真结果
2.领域:
三维重建
3.内容:医学
切片
图片
三维重建
得到三维模型matlab仿真,从二维
切片
重建
为三维模型
4.适合人群:本硕博等教研学习使用
(2)用Niblack方法对灰度图
进行
局部动态阈值分割并
进行
展示为img1;
(3)对图像
进行
反色并
进行
展示为img2;
(4)对图像
进行
扩展并
进行
展示为img3;
(5)选择满足面积要求的目标输出(针对黑色背景白色目标的二值图)并
进行
展示为img4;
(6)输出最大连通图并
进行
展示为img5;
(7)对最大连通图
进行
细化并
进行
展示为img6;
(8)提取最大连通图的轮廓并
进行
展示为
# 读取超声图像数据
reader =
vtk
.
vtk
DICOMImageReader()
reader.SetDirectoryName("path/to/dicom/files")
reader.Update()
# 创建
vtk
ImageData数据
imageData =
vtk
.
vtk
ImageData()
imageData.SetDimensions(reader.GetOutput().GetDimensions())
imageData.AllocateScalars(
vtk
.
VTK
_UNSIGNED_SHORT, 1)
imageData.SetSpacing(reader.GetOutput().GetSpacing())
imageData.SetOrigin(reader.GetOutput().GetOrigin())
imageData.GetPointData().SetScalars(reader.GetOutput().GetPointData().GetScalars())
#
进行
等值面提取和渲染
contourFilter =
vtk
.
vtk
MarchingCubes()
contourFilter.SetInputData(imageData)
contourFilter.ComputeNormalsOn()
contourFilter.SetValue(0, 1000) # 设置等值面的值
mapper =
vtk
.
vtk
PolyDataMapper()
mapper.SetInputConnection(contourFilter.GetOutputPort())
actor =
vtk
.
vtk
Actor()
actor.SetMapper(mapper)
actor.GetProperty().SetColor(1.0, 1.0, 1.0) # 设置渲染颜色
# 创建渲染窗口和渲染器
renderer =
vtk
.
vtk
Renderer()
renderer.AddActor(actor)
renderer.SetBackground(0.0, 0.0, 0.0) # 设置背景颜色
renderWindow =
vtk
.
vtk
RenderWindow()
renderWindow.AddRenderer(renderer)
renderWindow.SetWindowName("Ultrasound
3D
Reconstruction")
# 创建交互器
interactor =
vtk
.
vtk
RenderWindowInteractor()
interactor.SetRenderWindow(renderWindow)
# 启动渲染器和交互器
renderWindow.Render()
interactor.Start()
当然,这只是基本示例,如果要
进行
更复杂的超声
图像处理
和可视化,还需要进一步了解和学习
VTK
中的其他类和方法。