예제 #1
0
    def directInvokeAlgorithm(self,vals):
        print('oooo invoking: nonLinearRegistration', (vals));	
        target = self.inputs['target'];
        reference = self.inputs['reference'];
        transform = self.inputs['initial'];
        linearmode = bis_baseutils.getLinearModeCode(vals['linearmode']);

        initial=transform;
        if (linearmode>=0):
            try:
                mat=libbis.runLinearRegistrationWASM(reference, target, transform, {
                    'intscale' : vals['intscale'],
                    'numbins' : vals['numbins'],
                    'levels' : vals['levels'],
                    'smoothing' : vals['extrasmoothing'],
                    'optimization' : bis_baseutils.getOptimizationCode(vals['optimization']),
                    'stepsize' : vals['stepsize'],
                    'metric' : bis_baseutils.getMetricCode(vals['metric']),
	            'steps' : vals['steps'],
                    'iterations' : vals['iterations'],
                    'normalize' : self.parseBoolean(vals['norm']),
                    'debug' : self.parseBoolean(vals['debug']),
                    'mode' : linearmode,
                    'resolution' : vals['resolution'],
                    'return_vector' : False}, self.parseBoolean(vals['debug']));

                initial=bis_objects.bisLinearTransformation();
                initial.create(mat);
            except:
                print('Failed to invoke linear registration algorithm.');
                return False;

        try:
            self.outputs['output']=libbis.runNonLinearRegistrationWASM(reference, target, initial, {
		    'cps' : vals['cps'],
                    'lambda' : vals['lambda'],
                    'intscale' : vals['intscale'],
                    'numbins' : vals['numbins'],
                    'levels' : vals['levels'],
                    'smoothing' : vals['extrasmoothing'],
                    'optimization' : bis_baseutils.getOptimizationCode(vals['optimization']),
                    'stepsize' : vals['stepsize'],
                    'debug' : self.parseBoolean(vals['debug']),
                    'normalize' : self.parseBoolean(vals['norm']),
                    'metric' : bis_baseutils.getMetricCode(vals['metric']),
	            'steps' : vals['steps'],
                    'iterations' : vals['iterations'],
                    'resolution' : vals['resolution']}, self.parseBoolean(vals['debug']));
            
            if (self.parseBoolean(vals['doreslice'])==True):
                self.outputs['resliced']=bis_baseutils.resliceRegistrationOutput(libbis,reference,
                                                                                 target,self.outputs['output']);
        except:
            print('---- Failed to invoke nonlinear registration algorithm.');
            return False

        return True
예제 #2
0
    def directInvokeAlgorithm(self, vals):

        print('oooo invoking: linearRegistration', (vals))
        target = self.inputs['target']
        reference = self.inputs['reference']
        transform = self.inputs['initial']

        if (reference.hasSameOrientation(target, 'Reference Image',
                                         'Target Image', True) == False):
            return False

        try:
            out = libbis.runLinearRegistrationWASM(
                reference, target, transform, {
                    'intscale':
                    vals['intscale'],
                    'numbins':
                    vals['numbins'],
                    'levels':
                    vals['levels'],
                    'smoothing':
                    vals['imagesmoothing'],
                    'optimization':
                    bis_baseutils.getOptimizationCode(vals['optimization']),
                    'stepsize':
                    vals['stepsize'],
                    'metric':
                    bis_baseutils.getMetricCode(vals['metric']),
                    'steps':
                    vals['steps'],
                    'normalize':
                    self.parseBoolean(vals['norm']),
                    'debug':
                    self.parseBoolean(vals['debug']),
                    'iterations':
                    vals['iterations'],
                    'mode':
                    bis_baseutils.getLinearModeCode(vals['mode']),
                    'resolution':
                    vals['resolution'],
                    'return_vector':
                    False
                }, self.parseBoolean(vals['debug']))

            self.outputs['output'] = bis_objects.bisLinearTransformation()
            self.outputs['output'].create(out)

            if (self.parseBoolean(vals['doreslice']) == True):
                self.outputs[
                    'resliced'] = bis_baseutils.resliceRegistrationOutput(
                        libbis, reference, target, self.outputs['output'])
        except:
            e = sys.exc_info()[0]
            print('---- Failed to invoke algorithm', e)
            return False

        return True
예제 #3
0
    def test_resample_module(self):

        imgnames = [
            'avg152T1_LR_nifti_resampled.nii.gz', 'avg152T1_LR_nifti.nii.gz',
            'avg152T1_LR_nifti_resampled_resliced.nii.gz'
        ]
        images = [0, 0, 0]
        names = [' reference', 'target', 'true']

        print('\n\n')
        print('----------------------------------------------------------')
        for i in range(0, 3):
            name = my_path + '/../test/testdata/' + imgnames[i]
            images[i] = bis.bisImage().load(name)
            print('__ loaded ', names[i], 'from ', name, 'dims=',
                  images[i].dimensions, images[i].spacing,
                  images[i].dimensions, images[i].get_data().dtype)
        print('----------------------------------------------------------')

        xformname = my_path + '/testdata/newtests/reslice_transform.matr'
        xform = bis.bisLinearTransformation()
        xform.load(xformname)

        module = resliceImage.resliceImage()
        reference_image = images[0]
        target_image = images[1]
        true_image = images[2]

        module.execute(
            {
                'input': target_image,
                'reference': reference_image,
                'transform': xform
            }, {'debug': True})
        out_obj = module.getOutputObject('output')
        cc = np.corrcoef(images[2].get_data().flatten(),
                         out_obj.get_data().flatten())[0, 1]

        if cc > 0.999:
            testpass = True
        else:
            testpass = False

        print(
            '----------------------------------------------------------------------'
        )
        print('__ post module reslicing correlation out v true=', cc, 'pass='******'----------------------------------------------------------------------'
        )

        self.assertEqual(testpass, True)
예제 #4
0
    def test_bis_eigenutils(self):
        print('test_eigenUtils')

        m = np.identity(4, dtype=np.float32)
        for row in range(0, 4):
            for col in range(0, 4):
                m[row][col] = (1.0 + row) * 10.0 + col * col * 5.0

        xform = bis.bisLinearTransformation().create(m)
        print('First print to check ...\n', xform.get_data())

        vect = bis.bisVector().create(np.array([1, 2, 3, 5, 7, 11.0]))

        numfailed = libbiswasm.test_eigenUtils(xform, vect, 1)
        print('\t From JS to C++, numfailed=', numfailed)

        self.assertEqual(numfailed, 0)
예제 #5
0
def deserialize_object(ptr, datatype='', offset=0, first_input=0):

    if datatype == '':
        datatype = getNameFromMagicCode(magic_code)

    if datatype == 'String':
        output = bis.bisVector()
        output.deserializeWasm(ptr, offset)
        return output.getString()

    if datatype == 'Matrix':
        output = bis.bisMatrix()
        output.deserializeWasm(ptr, offset)
        return output.get_data()

    if datatype == 'Vector':
        output = bis.bisVector()
        output.deserializeWasm(ptr, offset)
        return output.get_data()

    if datatype == 'bisComboTransformation':
        output = bis.bisComboTransformation()
        output.deserializeWasm(ptr, offset)
        return output

    if datatype == 'bisGridTransformation':
        output = bis.bisGridTransformation()
        output.deserializeWasm(ptr, offset)
        return output

    if datatype == 'bisLinearTransformation':
        output = bis.bisLinearTransformation()
        output.deserializeWasm(ptr, offset)
        return output.get_data()

    if datatype != 'bisImage':
        raise ValueError('Unknown datatype ', datatype)

    # Image from here
    output = bis.bisImage()
    output.deserializeWasm(ptr, offset)
    if type(first_input) is bis.bisImage:
        output.affine = first_input.affine

    return output
예제 #6
0
def processTestResult(toolname, resultFile, test_target, test_type,
                      test_threshold, test_comparison):

    threshold = test_threshold
    if (threshold == None):
        threshold = 0.01

    comparison = test_comparison
    if (comparison == None):
        comparison = "maxabs"

    if (test_type == 'image'):
        if (comparison != "maxabs" and comparison != "ssd"):
            comparison = "cc"

    if (test_type == 'matrix' or test_type == "matrixtransform"
            or test_type == "gridtransform"):
        if (comparison != "maxabs"):
            comparison = "ssd"

    print(
        '====\n==================================================================\n===='
    )
    print('==== comparing ', test_type, ' using ', comparison,
          ' and threshold=', threshold, '.\n====')

    print('==== files=', resultFile, test_target)

    if (test_type == "image"):
        out = bis_objects.bisImage()
        if (out.load(resultFile) != False):
            gold = bis_objects.bisImage()
            if (gold.load(test_target) != False):
                diff = 0
                if (comparison == 'cc'):
                    diff = -computeCC(out.get_data(), gold.get_data())
                    threshold = -threshold
                elif comparison == 'ssd':
                    diff = computeNorm2(out.get_data(), gold.get_data())
                else:
                    diff = maxabsdiff(gold.get_data(), out.get_data())
                return printResult(diff, threshold, toolname, test_type)
            else:
                print('---- Failed to load gold standard image')
                return False
        else:
            print('---- Failed to load input image')
            return False

    elif (test_type == "matrix"):

        out = bis_objects.bisMatrix()
        if (out.load(resultFile) != False):
            gold = bis_objects.bisMatrix()
            if (gold.load(test_target) != False):
                print('out ', resultFile, ' dims=', out.data_array.shape)
                print('gold ', test_target, ' dims=', gold.data_array.shape)
                if (comparison == 'maxabs'):
                    diff = maxabsdiff(gold.data_array, out.data_array)
                else:
                    diff = computeNorm2(gold.data_array, out.data_array)
                return printResult(diff, threshold, toolname, test_type)
            else:
                return False
        else:
            return False

    elif (test_type == "matrixtransform"):

        out = bis_objects.bisLinearTransformation()
        if (out.load(resultFile) != False):
            gold = bis_objects.bisLinearTransformation()
            if (gold.load(test_target) != False):
                print('out ', resultFile, ' dims=', out.data_array.shape)
                print('gold ', test_target, ' dims=', gold.data_array.shape)
                if (comparison == 'maxabs'):
                    diff = maxabsdiff(gold.data_array, out.data_array)
                else:
                    diff = computeNorm2(gold.data_array, out.data_array)
                return printResult(diff, threshold, toolname, test_type)
            else:
                return False
        else:
            return False

    elif (test_type == "gridtransform"):

        out = bis_objects.bisComboTransformation()
        if (out.load(resultFile) != False):
            print('out ', resultFile, ' dims=', out.grids[0].data_array.shape)
            gold = bis_objects.bisComboTransformation()
            if (gold.load(test_target) != False):
                print('gold ', test_target, ' dims=',
                      gold.grids[0].data_array.shape)
                if (comparison == 'maxabs'):
                    diff = maxabsdiff(gold.grids[0].data_array,
                                      out.grids[0].data_array)
                else:
                    diff = computeNorm2(gold.grids[0].data_array,
                                        out.grids[0].data_array)
                return printResult(diff, threshold, toolname, test_type)
            else:
                return False
        else:
            return False

    print('---- Cannot compare type :', test_type)
    return False