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


Posted in Python onFebruary 26, 2019

在已知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)

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

Python 相关文章推荐
Python中文字符串截取问题
Jun 15 Python
django orm 通过related_name反向查询的方法
Dec 15 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
Python while循环使用else语句代码实例
Feb 07 Python
git查看、创建、删除、本地、远程分支方法详解
Feb 18 Python
python 链接sqlserver 写接口实例
Mar 11 Python
django 解决扩展自带User表遇到的问题
May 14 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
Jun 28 Python
如何用用Python将地址标记在地图上
Feb 07 Python
利用Python多线程实现图片下载器
Mar 25 Python
python对文档中元素删除,替换操作
Apr 02 Python
学习python可以干什么
Feb 26 #Python
Python3几个常见问题的处理方法
Feb 26 #Python
django 自定义过滤器的实现
Feb 26 #Python
使用Python将Mysql的查询数据导出到文件的方法
Feb 25 #Python
Python-ElasticSearch搜索查询的讲解
Feb 25 #Python
Python2 Selenium元素定位的实现(8种)
Feb 25 #Python
selenium python 实现基本自动化测试的示例代码
Feb 25 #Python
You might like
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
PHP+DBM的同学录程序(3)
2006/10/09 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
项目中应用Redis+Php的场景
2016/05/22 PHP
CI框架数据库查询缓存优化的方法
2016/11/21 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
js 模拟气泡屏保效果代码
2010/07/10 Javascript
javascript动态改变img的src属性图片不显示的解决方法
2010/10/20 Javascript
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
用Javascript评估用户输入密码的强度实现代码
2011/11/30 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
封装好的一个万能检测表单的方法
2015/01/21 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
JSON字符串和对象之间的转换详解
2015/05/26 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
JavaScript基础心法 数据类型
2018/03/05 Javascript
JS实现的缓冲运动效果示例
2018/04/30 Javascript
Vue+webpack+Element 兼容问题总结(小结)
2018/08/16 Javascript
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
element-ui 本地化使用教程详解
2019/10/28 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
Python 调用DLL操作抄表机
2009/01/12 Python
Python中的字典与成员运算符初步探究
2015/10/13 Python
Flask实现图片的上传、下载及展示示例代码
2018/08/03 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
Python利用WMI实现ping命令的例子
2019/08/14 Python
phpquery中文手册
2021/03/18 PHP
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
现代家居用品及礼品:LBC Modern
2018/06/24 全球购物
kfc实习自我鉴定
2013/12/14 职场文书
2013年研究生毕业感言
2014/02/06 职场文书
企业法律事务工作总结
2015/08/11 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫
MySQL里面的子查询的基本使用
2021/08/02 MySQL