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 相关文章推荐
如何利用Fabric自动化你的任务
Oct 20 Python
Python程序员面试题 你必须提前准备!(答案及解析)
Jan 23 Python
Python基础教程之内置函数locals()和globals()用法分析
Mar 16 Python
Python中str.join()简单用法示例
Mar 20 Python
python3库numpy数组属性的查看方法
Apr 17 Python
浅谈python3.6的tkinter运行问题
Feb 22 Python
浅析Python3中的对象垃圾收集机制
Jun 06 Python
Python程序打包工具py2exe和PyInstaller详解
Jun 28 Python
Python实现把类当做字典来访问
Dec 16 Python
Python内置函数locals和globals对比
Apr 28 Python
Appium+Python实现简单的自动化登录测试的实现
Jan 26 Python
Python 批量下载阴阳师网站壁纸
May 19 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 的几个配置文件函数
2006/12/21 PHP
PHP面向接口编程 耦合设计模式 简单范例
2011/03/23 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
PHP超牛逼无限极分类生成树方法
2015/05/11 PHP
举例详解PHP脚本的测试方法
2015/08/05 PHP
学习php设计模式 php实现状态模式
2015/12/07 PHP
深入浅析yii2-gii自定义模板的方法
2016/04/26 PHP
CodeIgniter框架基本增删改查操作示例
2017/03/23 PHP
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
2010/01/12 Javascript
JavaScript接口实现代码 (Interfaces In JavaScript)
2010/06/11 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
微信小程序中显示html格式内容的方法
2017/04/25 Javascript
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
Node.js API详解之 string_decoder用法实例分析
2020/04/29 Javascript
何时/使用 Vue3 render 函数的教程详解
2020/07/25 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
[02:55]DOTA2英雄基础教程 发条技师
2013/12/04 DOTA
[01:09:01]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第一场 10.28
2020/10/28 DOTA
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
PyQt5每天必学之布局管理
2018/04/19 Python
Python Series从0开始索引的方法
2018/11/06 Python
python使用udp实现聊天器功能
2018/12/10 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
css3实现超炫风车特效
2014/11/12 HTML / CSS
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
体育老师的教学自我评价分享
2013/11/19 职场文书
餐饮主管岗位职责
2013/12/10 职场文书
行政办公员自我评价分享
2013/12/14 职场文书
人力资源管理专业求职信
2014/07/23 职场文书
合同权益转让协议书模板
2014/11/18 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
董事长秘书工作总结
2015/08/14 职场文书
创业计划书之珠宝饰品
2019/08/26 职场文书
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server