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的web框架中中编写日志列表的教程
Apr 30 Python
Python输出9*9乘法表的方法
May 25 Python
Python中关于Sequence切片的下标问题详解
Jun 15 Python
基于python的字节编译详解
Sep 20 Python
python3实现跳一跳点击跳跃
Jan 08 Python
python将txt文件读入为np.array的方法
Oct 30 Python
python实现DEM数据的阴影生成的方法
Jul 23 Python
python科学计算之narray对象用法
Nov 25 Python
python自动点赞功能的实现思路
Feb 26 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
Jun 29 Python
多个版本的python共存时使用pip的正确做法
Oct 26 Python
python绘图subplots函数使用模板的示例代码
Apr 30 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
php 归并排序 数组交集
2011/05/10 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
使用PHP编写的SVN类
2013/07/18 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
2014/06/12 PHP
php防止sql注入简单分析
2015/03/18 PHP
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
javascript编程起步(第四课)
2007/01/10 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
jQuery学习笔记之toArray()
2014/06/09 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
javascript实现回车键提交表单方法总结
2015/01/10 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
基于form-data请求格式详解
2019/10/29 Javascript
es5 类与es6中class的区别小结
2020/11/09 Javascript
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
详细介绍Python语言中的按位运算符
2013/11/26 Python
详解Python编程中time模块的使用
2015/11/20 Python
Python 实现域名解析为ip的方法
2019/02/14 Python
使用python制作一个为hex文件增加版本号的脚本实例
2019/06/12 Python
python实现批量修改文件名
2020/03/23 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
Python基于字典实现switch case函数调用
2020/07/22 Python
在 Python 中使用 7zip 备份文件的操作
2020/12/11 Python
EJB与JAVA BEAN的区别
2016/08/29 面试题
班组安全员工作职责
2014/02/01 职场文书
出纳会计岗位职责
2014/03/12 职场文书
一岗双责责任书
2014/04/15 职场文书
慰问敬老院活动总结
2014/04/26 职场文书
关爱残疾人标语
2014/06/25 职场文书
科技活动总结范文
2015/05/11 职场文书
困难补助申请报告
2015/05/19 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书