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数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
Sep 28 Python
python实现SOM算法
Feb 23 Python
Python批量发送post请求的实现代码
May 05 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
Jun 28 Python
Python制作exe文件简单流程
Jan 24 Python
pandas对dataFrame中某一个列的数据进行处理的方法
Jul 08 Python
Python进度条的制作代码实例
Aug 31 Python
python实时监控logstash日志代码
Apr 27 Python
pytorch 限制GPU使用效率详解(计算效率)
Jun 27 Python
pytorch 常用函数 max ,eq说明
Jun 28 Python
简述python&amp;pytorch 随机种子的实现
Oct 07 Python
matplotlib绘制多子图共享鼠标光标的方法示例
Jan 08 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 表单提交给自己
2008/07/24 PHP
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
Laravel 5 学习笔记
2015/03/06 PHP
PHP strcmp()和strcasecmp()的区别实例
2016/11/05 PHP
laravel配置Redis多个库的实现方法
2019/04/10 PHP
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
比较全面的event对像在IE与FF中的区别 推荐
2009/09/21 Javascript
关于IE浏览器以及Firefox下的javascript冒泡事件的响应层级
2010/10/14 Javascript
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
js读取配置文件自写
2014/02/11 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
javascript 组合按键事件监听实现代码
2017/02/21 Javascript
zTree实现节点修改的实时刷新功能
2017/03/20 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
vue插槽slot的理解和使用方法
2019/04/03 Javascript
js实现删除li标签一行内容
2019/04/16 Javascript
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
itchat接口使用示例
2017/10/23 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
Django实现列表页商品数据返回教程
2020/04/03 Python
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
英语道歉信范文
2014/01/09 职场文书
小学生新学期寄语
2014/01/19 职场文书
十八大闭幕感言
2014/01/22 职场文书
优秀老员工获奖感言
2014/02/15 职场文书
股东协议书范本
2014/04/14 职场文书
贷款承诺书
2015/01/20 职场文书
档案接收函格式
2015/01/30 职场文书
中学生综合素质自我评价
2015/03/06 职场文书
居委会工作总结2015
2015/05/18 职场文书
win10下go mod配置方式
2021/04/25 Golang
MSSQL基本语法操作
2022/04/11 SQL Server