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程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 Python
python实现爬取千万淘宝商品的方法
Jun 30 Python
python比较两个列表大小的方法
Jul 11 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
python分割列表(list)的方法示例
May 07 Python
Python读取txt某几列绘图的方法
Oct 14 Python
浅谈解除装饰器作用(python3新增)
Oct 15 Python
python 接收处理外带的参数方法
Dec 03 Python
浅谈Django+Gunicorn+Nginx部署之路
Sep 11 Python
Python grpc超时机制代码示例
Sep 14 Python
pytorch 两个GPU同时训练的解决方案
Jun 01 Python
Python上下文管理器Content Manager
Jun 26 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 函数使用方法与函数定义方法
2010/05/09 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
2016/08/12 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
PHP执行linux命令6个函数代码实例
2020/11/24 PHP
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
Jquery实现无刷新DropDownList联动实现代码
2010/03/08 Javascript
动态加载js的方法汇总
2015/02/13 Javascript
完全深入学习Bootstrap表单
2016/11/28 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
vue.js的安装方法
2017/05/12 Javascript
php结合js实现多条件组合查询
2019/05/28 Javascript
使用python绘制人人网好友关系图示例
2014/04/01 Python
PyQt5每天必学之工具提示功能
2018/04/19 Python
python中的变量如何开辟内存
2018/06/26 Python
Python中创建二维数组
2018/10/17 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
python三引号如何输入
2020/07/06 Python
Python字符串三种格式化输出
2020/09/17 Python
Python实现AES加密,解密的两种方法
2020/10/03 Python
"引用"与指针的区别是什么
2016/09/07 面试题
软件缺陷的分类都有哪些
2014/08/22 面试题
证券期货行业个人的自我评价
2013/12/26 职场文书
我读书我快乐演讲稿
2014/05/07 职场文书
七年级地理教学计划
2015/01/22 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
2015年女职工工作总结
2015/05/15 职场文书
2015年小学语文工作总结
2015/05/25 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
编写python程序的90条建议
2021/04/14 Python
python实战之用emoji表情生成文字
2021/05/08 Python
python基础学习之递归函数知识总结
2021/05/26 Python
MySQL的索引你了解吗
2022/03/13 MySQL
海弦WR-800F
2022/04/05 无线电