Spaces:
Running
Running
import SimpleITK as sitk | |
import os | |
import argparse | |
import glob | |
from tqdm import tqdm | |
def convert_dicom_series_to_nifti(dicom_dir, output_file): | |
""" | |
Convert a single DICOM series to NIFTI format | |
Args: | |
dicom_dir: Directory containing DICOM files for one scan | |
output_file: Output NIFTI file path | |
Returns: | |
bool: True if conversion successful, False otherwise | |
""" | |
try: | |
reader = sitk.ImageSeriesReader() | |
# get all the scans in the dir | |
dicom_files = sorted(glob.glob(os.path.join(dicom_dir, "*.dcm"))) | |
if not dicom_files: | |
print(f"No DICOM files found in: {dicom_dir}") | |
return False | |
reader.SetFileNames(dicom_files) | |
# load dicom images | |
image = reader.Execute() | |
sitk.WriteImage(image, output_file) | |
return True | |
except Exception as e: | |
print(f"Error converting {dicom_dir}: {str(e)}") | |
return False | |
def convert_dicom_to_nifti(input_dir, output_dir): | |
""" | |
Convert multiple DICOM series to NIFTI format | |
Args: | |
input_dir: Root directory containing subdirectories of DICOM series | |
output_dir: Output directory for NIFTI files | |
""" | |
# Create output directory if it doesn't exist | |
os.makedirs(output_dir, exist_ok=True) | |
input_dir = os.path.abspath(input_dir) | |
output_dir = os.path.abspath(output_dir) | |
print(f"Looking for DICOM series in: {input_dir}") | |
# Check if directory exists | |
if not os.path.isdir(input_dir): | |
print(f"Error: {input_dir} is not a directory") | |
return | |
scan_dirs = [d for d in os.listdir(input_dir) | |
if os.path.isdir(os.path.join(input_dir, d))] | |
if not scan_dirs: | |
print("No subdirectories found in the input directory") | |
return | |
print(f"Found {len(scan_dirs)} potential scan directories") | |
# Process each scan directory | |
successful = 0 | |
failed = 0 | |
for scan_dir in tqdm(scan_dirs, desc="Converting scans"): | |
input_path = os.path.join(input_dir, scan_dir) | |
output_file = os.path.join(output_dir, f"{scan_dir}.nii.gz") | |
if convert_dicom_series_to_nifti(input_path, output_file): | |
successful += 1 | |
else: | |
failed += 1 | |
print("\nConversion Summary:") | |
print(f"Successfully converted: {successful} scans") | |
print(f"Failed conversions: {failed} scans") | |
print(f"Output directory: {output_dir}") | |
if __name__ == "__main__": | |
parser = argparse.ArgumentParser(description="Convert DICOM series to NIFTI format") | |
parser.add_argument("--input", "-i", required=True, | |
help="Input directory containing subdirectories of DICOM series") | |
parser.add_argument("--output", "-o", required=True, | |
help="Output directory for NIFTI files") | |
args = parser.parse_args() | |
convert_dicom_to_nifti(args.input, args.output) |