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 相关文章推荐
基于wxpython实现的windows GUI程序实例
May 30 Python
Python3使用SMTP发送带附件邮件
Jun 16 Python
JSON文件及Python对JSON文件的读写操作
Oct 07 Python
Python异常的检测和处理方法
Oct 26 Python
新年快乐! python实现绚烂的烟花绽放效果
Jan 30 Python
python f-string式格式化听语音流程讲解
Jun 18 Python
树莓派采用socket方式文件传输(python)
Jun 22 Python
Pandas之ReIndex重新索引的实现
Jun 25 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
Feb 18 Python
Django+boostrap 美化admin后台的操作
Mar 11 Python
Python 捕获代码中所有异常的方法
Aug 03 Python
python drf各类组件的用法和作用
Jan 12 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
文章推荐系统(三)
2006/10/09 PHP
php Undefined index和Undefined variable的解决方法
2008/03/27 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
JS+CSS实现分类动态选择及移动功能效果代码
2015/10/19 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
JavaScript中点击事件的写法
2016/06/28 Javascript
深入理解Node.js 事件循环和回调函数
2016/11/02 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
nodejs动态创建二维码的方法
2017/08/12 NodeJs
详解JS中的柯里化(currying)
2017/08/17 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
获取layer.open弹出层的返回值方法
2018/08/20 Javascript
如何让微信小程序页面之间的通信不再变困难
2019/06/03 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
Python实现识别手写数字大纲
2018/01/29 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
Python函数和模块的使用总结
2019/05/20 Python
python读取Kafka实例
2019/12/23 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
请用用Java代码写一个堆栈
2012/01/26 面试题
初入社会应届生求职信
2013/11/18 职场文书
出差报告怎么写
2014/11/06 职场文书
2016年9月份红领巾广播稿
2015/12/21 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
python基础之停用词过滤详解
2021/04/21 Python
SpringBoot读取Resource下文件的4种方法
2021/07/02 Java/Android
Python 恐龙跑跑小游戏实现流程
2022/02/15 Python