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.')
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.')