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 相关文章推荐
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 Python
python中利用Future对象异步返回结果示例代码
Sep 07 Python
Python图形绘制操作之正弦曲线实现方法分析
Dec 25 Python
基于并发服务器几种实现方法(总结)
Dec 29 Python
python 返回列表中某个值的索引方法
Nov 07 Python
Python+AutoIt实现界面工具开发过程详解
Aug 07 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
Jan 15 Python
python 3.8.3 安装配置图文教程
May 21 Python
浅析python 字典嵌套
Sep 29 Python
Python爬虫之Selenium实现键盘事件
Dec 04 Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 29 Python
ROS系统将python包编译为可执行文件的简单步骤
Jul 25 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
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
2011/09/11 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
2018/08/17 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
js点击出现悬浮窗效果不使用JQuery插件
2014/01/20 Javascript
jQuery中:only-child选择器用法实例
2015/01/03 Javascript
jQuery实现表格展开与折叠的方法
2015/05/04 Javascript
jquery操作select元素和option的实例代码
2016/02/03 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
JavaScript ES6中的简写语法总结与使用技巧
2018/12/30 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
VUEX-action可以修改state吗
2019/11/19 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
js实现点赞效果
2020/03/16 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
2015/03/31 Python
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
Win10下python 2.7与python 3.7双环境安装教程图解
2019/10/12 Python
Django 自动生成api接口文档教程
2019/11/19 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
公务员平时考核实施方案
2014/03/11 职场文书
生产文员岗位职责
2014/04/05 职场文书
司机岗位职责说明书
2014/07/29 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
2014年最新领导班子整改方案
2014/09/27 职场文书
环境卫生工作汇报材料
2014/10/28 职场文书
会议营销主持词
2015/07/03 职场文书
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript