Exemple #1
0
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)
Exemple #2
0
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")
Exemple #3
0
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)
Exemple #5
0
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)