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写的图片蜘蛛人代码
Aug 27 Python
基于scrapy实现的简单蜘蛛采集程序
Apr 17 Python
在Python中操作字典之update()方法的使用
May 22 Python
Python中time模块与datetime模块在使用中的不同之处
Nov 24 Python
python3读取MySQL-Front的MYSQL密码
May 03 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
Apr 27 Python
浅谈Pandas:Series和DataFrame间的算术元素
Dec 22 Python
Python变量访问权限控制详解
Jun 29 Python
python过滤中英文标点符号的实例代码
Jul 15 Python
tensorflow实现在函数中用tf.Print输出中间值
Jan 21 Python
Python 数据可视化神器Pyecharts绘制图像练习
Feb 28 Python
python使用torch随机初始化参数
Mar 22 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判断update语句是否执行成功的方法
2014/08/28 PHP
PHP中提问频率最高的11个面试题和答案
2014/09/02 PHP
PHP实现指定字段的多维数组排序函数分享
2015/03/09 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
百度 popup.js 完美修正版非常的不错 脚本之家推荐
2009/04/17 Javascript
jquery tools之tooltip
2009/07/25 Javascript
Mootools 1.2教程 滑动效果(Slide)
2009/09/15 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
JavaScript高级程序设计 读书笔记之十一 内置对象Global
2012/03/07 Javascript
js查错流程归纳
2012/05/04 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
jQuery实现鼠标滑过点击事件音效试听
2015/08/31 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
2017/12/27 Javascript
Vue 实现从小到大的横向滑动效果详解
2019/10/16 Javascript
python中wx将图标显示在右下角的脚本代码
2013/03/08 Python
python模块之re正则表达式详解
2017/02/03 Python
基于python 字符编码的理解
2017/09/02 Python
教你使用python画一朵花送女朋友
2018/03/29 Python
python django 原生sql 获取数据的例子
2019/08/14 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
python实现堆排序的实例讲解
2020/02/21 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
怎样写留学自荐信
2013/11/11 职场文书
节能环保口号
2014/06/12 职场文书
广告学专业求职信
2014/06/19 职场文书
2014年应急管理工作总结
2014/11/26 职场文书
社区服务活动报告
2015/02/05 职场文书
公司行政助理岗位职责
2015/04/11 职场文书
债务纠纷起诉书
2015/05/20 职场文书
法制教育讲座心得体会
2016/01/14 职场文书
10大幻兽系恶魔果实 蝙蝠果实上榜,第一自愈能力强
2022/03/18 日漫
十大必看国产动漫排名,魁拔上线,第二曾在日本播出
2022/03/18 国漫