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 相关文章推荐
在GitHub Pages上使用Pelican搭建博客的教程
Apr 25 Python
利用Python yagmail三行代码实现发送邮件
May 11 Python
Python装饰器模式定义与用法分析
Aug 06 Python
python json.loads兼容单引号数据的方法
Dec 19 Python
python判断文件是否存在,不存在就创建一个的实例
Feb 18 Python
Django实现学生管理系统
Feb 26 Python
python实现月食效果实例代码
Jun 18 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
Dec 11 Python
pytorch实现onehot编码转为普通label标签
Jan 02 Python
django xadmin 管理器常用显示设置方式
Mar 11 Python
python使用隐式循环快速求和的实现示例
Sep 11 Python
python定时截屏实现
Nov 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
推荐个功能齐全的发送PHP邮件类
2007/01/03 PHP
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
非阻塞动态加载javascript广告实现代码
2010/11/17 Javascript
javascript中xml操作实现代码
2011/11/21 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
Javascript中的Array数组对象详谈
2014/03/03 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
jquery滚动加载数据的方法
2015/03/09 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
基于JavaScript实现前端文件的断点续传
2016/10/17 Javascript
利用D3.js实现最简单的柱状图示例代码
2016/12/09 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
javascript 产生随机数的几种方法总结
2017/09/26 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
2020/04/27 Javascript
Python开发常用的一些开源Package分享
2015/02/14 Python
Python实现二叉堆
2016/02/03 Python
详解python调度框架APScheduler使用
2017/03/28 Python
python3 爬取图片的实例代码
2018/11/06 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
基于python plotly交互式图表大全
2019/12/07 Python
python 下划线的不同用法
2020/10/24 Python
森海塞尔美国官网:Sennheiser耳机与耳麦
2017/07/19 全球购物
皇家阿尔伯特瓷器美国官网:Royal Albert美国
2020/02/16 全球购物
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
毕业生的自我评价
2013/12/30 职场文书
初中毕业生的自我评价
2014/03/03 职场文书
新年联欢会主持词
2014/03/27 职场文书
工地安全质量标语
2014/06/07 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
团结主题班会
2015/08/13 职场文书
《角的度量》教学反思
2016/02/18 职场文书