|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import nibabel as nib |
|
from nibabel import io_orientation |
|
from batchgenerators.utilities.file_and_folder_operations import * |
|
import numpy as np |
|
import os |
|
from multiprocessing import Pool |
|
import SimpleITK as sitk |
|
|
|
|
|
def print_shapes(folder: str) -> None: |
|
for i in subfiles(folder, suffix='.nii.gz'): |
|
tmp = sitk.ReadImage(i) |
|
print(sitk.GetArrayFromImage(tmp).shape, tmp.GetSpacing()) |
|
|
|
|
|
def reorient_to_ras(image: str) -> None: |
|
""" |
|
Will overwrite image!!! |
|
:param image: |
|
:return: |
|
""" |
|
assert image.endswith('.nii.gz') |
|
origaffine_pkl = image[:-7] + '_originalAffine.pkl' |
|
if not isfile(origaffine_pkl): |
|
img = nib.load(image) |
|
original_affine = img.affine |
|
original_axcode = nib.aff2axcodes(img.affine) |
|
img = img.as_reoriented(io_orientation(img.affine)) |
|
new_axcode = nib.aff2axcodes(img.affine) |
|
print(image.split('/')[-1], 'original axcode', original_axcode, 'now (should be ras)', new_axcode) |
|
nib.save(img, image) |
|
save_pickle((original_affine, original_axcode), origaffine_pkl) |
|
|
|
|
|
def revert_reorientation(image: str) -> None: |
|
assert image.endswith('.nii.gz') |
|
expected_pkl = image[:-7] + '_originalAffine.pkl' |
|
assert isfile(expected_pkl), 'Must have a file with the original affine, as created by ' \ |
|
'reorient_to_ras. Expected filename: %s' % \ |
|
expected_pkl |
|
original_affine, original_axcode = load_pickle(image[:-7] + '_originalAffine.pkl') |
|
img = nib.load(image) |
|
before_revert = nib.aff2axcodes(img.affine) |
|
img = img.as_reoriented(io_orientation(original_affine)) |
|
after_revert = nib.aff2axcodes(img.affine) |
|
print('before revert', before_revert, 'after revert', after_revert) |
|
restored_affine = img.affine |
|
assert np.all(np.isclose(original_affine, restored_affine)), 'restored affine does not match original affine, ' \ |
|
'aborting!' |
|
nib.save(img, image) |
|
os.remove(expected_pkl) |
|
|
|
|
|
def reorient_all_images_in_folder_to_ras(folder: str, num_processes: int = 8): |
|
p = Pool(num_processes) |
|
nii_files = subfiles(folder, suffix='.nii.gz', join=True) |
|
p.map(reorient_to_ras, nii_files) |
|
p.close() |
|
p.join() |
|
|
|
|
|
def revert_orientation_on_all_images_in_folder(folder: str, num_processes: int = 8): |
|
p = Pool(num_processes) |
|
nii_files = subfiles(folder, suffix='.nii.gz', join=True) |
|
p.map(revert_reorientation, nii_files) |
|
p.close() |
|
p.join() |
|
|
|
|
|
if __name__ == '__main__': |
|
"""nib.as_closest_canonical() |
|
test_img = '/home/fabian/data/la_005_0000.nii.gz' |
|
test_img_reorient = test_img[:-7] + '_reorient.nii.gz' |
|
test_img_restored = test_img[:-7] + '_restored.nii.gz' |
|
|
|
img = nib.load(test_img) |
|
print('loaded original') |
|
print('shape', img.shape) |
|
print('affine', img.affine) |
|
original_affine = img.affine |
|
original_axcode = nib.aff2axcodes(img.affine) |
|
print('orientation', nib.aff2axcodes(img.affine)) |
|
|
|
print('reorienting...') |
|
img = img.as_reoriented(io_orientation(img.affine)) |
|
nib.save(img, test_img_reorient) |
|
|
|
print('now loading the reoriented img') |
|
img = nib.load(test_img_reorient) |
|
print('loaded original') |
|
print('shape', img.shape) |
|
print('affine', img.affine) |
|
reorient_affine = img.affine |
|
reorient_axcode = nib.aff2axcodes(img.affine) |
|
print('orientation', nib.aff2axcodes(img.affine)) |
|
|
|
print('restoring original geometry') |
|
img = img.as_reoriented(io_orientation(original_affine)) |
|
restored_affine = img.affine |
|
nib.save(img, test_img_restored) |
|
|
|
print('now loading the restored img') |
|
img = nib.load(test_img_restored) |
|
print('loaded original') |
|
print('shape', img.shape) |
|
print('affine', img.affine) |
|
print('orientation', nib.aff2axcodes(img.affine))""" |
|
|