Exemplo n.º 1
0
def main():
    """Command line call argument parsing."""
    parser = argparse.ArgumentParser()
    parser.add_argument('infile', metavar='path', help="Path to input nifti.")

    parser.add_argument("--outfile",
                        metavar='path',
                        required=False,
                        help="If not provided adds '_defaced' suffix.")

    parser.add_argument("--force",
                        action='store_true',
                        help="Force to rewrite the output even if it exists.")

    parser.add_argument(
        '--applyto',
        nargs='+',
        required=False,
        metavar='',
        help="Apply the created face mask to other images. Can take multiple "
        "arguments.")

    parser.add_argument(
        "--cost",
        metavar='mutualinfo',
        required=False,
        default='mutualinfo',
        help="FSL-FLIRT cost function. Default is 'mutualinfo'.")

    parser.add_argument(
        "--template",
        metavar='path',
        required=False,
        help=("Optional template image that will be used as the registration "
              "target instead of the default."))

    parser.add_argument(
        "--facemask",
        metavar='path',
        required=False,
        help="Optional face mask image that will be used instead of the "
        "default.")

    parser.add_argument("--nocleanup",
                        action='store_true',
                        help="Do not cleanup temporary files. Off by default.")

    parser.add_argument("--verbose",
                        action='store_true',
                        help="Show additional status prints. Off by default.")

    parser.add_argument('--debug',
                        action='store_true',
                        dest='debug',
                        help='Do not catch exceptions and show exception '
                        'traceback (Drop into pdb debugger).')

    welcome_str = 'pydeface ' + require("pydeface")[0].version
    welcome_decor = '-' * len(welcome_str)
    print(welcome_decor + '\n' + welcome_str + '\n' + welcome_decor)

    args = parser.parse_args()
    if args.debug:
        setup_exceptionhook()

    warped_mask_img, warped_mask, template_reg, template_reg_mat =\
        pdu.deface_image(**vars(args))

    # apply mask to other given images
    if args.applyto is not None:
        print("Defacing mask also applied to:")
        for applyfile in args.applyto:
            applyfile_img = load(applyfile)
            outdata = applyfile_img.get_data() * warped_mask_img.get_data()
            applyfile_img = Nifti1Image(outdata, applyfile_img.get_affine(),
                                        applyfile_img.get_header())
            outfile = pdu.output_checks(applyfile)
            applyfile_img.to_filename(outfile)
            print('  %s' % applyfile)

    if not args.nocleanup:
        pdu.cleanup_files(warped_mask, template_reg, template_reg_mat)

    print('Finished.')
Exemplo n.º 2
0
def main():
    """Command line call argument parsing."""
    parser = argparse.ArgumentParser()
    parser.add_argument('infile', metavar='path', help="Path to input nifti.")

    parser.add_argument("--outfile",
                        metavar='path',
                        required=False,
                        help="If not provided adds '_defaced' suffix.")

    parser.add_argument("--force",
                        action='store_true',
                        help="Force to rewrite the output even if it exists.")

    parser.add_argument(
        '--applyto',
        nargs='+',
        required=False,
        metavar='',
        help="Apply the created face mask to other images. Can take multiple "
        "arguments.")

    parser.add_argument(
        "--cost",
        metavar='mutualinfo',
        required=False,
        default='mutualinfo',
        help="FSL-FLIRT cost function. Default is 'mutualinfo'.")

    parser.add_argument(
        "--template",
        metavar='path',
        required=False,
        help=("Optional template image that will be used as the registration "
              "target instead of the default."))

    parser.add_argument(
        "--facemask",
        metavar='path',
        required=False,
        help="Optional face mask image that will be used instead of the "
        "default.")

    parser.add_argument("--nocleanup",
                        action='store_true',
                        help="Do not cleanup temporary files. Off by default.")

    parser.add_argument("--verbose",
                        action='store_true',
                        help="Show additional status prints. Off by default.")

    welcome_str = 'pydeface ' + require("pydeface")[0].version
    welcome_decor = '-' * len(welcome_str)
    print(welcome_decor + '\n' + welcome_str + '\n' + welcome_decor)

    args = parser.parse_args()
    template, facemask = initial_checks(args.template, args.facemask)
    infile = args.infile
    outfile = output_checks(infile, args.outfile, args.force)

    # temporary files
    _, tmpmat = tempfile.mkstemp()
    tmpmat = tmpmat + '.mat'
    _, tmpfile = tempfile.mkstemp()
    tmpfile = tmpfile + '.nii.gz'
    if args.verbose:
        print("Temporary files:\n  %s\n  %s" % (tmpmat, tmpfile))
    _, tmpfile2 = tempfile.mkstemp()
    _, tmpmat2 = tempfile.mkstemp()

    print('Defacing...\n  %s' % args.infile)

    # register template to infile
    flirt = fsl.FLIRT()
    flirt.inputs.cost_func = args.cost
    flirt.inputs.in_file = template
    flirt.inputs.out_matrix_file = tmpmat
    flirt.inputs.out_file = tmpfile2
    flirt.inputs.reference = infile
    flirt.run()

    # warp facemask to infile
    flirt = fsl.FLIRT()
    flirt.inputs.in_file = facemask
    flirt.inputs.in_matrix_file = tmpmat
    flirt.inputs.apply_xfm = True
    flirt.inputs.reference = infile
    flirt.inputs.out_file = tmpfile
    flirt.inputs.out_matrix_file = tmpmat2
    flirt.run()

    # multiply mask by infile and save
    infile_img = load(infile)
    tmpfile_img = load(tmpfile)
    try:
        outdata = infile_img.get_data().squeeze() * tmpfile_img.get_data()
    except ValueError:
        tmpdata = np.stack([tmpfile_img.get_data()] *
                           infile_img.get_data().shape[-1],
                           axis=-1)
        outdata = infile_img.get_data() * tmpdata

    outfile_img = Nifti1Image(outdata, infile_img.get_affine(),
                              infile_img.get_header())
    outfile_img.to_filename(outfile)
    print("Defaced image saved as:\n  %s" % outfile)

    # apply mask to other given images
    if args.applyto is not None:
        print("Defacing mask also applied to:")
        for applyfile in args.applyto:
            applyfile_img = load(applyfile)
            outdata = applyfile_img.get_data() * tmpfile_img.get_data()
            applyfile_img = Nifti1Image(outdata, applyfile_img.get_affine(),
                                        applyfile_img.get_header())
            outfile = output_checks(applyfile)
            applyfile_img.to_filename(outfile)
            print('  %s' % applyfile)

    if args.nocleanup:
        pass
    else:
        os.remove(tmpfile)
        os.remove(tmpfile2)
        os.remove(tmpmat)

    print('Finished.')