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中分数的相关使用教程
Mar 30 Python
Python中属性和描述符的正确使用
Aug 23 Python
Python判断变量是否为Json格式的字符串示例
May 03 Python
python字符串过滤性能比较5种方法
Jun 22 Python
老生常谈Python startswith()函数与endswith函数
Sep 08 Python
Python 判断是否为质数或素数的实例
Oct 30 Python
对python 各种删除文件失败的处理方式分享
Apr 24 Python
Python文件循环写入行时防止覆盖的解决方法
Nov 09 Python
python经典趣味24点游戏程序设计
Jul 26 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
Oct 01 Python
python pyenv多版本管理工具的使用
Dec 23 Python
彻底解决pip下载pytorch慢的问题方法
Mar 01 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
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
收藏的PHP常用函数 推荐收藏保存
2010/02/21 PHP
php基础教程 php内置函数实例教程
2012/08/21 PHP
php基于GD库画五星红旗的方法
2015/02/24 PHP
jquery提示 &quot;object expected&quot;的解决方法
2009/12/13 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
Node.js中的事件驱动编程详解
2014/08/16 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
nodejs 搭建简易服务器的图文教程(推荐)
2017/07/18 NodeJs
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
CountUp.js数字滚动插件使用方法详解
2019/10/17 Javascript
[01:00:30]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第二场 10.31
2020/11/02 DOTA
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
详解Python3中ceil()函数用法
2019/02/19 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
python中open函数的基本用法示例
2019/09/07 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
Python 实现键盘鼠标按键模拟
2020/11/18 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
Canvas获取视频第一帧缩略图的实现
2020/11/11 HTML / CSS
新西兰最大的在线设计师眼镜店:SmartBuyGlasses新西兰
2017/10/20 全球购物
生物专业个人自荐信范文
2013/11/29 职场文书
实习自我评价怎么写
2013/12/02 职场文书
毕业评语大全
2014/05/04 职场文书
社区活动策划方案
2014/08/21 职场文书
运动会100米加油稿
2015/07/21 职场文书
小学班级管理心得体会
2016/01/07 职场文书
python小程序之飘落的银杏
2021/04/17 Python
关于Vue中的options选项
2022/03/22 Vue.js