ho11laqe's picture
init
ecf08bc
raw history blame
No virus
4.56 kB
# Copyright 2020 Division of Medical Image Computing, German Cancer Research Center (DKFZ), Heidelberg, Germany
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
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))"""