python处理DICOM并计算三维模型体积
程序员文章站
2022-08-27 10:54:36
在已知dicom和三维模型对应掩膜的情况下,计算三维模型的体积。
思路:
1、计算每个体素的体积。每个体素为长方体,x,y为pixelspacing,z为层间距
使用...
在已知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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。