| import numpy as np |
| import glob |
| import ants |
| import nibabel as nib |
| import os |
| import argparse |
| import sys |
| from pathlib import Path |
|
|
| def parse_command_line(): |
| parser = argparse.ArgumentParser( |
| description='pipeline for data preprocessing') |
| parser.add_argument('-bp', metavar='base path', type=str, |
| help="absolute path of the base directory") |
| parser.add_argument('-ip', metavar='image path', type=str, |
| help="relative path of the image directory") |
| parser.add_argument('-sp', metavar='segmentation path', type=str, |
| help="relative path of the image directory") |
| parser.add_argument('-op', metavar='preprocessing result output path', type=str, default='output', |
| help='relative path of the preprocessing result directory') |
| argv = parser.parse_args() |
| return argv |
|
|
| def flip(nib_img, nib_seg, ants_img, ants_seg, seg_fomat): |
| img = nib_img.get_fdata() |
| if seg_fomat == 'nii.gz' or seg_fomat == 'nii': |
| seg = nib_seg.get_fdata() |
| else: |
| seg = nib_seg[0] |
| gem = ants.label_geometry_measures(ants_seg, ants_img) |
| low_x = min(list(gem.loc[:, 'BoundingBoxLower_x'])) |
| upp_x = max(list(gem.loc[:, 'BoundingBoxUpper_x'])) |
| low_y = min(list(gem.loc[:, 'BoundingBoxLower_y'])) |
| upp_y = max(list(gem.loc[:, 'BoundingBoxUpper_y'])) |
| low_z = min(list(gem.loc[:, 'BoundingBoxLower_z'])) |
| upp_z = max(list(gem.loc[:, 'BoundingBoxUpper_z'])) |
| |
| mid_x = int((low_x + upp_x) / 2) |
|
|
| left_seg = seg[:mid_x, :, :] |
| left_img = img[:mid_x, :, :] |
| right_seg = seg[mid_x:, :, :] |
| right_img = img[mid_x:, :, :] |
| flipped_right_seg = np.flip(right_seg, axis=0) |
| flipped_right_img = np.flip(right_img, axis=0) |
| print("finish flip") |
| return left_img, left_seg, flipped_right_img, flipped_right_seg |
|
|
| def load_data(img_path, seg_path): |
| nib_seg = nib.load(seg_path) |
| nib_img = nib.load(img_path) |
| ants_seg = ants.image_read(seg_path) |
| ants_img = ants.image_read(img_path) |
| return nib_img, nib_seg, ants_img, ants_seg |
|
|
|
|
| def crop_flip_save_file(left_img, left_seg, flipped_right_img, flipped_right_seg, nib_img, nib_seg, output_img, output_seg, scan_id): |
| left_img_nii = nib.Nifti1Image( |
| left_img, affine=nib_img.affine, header=nib_img.header) |
| left_seg_nii = nib.Nifti1Image( |
| left_seg, affine=nib_seg.affine, header=nib_seg.header) |
| right_img_nii = nib.Nifti1Image( |
| flipped_right_img, affine=nib_img.affine, header=nib_img.header) |
| right_seg_nii = nib.Nifti1Image( |
| flipped_right_seg, affine=nib_seg.affine, header=nib_seg.header) |
| left_img_nii.to_filename(os.path.join( |
| output_img, scan_id + '1.nii.gz')) |
| left_seg_nii.to_filename(os.path.join( |
| output_seg, scan_id + '1.nii.gz')) |
| right_img_nii.to_filename(os.path.join( |
| output_img, scan_id + '0.nii.gz')) |
| right_seg_nii.to_filename(os.path.join( |
| output_seg, scan_id + '0.nii.gz')) |
|
|
|
|
| def main(): |
| args = parse_command_line() |
| base_path = args.bp |
| image_path = os.path.join(base_path, args.ip) |
| seg_path = os.path.join(base_path, args.sp) |
| output_path = os.path.join(base_path, args.op) |
| output_img = os.path.join(output_path, 'images') |
| output_seg = os.path.join(output_path, 'labels') |
| try: |
| os.mkdir(output_path) |
| except: |
| print(f'{output_path} is already existed') |
|
|
| try: |
| os.mkdir(output_img) |
| except: |
| print(f'{output_img} is already existed') |
|
|
| try: |
| os.mkdir(output_seg) |
| except: |
| print(f'{output_seg} is already existed') |
|
|
| for i in sorted(glob.glob(image_path + '/*nii.gz')): |
| id = os.path.basename(i).split('.')[0] |
| label_path = os.path.join(seg_path, id + '.nii.gz') |
| nib_img, nib_seg, ants_img, ants_seg = load_data(i, label_path) |
| left_img, left_seg, flipped_right_img, flipped_right_seg = flip(nib_img, nib_seg, ants_img, ants_seg, 'nii.gz') |
| print('Scan ID: ' + id + f', img & seg before cropping: {nib_img.get_fdata().shape}, after flipping: {left_img.shape} and {flipped_right_img.shape}') |
| crop_flip_save_file(left_img, left_seg, flipped_right_img, flipped_right_seg, nib_img, nib_seg, output_img, output_seg, id) |
|
|
| if __name__ == '__main__': |
| main() |