使用 VTK 将 mask 提取成 mesh

1. 前言

网上使用 VTK 将 Mask 数据生成 Mesh 的方法介绍有很多,但是直接简单的代码的反倒不多。
因此,写一个简单的 Python 片段,批量讲 mask 生成 mesh, 并保存起来。

2. 代码实现的功能

代码片段实现的功能:

  • 文件夹中查找特定后缀的文件
  • 将 mask 生成 mesh, 并保存下来

3. 代码如下

import os
import time
import vtk


def find_files_with_suffix(target_dir, target_suffix="txt"):
   """ 查找以 target_suffix 为后缀的文件,并返回 """
   find_res = []
   target_suffix_dot = "." + target_suffix
   walk_generator = os.walk(target_dir)
   for root_path, dirs, files in walk_generator:
       if len(files) < 1:
           continue
       for file in files:
           file_name, suffix_name = os.path.splitext(file)
           if suffix_name == target_suffix_dot:
               find_res.append(os.path.join(root_path, file))
   return find_res


def convert_mask_to_mesh_with_marching_cube(input_path):
   """ 将 mask 转成 mesh, mask 必须是 0 - 1 的 uchar 类型 """
   assert os.path.exists(input_path), r'文件必须存在 {}'.format(input_path)

   # 读取 mask 变成 image data
   if input_path.find('.mhd'):
       image_reader = vtk.vtkMetaImageReader()
   elif input_path.find('.nii'):
       image_reader = vtk.vtkNIFTIImageReader()

   image_reader.SetFileName(input_path)
   image_reader.Update()

   # 提取 mesh
   mc = vtk.vtkMarchingCubes()
   mc.SetInputData(image_reader.GetOutput())
   mc.SetValue(0, 0.5)
   mc.ComputeNormalsOn()
   mc.Update()

   # 保存成 obj 格式
   writer = vtk.vtkOBJWriter()
   writer.SetInputData(mc.GetOutput())
   writer.SetFileName(r'{}.obj'.format(input_path))
   writer.Update()


if __name__ == '__main__':

   mask_folder = r'C:\mask'
   files = find_files_with_suffix(mask_folder, target_suffix='mhd')

   for file in files:
       print(r'begin process: {}'.format(file))
       convert_mask_to_mesh_with_marching_cube(file)

   print('end')

4. 总结

上面的代码,只需要装好 VTK 9.0, 基本就可以直接使用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值