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中暂存上传图片的方法
Feb 18 Python
python实现自动更换ip的方法
May 05 Python
python获取当前运行函数名称的方法实例代码
Apr 06 Python
详解python的webrtc库实现语音端点检测
May 31 Python
Python 读取某个目录下所有的文件实例
Jun 23 Python
Django中使用Whoosh进行全文检索的方法
Mar 31 Python
python识别图像并提取文字的实现方法
Jun 28 Python
解决django服务器重启端口被占用的问题
Jul 26 Python
flask框架jinja2模板与模板继承实例分析
Aug 01 Python
Python3如何在Windows和Linux上打包
Feb 25 Python
利用Python如何实时检测自身内存占用
May 09 Python
python属于解释语言吗
Jun 11 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
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
PHP中常见的缓存技术实例分析
2015/09/23 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
2016/08/08 PHP
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
Javascript中arguments对象详解
2014/10/22 Javascript
详解AngularJS实现表单验证
2015/12/10 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
在javascript中,null>=0 为真,null==0却为假,null的值详解
2017/02/22 Javascript
javascript数据结构之串的概念与用法分析
2017/04/12 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
layui 监听表格复选框选中值的方法
2018/08/15 Javascript
vue中设置、获取、删除cookie的方法
2018/09/21 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
Python爬虫实现百度图片自动下载
2018/02/04 Python
python dataframe astype 字段类型转换方法
2018/04/11 Python
python绘制多个曲线的折线图
2020/03/23 Python
线程安全及Python中的GIL原理分析
2019/10/29 Python
Python Tkinter模块 GUI 可视化实例
2019/11/20 Python
windows下python安装pip方法详解
2020/02/10 Python
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
2018/09/19 HTML / CSS
西班牙土拨鼠床垫公司,感觉在云端:Marmota
2019/03/18 全球购物
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
毕业生物理教师求职信
2013/10/17 职场文书
本科生的职业生涯规划范文
2014/01/09 职场文书
小学生家长评语大全
2014/02/10 职场文书
2014年清明节网上祭英烈寄语
2014/04/09 职场文书
《荷花》教学反思
2014/04/16 职场文书
拆迁委托协议书
2014/09/15 职场文书
党员评议思想汇报
2014/10/08 职场文书
小学五年级语文上册教学计划
2015/01/22 职场文书
离职证明范本
2015/06/12 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书
详解Python中的进程和线程
2021/06/23 Python