python处理DICOM并计算三维模型体积
作者:qd_tudou 发布时间:2022-07-16 09:24:29
标签:python,DICOM,三维模型
在已知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)
来源:https://blog.csdn.net/yaoliuwei1426/article/details/85680152


猜你喜欢
- 动态变量名赋值在使用 tkinter 时需要动态生成变量,如动态生成 var1...var10 变量。使用 exec 动态赋值exec 在
- 描述的意思是HTML为中心的前端开发也差不多是web标准的意思。1.HTML是基础2.CSS依靠选择符提供视觉;3.Javascript 依
- 错误信息PS D:\parttime\python\django\guanxiangzhiji> python manage.py m
- 从 Python 3 开始,str 类型代表着 Unicode 字符串。取决于编码的类型,一个 Unicode 字符可能会占 4 个字节,这
- 组合集总计: group by with rollup/cube grouping sets 子查询按执行方式分:标准子查询、关联子查询 标
- 1、超时时间以下这些配置项单位都是秒,在mysql命令行中可以使用show global variables like '变量名
- python2.7中 集成了json的处理(simplejson),但在实际应用中,从mysql查询出来的数据,通常有日期格式,这时候,会报
- 更改mysql密码-- 查询用户权限show grants for 'root'@'%';update my
- docker安装mysql版本8.0.20,供大家参考,具体内容如下第一步 下拉镜像docker pull mysql:8.0.20第二步
- 前言大家在使用pymysql的时候,通过fetchall()或fetchone()可以获得查询结果,但这个返回数据是不包含字段信息的(不如p
- 1、git merge冲突了,根据提示找到冲突的文件,解决冲突如果文件有冲突,那么会有类似的标记2、修改完之后,执行git add 冲突文件
- 本文实例为大家分享了python绘制箱型图的具体代码,供大家参考,具体内容如下import numpy as npimport pandas
- 本文实例为大家分享了微信小程序调用摄像头实现拍照的具体代码,供大家参考,具体内容如下微信小程序开发文档首先,需要用户授权摄像头权限,这一步是
- 绘制动图FuncAnimation,它的使用要求简洁且定制化程度较高。如果想将很多图片合并为一个动图,那么ArtistAnimation是最
- 1.linux下启动mysql的命令:mysqladmin start/ect/init.d/mysql start (前面为mysql的安
- 方法1:自定义异常# -*- coding:utf-8 -*-"""功能:python跳出循环"&q
- 概述 -------------------------------------------------------------------
- 如何实现在下拉菜单里输入文字? 用这个代码试试看,应该可以的:<script>function pp(){se.opt
- 前言在db中存储json格式的数据,相信大家都或多或少的使用过,那么在查询这个json结构中的数据时,有什么好的方法么?取出String之后
- 前言count函数是用来统计表中或数组中记录的一个函数,count(*) 它返回检索行的数目, 不论其是否包含 NULL值。最近感觉大家都在