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 26 Python
python显示天气预报
Mar 02 Python
在Python中使用NLTK库实现对词干的提取的教程
Apr 08 Python
Python3操作SQL Server数据库(实例讲解)
Oct 21 Python
python使用正则表达式的search()函数实现指定位置搜索功能
Nov 10 Python
Flask之请求钩子的实现
Dec 23 Python
python networkx 包绘制复杂网络关系图的实现
Jul 10 Python
DJango的创建和使用详解(默认数据库sqlite3)
Nov 18 Python
Python程序慢的重要原因
Sep 04 Python
python 装饰器的使用示例
Oct 10 Python
python re模块和正则表达式
Mar 24 Python
python实现腾讯滑块验证码识别
Apr 27 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图片上传代码
2013/11/04 PHP
让PHP显示Facebook的粉丝数量方法
2014/01/08 PHP
php获取当前时间的毫秒数的方法
2014/01/26 PHP
php实现12306余票查询、价格查询示例
2014/04/17 PHP
php中heredoc与nowdoc介绍
2014/12/25 PHP
php数组键值用法实例分析
2015/02/27 PHP
深入浅析PHP无限极分类的案例教程
2016/05/09 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
php中类和对象:静态属性、静态方法
2017/04/09 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
PHP iconv()函数字符编码转换的问题讲解
2019/03/22 PHP
Jquery easyUI 更新行示例
2014/03/06 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
2014/08/10 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
基于jQuery实现自动轮播旋转木马特效
2015/11/02 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
JS实现图片切换效果
2018/11/17 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
Python日期的加减等操作的示例
2017/08/15 Python
python根据unicode判断语言类型实例代码
2018/01/17 Python
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
对python中的six.moves模块的下载函数urlretrieve详解
2018/12/19 Python
解决springboot yml配置 logging.level 报错问题
2020/02/21 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
2020/11/17 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
《回乡偶书》教学反思
2014/04/12 职场文书
媒矿安全生产承诺书
2014/05/23 职场文书
学校领导班子对照检查材料
2014/08/28 职场文书
springcloud之Feign超时问题的解决
2021/06/24 Java/Android