def xfmavg(inputs, output): # TODO: handl inversion flag correctly all_linear = True all_nonlinear = True input_xfms = [] input_grids = [] for j in inputs: try: x = minc2_xfm(j) except: print("Error reading:{} in {}".format(j, repr(inputs))) raise if x.get_n_concat() == 1 and x.get_n_type( 0) == minc2_xfm.MINC2_XFM_LINEAR: # this is a linear matrix input_xfms.append(np.asmatrix(x.get_linear_transform())) else: raise Exception("Unexpected XFM type") acc = np.asmatrix(np.zeros([4, 4], dtype=np.complex)) for i in input_xfms: acc += scipy.linalg.logm(i) acc /= len(input_xfms) acc = np.asarray(scipy.linalg.expm(acc).real, 'float64', 'C') x = minc2_xfm() x.append_linear_transform(acc) x.save(output)
def xfmavg(inputs, output, verbose=False): # TODO: handle inversion flag correctly all_linear = True all_nonlinear = True input_xfms = [] input_grids = [] for j in inputs: x = minc2_xfm(j) if x.get_n_concat() == 1 and x.get_n_type( 0) == minc2_xfm.MINC2_XFM_LINEAR: # this is a linear matrix input_xfms.append(np.asmatrix(x.get_linear_transform())) else: all_linear &= False # strip identity matrixes nl = [] _identity = np.asmatrix(np.identity(4)) _eps = 1e-6 if x.get_n_type(0) == minc2_xfm.MINC2_XFM_LINEAR and x.get_n_type( 1) == minc2_xfm.MINC2_XFM_GRID_TRANSFORM: if scipy.linalg.norm(_identity - np.asmatrix(x.get_linear_transform(0)) ) > _eps: # this is non-identity matrix all_nonlinear &= False else: input_grids.append(x.get_grid_transform(1)[0]) elif x.get_n_type(1) == minc2_xfm.MINC2_XFM_GRID_TRANSFORM: input_grids.append(x.get_grid_transform(0)[0]) if all_linear: acc = np.asmatrix(np.zeros([4, 4], dtype=np.complex)) for i in input_xfms: print(i) acc += scipy.linalg.logm(i) acc /= len(input_xfms) acc = np.asarray(scipy.linalg.expm(acc).real, 'float64', 'C') print("result:", acc) x = minc2_xfm() x.append_linear_transform(acc) x.save(output) elif all_nonlinear: output_grid = output.rsplit('.xfm', 1)[0] + '_grid_0.mnc' cmds = ['mincaverage', '-clob'] cmds.extend(input_grids) cmds.append(output_grid) do_cmd(cmds, verbose=verbose) x = minc2_xfm() x.append_grid_transform(output_grid, False) x.save(output) else: raise Exception("Mixed XFM files provided as input")
def xfm_dist(xfm,ref): xfm1=minc2_xfm(xfm) xfm2=minc2_xfm(ref) #concatenate inverted xfm2 xfm1.invert() xfm1.concat_xfm(xfm2) param=xfm1.get_linear_transform_param() if param.invalid: param.rotations.fill(float('nan')) param.dist=0.0 for x in range(2): for y in range(2): for z in range(2): p_in=np.array( [edges[x][0], edges[y][1], edges[z][2]] ) p_out=xfm1.transform_point(p_in) dst=np.linalg.norm(p_in-p_out,ord=2) if dst>param.dist: param.dist=dst return param
def xfmconcat(inputs, output): # all_linear = True input_xfms = [] input_grids = [] o = minc2_xfm() for j in inputs: try: x = minc2_xfm(j) except: print("Error reading:{} in {}".format(j, repr(inputs))) raise if x.get_n_concat() == 1 and x.get_n_type( 0) == minc2_xfm.MINC2_XFM_LINEAR: # this is a linear matrix o.append_linear_transform(x.get_linear_transform()) else: raise Exception("Unexpected XFM type") o.save(output)
from minc2_simple import minc2_file from minc2_simple import minc2_xfm from minc2_simple import minc2_transform_parameters import sys import numpy as np if __name__ == "__main__": # experiment with XFM files x = minc2_xfm() identity = np.eye(4) x.append_linear_transform(identity) x.save('identity.xfm') par = minc2_transform_parameters() par.translations = np.array([1, 2, 3]) par.scales = np.array([1.1, 1.0, 0.9]) y = minc2_xfm() y.append_linear_transform(par) y.save('test_par.xfm') z = minc2_xfm('test_par.xfm') par2 = z.get_linear_transform_param(0) print(par) print(par.translations) print(par2) print(par2.translations)