Chris Xiao
upload files
c642393
Raw
History Blame Contribute Delete
4.33 kB
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()