python处理DICOM并计算三维模型体积

 更新时间:2019年02月26日 09:19:11   作者:qd_tudou  
这篇文章主要为大家详细介绍了python处理DICOM,并计算三维模型体积,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在已知DICOM和三维模型对应掩膜的情况下,计算三维模型的体积。

思路:

1、计算每个体素的体积。每个体素为长方体,x,y为PixelSpacing,z为层间距

使用pydicom.read_file读取DICOM文件,dcm_tag.PixelSpacing获取像素间距,dcm_tag.SliceLocation 获取层间距

2、计算体素的个数

代码如下:

from PIL import Image
import numpy as np
import pydicom
import os
 
def get_pixels_No(bmp_data_dir):
  pixels_No = 0
  bmp_files = os.listdir(bmp_data_dir)
  for bmp in bmp_files:
    bmp_file = os.path.join(bmp_data_dir,bmp)
    img = Image.open(bmp_file)
    img_array = np.array(img)
    # img_array.dtype为布尔类型,需要转换为Int类型,其累加和恰好为体素总和
    img_array_int = img_array.astype(int)
    pixels_No = pixels_No+img_array_int.sum()
  return pixels_No
 
def get_pixel_info(dcm_data_dir):
 
  pixel_infos = []
  dcm_files = os.listdir(dcm_data_dir)
 
  dcm_file_1 = os.path.join(dcm_data_dir,dcm_files[0])
  dcm_tag_1 = pydicom.read_file(dcm_file_1)
  # 获取像素间距.
  spacex, spacey = dcm_tag_1.PixelSpacing
  # 获取层间距
  # 有些 dcm图像并不是按照InstanceNumber进行排序的,不能直接用最后一张的slicelocation减去第一张,再除以张数
  SliceLocations = []
  ImagePositon_z = []
  for dcm in dcm_files:
    dcm_file = os.path.join(dcm_data_dir, dcm)
    dcm_tag = pydicom.read_file(dcm_file)
    SliceLocations.append(dcm_tag.SliceLocation)
    ImagePositon_z.append(dcm_tag.ImagePositionPatient[2])
  SliceLocations_max =max(SliceLocations)
  SliceLocations_min =min(SliceLocations)
  ImagePositon_z_max = max(ImagePositon_z)
  ImagePositon_z_min = min(ImagePositon_z)
  print(SliceLocations_max)
  print(SliceLocations_min)
  print(ImagePositon_z_max)
  print(ImagePositon_z_min)
  if SliceLocations_max - SliceLocations_min < 1e-10:
    spacez = abs(ImagePositon_z_max - ImagePositon_z_min)/(len(dcm_files)-1)
  else:
    spacez = abs(SliceLocations_max - SliceLocations_min)/(len(dcm_files)-1)
  pixel_infos = [spacex, spacey, spacez]
 
  return pixel_infos
 
def get_volume(dcm_data_dir,bmp_data_dir):
  pixel_infos = get_pixel_info(dcm_data_dir)
  pixels_No = get_pixels_No(bmp_data_dir)
  volume=pixel_infos[0]*pixel_infos[1]*pixel_infos[2]*pixels_No/1000
  return volume
 
# dcm = pydicom.read_file(r"E:\20181210090945_LENG HONGYING F-44Y\Venous\0000.dcm")
# print(dcm)
# print(dcm.ImagePositionPatient[2])
# print(dcm[0x0020, 0x0032].keyword,dcm[0x0020, 0x0032].value)
 
volume=get_volume(r"E:\20181210090945_LENG HONGYING F-44Y\Venous",r"E:\20181210090945_LENG HONGYING F-44Y\Results\LungL")
print("体积为%.1f"%volume)


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python3 shelve对象持久存储原理详解

    Python3 shelve对象持久存储原理详解

    这篇文章主要介绍了Python3 shelve对象持久存储原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 使用python实现一个简单的图片爬虫

    使用python实现一个简单的图片爬虫

    在本文中,我们将学习如何使用Python创建一个简单的图片爬虫,我们将利用requests库来发送HTTP请求,BeautifulSoup库来解析HTML页面,以及os和shutil库来下载和保存图片,通过这个教程,你将学会如何爬取网页上的图片并保存到本地,需要的朋友可以参考下
    2024-02-02
  • 利用Python NumPy库及Matplotlib库绘制数学函数图像

    利用Python NumPy库及Matplotlib库绘制数学函数图像

    最近开始学习数学了,有一些题目的函数图像非常有特点,下面这篇文章主要给大家介绍了关于利用Python NumPy库及Matplotlib库绘制数学函数图像的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 带你用Python实现Saga 分布式事务的方法

    带你用Python实现Saga 分布式事务的方法

    在这篇文章里,我们介绍了 SAGA 的理论知识,也通过一个例子,完整给出了编写一个 SAGA 事务的过程,涵盖了正常成功完成,异常情况,以及成功回滚的情况,需要的朋友参考下吧
    2021-09-09
  • pandas对指定列进行填充的方法

    pandas对指定列进行填充的方法

    下面小编就为大家分享一篇pandas对指定列进行填充的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • 用python实现的可以拷贝或剪切一个文件列表中的所有文件

    用python实现的可以拷贝或剪切一个文件列表中的所有文件

    python 实现剪切或是拷贝一个文件列表中的所有文件
    2009-04-04
  • 将python安装信息加入注册表的示例

    将python安装信息加入注册表的示例

    今天小编就为大家分享一篇将python安装信息加入注册表的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python中dtypes和type()函数的区别示例详解

    python中dtypes和type()函数的区别示例详解

    type()是python内置的函数,type()返回数据结构类型(list、dict、numpy.ndarray 等),dtype返回数据元素的数据类型(int、float等),这篇文章主要给大家介绍了关于python中dtypes和type()函数区别的相关资料,需要的朋友可以参考下
    2024-03-03
  • Python读取Windows和Linux的CPU、GPU、硬盘等部件温度的读取方法

    Python读取Windows和Linux的CPU、GPU、硬盘等部件温度的读取方法

    本文详细介绍了如何使用Python在Windows和Linux系统上通过OpenHardwareMonitor和psutil库读取CPU、GPU等部件的温度,包括Windows下的两种方法以及Linux下的简单实现,感兴趣的小伙伴跟着小编一起来看看吧
    2025-02-02
  • python+selenium自动化实战携带cookies模拟登陆微博

    python+selenium自动化实战携带cookies模拟登陆微博

    这篇文章主要介绍了python+selenium自动化实战携带cookies模拟登陆微博,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论