def main():
    args = getArguments(getParser())

    # prepare logger
    logger = Logger.getInstance()
    if args.debug: logger.setLevel(logging.DEBUG)
    elif args.verbose: logger.setLevel(logging.INFO)
    
    # loading input images (as image, header pairs)
    images = []
    headers = []
    for image_name in args.images:
        i, h = load(image_name)
        images.append(i)
        headers.append(h)
    
    # loading binary foreground masks if supplied, else create masks from threshold value
    if args.masks:
        masks = [load(mask_name)[0].astype(numpy.bool) for mask_name in args.masks]
    else:
        masks = [i > args.threshold for i in images]
    
    # if in application mode, load the supplied model and apply it to the images
    if args.lmodel:
        logger.info('Loading the model and transforming images...')
        with open(args.lmodel, 'r') as f:
            trained_model = pickle.load(f)
            if not isinstance(trained_model, IntensityRangeStandardization):
                raise ArgumentError('{} does not seem to be a valid pickled instance of an IntensityRangeStandardization object'.format(args.lmodel))
            transformed_images = [trained_model.transform(i[m], surpress_mapping_check = args.ignore) for i, m in zip(images, masks)]
            
    # in in training mode, train the model, apply it to the images and save it
    else:
        logger.info('Training the average intensity model...')
        irs = IntensityRangeStandardization()
        trained_model, transformed_images = irs.train_transform([i[m] for i, m in zip(images, masks)], surpress_mapping_check = args.ignore)
        logger.info('Saving the trained model as {}...'.format(args.smodel))
        with open(args.smodel, 'wb') as f:
                pickle.dump(trained_model, f)
                
    # save the transformed images
    if args.simages:
        logger.info('Saving intensity transformed images to {}...'.format(args.simages))
        for ti, i, m, h, image_name in zip(transformed_images, images, masks, headers, args.images):
            i[m] = ti
            save(i, '{}/{}'.format(args.simages, image_name.split('/')[-1]), h, args.force)
    
    logger.info('Terminated.')
 def test_Method(self):
     """Test the normal functioning of the method."""
     # test training with good and bad images
     irs = IntensityRangeStandardization()
     irs.train(TestIntensityRangeStandardization.good_trainingset + [TestIntensityRangeStandardization.bad_image])
     irs.transform(TestIntensityRangeStandardization.bad_image)
     
     # test equal methods
     irs = IntensityRangeStandardization()
     irs_ = irs.train(TestIntensityRangeStandardization.good_trainingset)
     self.assertEqual(irs, irs_)
     
     irs = IntensityRangeStandardization()
     irs.train(TestIntensityRangeStandardization.good_trainingset)
     timages = []
     for i in TestIntensityRangeStandardization.good_trainingset:
         timages.append(irs.transform(i))
         
     irs = IntensityRangeStandardization()
     irs_, timages_ = irs.train_transform(TestIntensityRangeStandardization.good_trainingset)
     
     self.assertEqual(irs, irs_, 'instance returned by transform() method is not the same as the once initialized')
     for ti, ti_ in zip(timages, timages_):
         numpy.testing.assert_allclose(ti, ti_, err_msg = 'train_transform() failed to produce the same results as transform()')
         
     
     # test pickling
     irs = IntensityRangeStandardization()
     irs_ = irs.train(TestIntensityRangeStandardization.good_trainingset)
     timages = []
     for i in TestIntensityRangeStandardization.good_trainingset:
         timages.append(irs.transform(i))
         
     with tempfile.TemporaryFile() as f:
         pickle.dump(irs, f)
         f.seek(0, 0)
         irs_ = pickle.load(f)
         
     timages_ = []
     for i in TestIntensityRangeStandardization.good_trainingset:
         timages_.append(irs_.transform(i))
         
     for ti, ti_ in zip(timages, timages_):
         numpy.testing.assert_allclose(ti, ti_, err_msg = 'pickling failed to preserve the instances model')