def nrrd2nii(in_fn, out_fn=None):
if not in_fn.endswith('.nrrd'):
logger.info('skipped')
else:
try:
image = sitk.ReadImage(in_fn)
if out_fn is None:
out_fn = in_fn.replace('nrrd', 'nii.gz')
sitk.WriteImage(image, out_fn)
except:
_nrrd = nrrd.read(in_fn)
data = _nrrd[0]
header = _nrrd[1]
print('header', header)
orient_list = header['space'].split('-')
# print(orient_list)
orient = np.array([1, 1, 1, 1])
if orient_list[0] == 'right':
orient[0] = 1
elif orient_list[0] == 'left':
orient[0] = -1
if orient_list[1] == 'anterior':
orient[1] = 1
elif orient_list[1] == 'posterior':
orient[1] = -1
if orient_list[2] == 'superior':
orient[2] = 1
elif orient_list[1] == 'inferior':
orient[2] = -1
space = np.diag(orient)
# affine[:3, :3] = header['space directions']
# affine[:3, 3] = header['space origin'].T
affine = np.eye(4)
affine[:3, :3] = header['space directions'] * header['spacings']
affine[:3, 3] = np.array(list(map(float, header['origin'][1:-1].strip().split()))).T
affine = np.dot(space, affine)
# print(affine)
img = nib.Nifti1Image(data, affine)
if out_fn is None:
out_fn = in_fn.replace('nrrd', 'nii.gz')
# print(out_fn)
nib.save(img, out_fn)
print(orient_list, nib.aff2axcodes(img.affine))
# print(header['origin'])
# print(temp)