1. 问题描述
dicom数据是医学上CT/MRI等模态的数据存储的通用格式,Digital Imaging and Communications in Medicine,包含除了体素值以外的其他数据,包括患者信息,扫描参数等,但这样的数据每一层都是一个.dcm文件,很麻烦,转成.nii的数据更方便些。
2. 实现方法
python下直接调用函数就行(感谢造轮子大佬)
import dicom2nifti
dicom2nifti.convert_directory(dicom_directory, output_folder, compression=True, reorient=True)
- 其中dicom_directory是包含dicom文件的路径,比如下面这个,20200722下面三个文件夹下都包含dicom数据(这可能是因为医院扫描序列不同或者扫描部位不同,然后存在不同文件夹下),路径写到.../20200722/就可以了,这个函数会读出三个文件夹下的数据,按照扫描序列一一转换
- output_folder就是你想存输出的.nii文件的文件夹路径
更多内容可以看这个包地官网https://dicom2nifti.readthedocs.io/en/latest/readme.html
3. 其他说明
- 每个扫描序列下的slice数量需要大于3,否则会报错'TOO_FEW_SLICES/LOCALIZER',可以在dicom2nifti.common中看到:
def validate_slicecount(dicoms): """ Validate that volume is big enough to create a meaningfull volume This will also skip localizers and alike :param dicoms: list of dicoms """ if len(dicoms) <= 3: logger.warning('At least 4 slices are needed for correct conversion') logger.warning('---------------------------------------------------------') raise ConversionValidationError('TOO_FEW_SLICES/LOCALIZER')
如果你确实有这种数据而且不会被后面用到,可以加一个判断语句避免这种情况
2. 文件夹遍历os.walk()真是好用
for root, _, files in os.walk(dicom_directory):
for dicom_file in files:
file_path = os.path.join(root, dicom_file)
那种文件夹套文件夹地情况,以前还要傻傻地自己遍历。。。os.walk会一直对文件夹下地文件夹遍历,直到没有文件夹
3. 获取扫描序列:
dicom_headers.SeriesInstanceUID