import os
from tempfile import mktemp
import numpy as np
import ants
__all__ = ['average_images']
def average_images( x, normalize=True, mask=None, imagetype=0, sum_image_threshold=3, return_sum_image=False, verbose=False ):
"""
average a list of images
images will be resampled automatically to the largest image space;
this is not a registration so images should be in the same physical
space to begin with.
x : a list containing either filenames or antsImages
normalize : boolean
mask : None or integer; this will perform a masked averaging which can
be useful when images have only partial coverage. integer greater
than zero will perform morphological closing.
imagetype : integer
choose 0/1/2/3 mapping to scalar/vector/tensor/time-series
sum_image_threshold : integer
only average regions with overlap greater than or equal to this value
return_sum_image : boolean
returns the average and the image that show ROI overlap; primarily for debugging
verbose : boolean
will print progress
Returns
-------
ANTsImage
Example
-------
>>> import ants
>>> x0=[ ants.get_data('r16'), ants.get_data('r27'), ants.get_data('r62'), ants.get_data('r64') ]
>>> x1=[]
>>> for k in range(len(x0)):
>>> x1.append( ants.image_read( x0[k] ) )
>>> avg=ants.average_images(x0)
>>> avg1=ants.average_images(x1)
>>> avg2=ants.average_images(x1,mask=0)
>>> avg3=ants.average_images(x1,mask=1,normalize=True)
"""
import numpy as np
def gli( y, normalize=False ):
if isinstance(y,str):
y=ants.image_read(y)
if normalize:
y=y/y.mean()
return y
biggest=0
biggestind=0
for k in range( len( x ) ):
locimg = gli( x[k], False )
sz=np.prod( locimg.shape )
if sz > biggest:
biggest=sz
biggestind=k
avg = gli( x[biggestind], False ) * 0
scl = float( 1.0 / len(x))
if mask is not None:
sumimg = gli( x[biggestind], False ) * 0
for k in range( len( x ) ):
if verbose and k % 20 == 0:
print( str(k)+'...', end='',flush=True)
locimg = gli( x[k], normalize )
temp = ants.resample_image_to_target( locimg, avg, interp_type='linear', imagetype=imagetype )
avg = avg + temp
if mask is not None:
fgmask = ants.threshold_image(temp,'Otsu',1)
if mask > 0:
fgmask = ants.morphology(fgmask,"close",mask)
sumimg = sumimg + fgmask
if return_sum_image:
return avg * scl, sumimg
if mask is None:
avg = avg * scl
else:
nonzero = sumimg > sum_image_threshold
tozero = sumimg <= sum_image_threshold
avg[nonzero] = avg[nonzero] / sumimg[nonzero]
avg[tozero] = 0
return avg