1. 将多张图像转化为vtkImageData
2. 使用体绘制算法,本文用的是vtkGPUVolumeRayCastMapper
3. vtkVolume
4. vtkRenderer
5. vtkRenderWindow
vtkVolumeProperty设置颜色与不透明度
SetColor
SetScalarOpacity
安装VTK
本文测试时VTK版本为9.2.5。若提示函数不存在的情况请检查本地版本对应函数是否废弃。
pip install vtk
Code
import vtk
# 定义图片读取接口
# 读取PNG图片就换成PNG_Reader = vtk.vtkPNGReader()
Jpg_Reader = vtk.vtkJPEGReader()
Jpg_Reader.SetNumberOfScalarComponents(1)
Jpg_Reader.SetFileDimensionality(3) # 说明图像是三维的
# 定义3D模型大小,图像大小尺寸为 208 x 240, 一共176张
# 定义范围从0开始
Jpg_Reader.SetDataExtent(0, 207, 0, 239, 0, 175)
# 设置图像的存放位置
Jpg_Reader.SetFilePrefix("./imgs/")
# 迭代文件中所有图像, 图像命名格式为: 000.jpg开始到175.jpg, 03d代表三位字符串, 不够三位则左侧补0
Jpg_Reader.SetFilePattern("%s%03d.jpg")
Jpg_Reader.Update()
# 二进制数据排序按小端(LittleEndian)规则
Jpg_Reader.SetDataByteOrderToLittleEndian()
# 图像处理结束
# 创建一个vtkRenderer对象,用于显示渲染结果
renderer = vtk.vtkRenderer()
# 创建一个vtkRenderWindow对象,用于显示vtkRenderer对象中的内容
render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)
# 创建一个vtkRenderWindowInteractor对象,用于处理交互事件
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(render_window)
# 3D高斯平滑 2023/03/24新增
smoother = vtkmodules.vtkImagingGeneral.vtkImageGaussianSmooth()
smoother.SetDimensionality(3)
smoother.SetStandardDeviation(2, 2, 2)
smoother.SetInputData(Jpg_Reader.GetOutput())
smoother.Update()
# 应用体绘制算法,生成三维模型
volume_mapper = vtk.vtkGPUVolumeRayCastMapper()
# Jpg_Reader.GetOutput()的输出为vtkImageData
volume_mapper.SetInputData(smoother.GetOutput())
# 定义颜色映射
color_transfer_function = vtk.vtkColorTransferFunction()
# 越接近黑色0越暗, 越接近白色255越亮
color_transfer_function.AddRGBPoint(0, 0.0, 0.0, 0.0)
color_transfer_function.AddRGBPoint(255, 1.0, 1.0, 1.0)
# 设置不透明度函数
opacity_transfer_function = vtk.vtkPiecewiseFunction()
# 把像素值低于15的设置为透明, 去除黑色0, 白色255则不透明
threshold = 15
opacity_transfer_function.AddPoint(threshold , 0.0)
opacity_transfer_function.AddPoint(255, 1.0)
# 设置vtkVolume参数
volume_property = vtk.vtkVolumeProperty()
volume_property.SetColor(color_transfer_function)
volume_property.SetScalarOpacity(opacity_transfer_function)
# 是否开启阴影
# volume_property.ShadeOn()
# 设置线性插值方式
volume_property.SetInterpolationTypeToLinear()
# 将vtkVolumeMapper、vtkVolumeProperty和vtkVolume组合在一起
volume = vtk.vtkVolume()
volume.SetMapper(volume_mapper)
volume.SetProperty(volume_property)
renderer.AddVolume(volume)
# 设置背景为白色
renderer.SetBackground(1.0, 1.0, 1.0)
# 显示渲染结果
render_window.Render()
interactor.Start()
Q&A
-
Q: 如何过滤VTK模型中的背景/黑色部分/空气部分?
A: 给vtkVolume的Property通过SetScalarOpacity函数设置opacity_transfer_function,给不需要显示的组织的对应像素设置透明度为0即可过滤对应组织。
体绘制数据使用vtkImageData储存,不过滤黑色像素就会像下图一样显示为一个长方体。
Reference
-
《VTK图形图像开发进阶》- 张晓东 罗火灵编著
更新记录
-
2023/03/24 新增3D高斯平滑处理,让模型边缘更为平滑
深度学习第一步——Pytorch-Gpu环境配置:Win11/Win10+Cuda10.2+cuDNN8.5.0+Pytorch1.8.0(步步巨细,少走十年弯路)
2023年3月3日
[Pandas] 数据合并 pd.merge
2023年3月11日
【python基础】python中常用字符串函数详解
2023年3月11日
openCV专栏(一):基础操作
2022年3月29日
Matplotlib剑客行——容纳百川的艺术家教程
2023年3月11日
Python – Gradio 快速开始
2023年3月29日
查看cudnn&cuda的版本以及对应的tensorflow版本
2023年8月16日
PySpark数据分析基础:PySpark Pandas创建、转换、查询、转置、排序操作详解
2023年3月5日
python三大开发框架django、 flask 和 fastapi 对比
2023年8月26日
[深度学习]Part2 K临近算法(KNN)Ch02——【DeepBlue学习笔记】
2022年6月15日
机器学习——主成分分析(PCA)
2022年5月24日
在centos上安装pycharm
2023年5月13日
pycharm连接docker解释器并且在本地使用matplotlib绘图方法
2022年4月6日
利用Python进行数据分析期末复习题
2023年4月25日
【最简单解决办法】:module ‘tensorflow.compat.v1‘ has no attribute ‘contrib‘
2023年4月22日
python代码写开心消消乐
2023年3月5日