python处理DICOM并计算三维模型体积
在已知DICOM和三维模型对应掩膜的情况下,计算三维模型的体积。
思路:
1、计算每个体素的体积。每个体素为长方体,x,y为PixelSpacing,z为层间距
使用pydicom.read_file读取DICOM文件,dcm_tag.PixelSpacing获取像素间距,dcm_tag.SliceLocation获取层间距
2、计算体素的个数
代码如下:
fromPILimportImage importnumpyasnp importpydicom importos defget_pixels_No(bmp_data_dir): pixels_No=0 bmp_files=os.listdir(bmp_data_dir) forbmpinbmp_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() returnpixels_No defget_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=[] fordcmindcm_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) ifSliceLocations_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] returnpixel_infos defget_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 returnvolume #dcm=pydicom.read_file(r"E:\20181210090945_LENGHONGYINGF-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_LENGHONGYINGF-44Y\Venous",r"E:\20181210090945_LENGHONGYINGF-44Y\Results\LungL") print("体积为%.1f"%volume)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。