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之模块的加载
Oct 24 Python
Python文件和目录操作详解
Feb 08 Python
Python简明入门教程
Aug 04 Python
Django与JS交互的示例代码
Aug 23 Python
Python标准模块--ContextManager上下文管理器的具体用法
Nov 27 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
Jan 31 Python
Django Aggregation聚合使用方法解析
Aug 01 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
Aug 27 Python
python中dict()的高级用法实现
Nov 13 Python
python实现tail -f 功能
Jan 17 Python
Python MySQLdb 执行sql语句时的参数传递方式
Mar 04 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 24 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-MySQL教程归纳总结
2008/06/07 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
2013/05/08 PHP
Thinkphp+smarty+uploadify实现无刷新上传
2015/07/30 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
2018/03/30 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
2018/05/11 PHP
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
javascript 鼠标拖动图标技术
2010/02/07 Javascript
jQuery中toggle()函数的使用实例
2015/04/17 Javascript
js实现touch移动触屏滑动事件
2015/04/17 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
2015/12/26 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
利用jQuery异步上传文件的插件用法详解
2017/07/19 jQuery
webpack踩坑之路图片的路径与打包
2017/09/05 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
如何基于JS截获动态代码
2019/12/25 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
深入了解Django中间件及其方法
2019/07/26 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
pytorch中的weight-initilzation用法
2020/06/24 Python
世界上最大的在线学习和教学市场:Udemy
2017/11/08 全球购物
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
2015年采购部工作总结
2015/04/23 职场文书
英语教学课后反思
2016/02/15 职场文书