这篇主要讲怎么处理dicom格式的医学影像文件,并且转换成png,这样利于我们对图像进行处理。
pydicom 目前取代了前的dicom库,更加的便捷
导入需要的模块,如果没安装,都可以用pip进行安装。SimpleITK、pydicom是操作医学影像的模块。
import osimport SimpleITKimport pydicomimport numpy as npimport cv2from tqdm import tqdmdef is_dicom_file(filename):#判断某文件是否是dicom格式的文件file_stream = open(filename, 'rb')file_stream.seek(128)data = file_stream.read(4)file_stream.close()if data == b'DICM':return Truereturn Falsedef load_patient(src_dir):'''读取某文件夹内的所有dicom文件:param src_dir: dicom文件夹路径:return: dicom list'''files = os.listdir(src_dir)slices = []for s in files:if is_dicom_file(src_dir + '/' + s):instance = pydicom.read_file(src_dir + '/' + s)slices.append(instance)try:slice_thickness = np.abs(slices[0].ImagePositionPatient[2] - slices[1].ImagePositionPatient[2])except:slice_thickness = np.abs(slices[0].SliceLocation - slices[1].SliceLocation)for s in slices:s.SliceThickness = slice_thicknessreturn slicesdef get_pixels_hu_by_simpleitk(dicom_dir):'''读取某文件夹内的所有dicom文件:param src_dir: dicom文件夹路径:return: image array'''reader = SimpleITK.ImageSeriesReader()dicom_names = reader.GetGDCMSeriesFileNames(dicom_dir)reader.SetFileNames(dicom_names)image = reader.Execute()img_array = SimpleITK.GetArrayFromImage(image)img_array[img_array == -2000] = 0return img_arrayif __name__ == '__main__':#dicom文件目录dicom_dir = 'dcm/'# 读取dicom文件的元数据(dicom tags)slices = load_patient(dicom_dir)print('The number of dicom files : ', len(slices))# 提取dicom文件中的像素值image = get_pixels_hu_by_simpleitk(dicom_dir)for i in tqdm(range(image.shape[0])):#输出png文件目录img_path = "dcm_2_png/img_" + str(i).rjust(4, '0') + "_i.png"org_img =image[i]*20# 保存图像数组cv2.imwrite(img_path, org_img )
借鉴修改自DICOM转PNG
将DICOM库改为了pydicom库,路径稍作修改导出在代码同一目录下(导出前手动建目录)