Chris Xiao
upload files
c642393
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']))
# Compute mid point
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()