/* * The Npic library and tools * * Copyright (C) 2003 Edouard Thiel * * This program is free software under the terms of the * GNU Lesser General Public License (LGPL) version 2.1. */ /* * npic-wdt.c - 11/09/2008 * */ #include void ShowUsage () { printf ( "npic-wdt - Compute Weighted Distance Transforms (a.k.a. chamfer DT).\n" "Usage:\n" " npic-wdt -h | -help | --help : print help\n" " npic-wdt what mask in1 out1 : compute distance transforms\n" "\n" "what: -dt : compute WDT\n" " -idt : idem with infinite borders\n" " -rdt : compute reverse WDT\n" "\n" "mask : mask file in " NPIC_KNOWN_MASK_EXT " format (see npic-mask -h)\n" "in1, out1 : image in " NPIC_KNOWN_IMAGE_EXT " format\n" ); } void ArgcExit (int argc, int n) { if (argc < n) { fprintf (stderr, "ERROR: %d argument(s) missing, " "type \"npic-wdt -h\" to get help.\n", n-argc); exit (1); } } int main (int argc, char *argv[]) { char *in1, *out1, *what, *mask; enum { E_DT, E_IDT, E_RDT} what_e; char *what_s[] = { "WDT", "WDT_inf", "WDT_rev" }; Npic_image *np1; Npic_mask *m1; double t = 0; int ty1, ty2; ArgcExit (argc, 2); if (strcmp (argv[1], "-h") == 0 || strcmp (argv[1], "-help") == 0 || strcmp (argv[1], "--help") == 0) { ShowUsage (); exit (0); } ArgcExit (argc, 5); what = argv[1]; mask = argv[2]; in1 = argv[3]; out1 = argv[4]; if (!strcmp (what, "-dt" )) what_e = E_DT; else if (!strcmp (what, "-idt")) what_e = E_IDT; else if (!strcmp (what, "-rdt")) what_e = E_RDT; else { fprintf (stderr, "ERROR: bad option \"%s\"\n", what); exit (1); } printf ("Loading distance mask \"%s\"\n", mask); m1 = NpicReadDistanceMask (mask); if (m1 == NULL) exit (1); printf ("Number of mask vectors: %d\n", m1->gen.nb); printf ("Loading image \"%s\"\n", in1); np1 = NpicReadImage (in1); if (np1 == NULL) exit (1); /* Convert image type if necessary */ ty1 = NpicImagePixelType (np1->type); ty2 = NpicMaskPixelType (m1->type); if (ty1 == NPIC_C && ty2 == NPIC_L) NpicConvertImage_l (np1); else if (ty1 != ty2) NpicConvertImage_d (np1); printf ("Computing %s ... ", what_s[what_e]); fflush (stdout); switch (what_e) { case E_DT : t = NpicWDT (np1, m1); break; case E_IDT : t = NpicWDT_inf (np1, m1); break; case E_RDT : t = NpicWDT_rev (np1, m1); break; } printf ("time: %.6f s\n", t); printf ("Saving image \"%s\"\n", out1); if (NpicWriteImage (np1, out1) != NPIC_SUCCESS) exit(1); NpicDestroyImage (np1); NpicDestroyMask (m1); exit (0); }