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的函数嵌套的使用方法
Jan 24 Python
python实现折半查找和归并排序算法
Apr 14 Python
Python 实现购物商城,含有用户入口和商家入口的示例
Sep 15 Python
Python实现判断字符串中包含某个字符的判断函数示例
Jan 08 Python
python pandas写入excel文件的方法示例
Jun 25 Python
python3+django2开发一个简单的人员管理系统过程详解
Jul 23 Python
flask框架单元测试原理与用法实例分析
Jul 23 Python
修改Pandas的行或列的名字(重命名)
Dec 18 Python
什么是Python变量作用域
Jun 03 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
Jun 06 Python
Django+RestFramework API接口及接口文档并返回json数据操作
Jul 12 Python
PyQt5的相对布局管理的实现
Aug 07 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
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
PHP对象相互引用的内存溢出实例分析
2014/08/28 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
通用JS事件写法实现代码
2009/01/07 Javascript
基于jQuery的倒计时插件代码
2011/05/07 Javascript
浏览器中url存储的JavaScript实现
2015/07/07 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
javascript每日必学之循环
2016/02/19 Javascript
深入理解JS DOM事件机制
2016/08/06 Javascript
深入探讨Vue.js组件和组件通信
2016/09/12 Javascript
AngularJs 动态加载模块和依赖
2016/09/15 Javascript
手写Vue2.0 数据劫持的示例
2021/03/04 Vue.js
使用Python下载Bing图片(代码)
2013/11/07 Python
python模拟enum枚举类型的方法小结
2015/04/30 Python
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
2015/05/15 Python
python PIL模块与随机生成中文验证码
2016/02/27 Python
深入浅析python继承问题
2016/05/29 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
2018/09/03 Python
ipython jupyter notebook中显示图像和数学公式实例
2020/04/15 Python
Django ORM filter() 的运用详解
2020/05/14 Python
Coach澳大利亚官方网站:美国著名时尚奢侈品牌
2017/05/24 全球购物
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
社区十八大感言
2014/01/19 职场文书
优秀企业获奖感言
2014/02/01 职场文书
校园环保标语
2014/06/13 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
三严三实学习心得体会
2014/10/13 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
浅谈JS的二进制家族
2021/05/09 Javascript
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL
table不让td文字溢出操作方法
2022/12/24 HTML / CSS