X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=tools%2Fif2.cpp;h=b2105e28dc26fe6a0af5bb348bfa84f177f32192;hp=ce6d3da9505236577646a560e5fcdb8b7a97a46e;hb=8a7697ce57b56cdc43698cd1241ad98d49f9b5ac;hpb=b23f279cdf3c7b175d3683f059d5126deb465b0f diff --git a/tools/if2.cpp b/tools/if2.cpp index ce6d3da..b2105e2 100644 --- a/tools/if2.cpp +++ b/tools/if2.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: if2.cpp,v 1.2 2000/12/18 13:39:15 kevin Exp $ +** $Id$ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -29,13 +29,14 @@ #include "ct.h" #include "timer.h" -enum {O_ADD, O_SUB, O_MUL, O_COMP, O_ROW_PLOT, O_COLUMN_PLOT, O_VERBOSE, O_HELP, O_VERSION}; +enum {O_ADD, O_SUB, O_MUL, O_DIVIDE, O_COMP, O_ROW_PLOT, O_COLUMN_PLOT, O_VERBOSE, O_HELP, O_VERSION}; static struct option my_options[] = { {"add", 0, 0, O_ADD}, {"sub", 0, 0, O_SUB}, - {"mul", 0, 0, O_MUL}, + {"multiply", 0, 0, O_MUL}, + {"divide", 0, 0, O_DIVIDE}, {"comp", 0, 0, O_COMP}, {"column-plot", 1, 0, O_COLUMN_PLOT}, {"row-plot", 1, 0, O_ROW_PLOT}, @@ -45,7 +46,7 @@ static struct option my_options[] = {0, 0, 0, 0} }; -static const char* g_szIdStr = "$Id: if2.cpp,v 1.2 2000/12/18 13:39:15 kevin Exp $"; +static const char* g_szIdStr = "$Id$"; void if2_usage (const char *program) @@ -55,7 +56,7 @@ if2_usage (const char *program) std::cout << std::endl; std::cout << " infile1 Name of first input IF file\n"; std::cout << " infile2 Name of second input IF file\n"; - std::cout << " outfile Name of output IF file\n"; + std::cout << " outfile Name of output Image or Plot file\n"; std::cout << " --add Add images\n"; std::cout << " --sub Subtract image 2 from image 1\n"; std::cout << " --mul Multiply images\n"; @@ -75,48 +76,56 @@ if2_main (int argc, char *const argv[]) ImageFile* pim_out = NULL; std::string in_file1; std::string in_file2; - std::string out_file; + std::string strOutFile; int opt_verbose = 0; int opt_add = 0; int opt_sub = 0; int opt_mul = 0; + bool opt_divide = false; int opt_comp = 0; - bool opt_outputFile = false; + bool opt_bImageOutputFile = false; + bool opt_bPlotOutputFile = false; int opt_rowPlot = -1; int opt_columnPlot = -1; Timer timerProgram; - + while (1) { char* endptr; int c = getopt_long (argc, argv, "", my_options, NULL); - + if (c == -1) break; - + switch (c) { case O_ADD: opt_add = 1; - opt_outputFile = true; + opt_bImageOutputFile = true; break; case O_SUB : opt_sub = 1; - opt_outputFile = true; + opt_bImageOutputFile = true; break; case O_MUL: opt_mul = 1; - opt_outputFile = true; + opt_bImageOutputFile = true; + break; + case O_DIVIDE: + opt_divide = true; + opt_bImageOutputFile = true; break; case O_ROW_PLOT: opt_rowPlot = strtol(optarg, &endptr, 10); if (endptr != optarg + strlen(optarg)) { - if2_usage(argv[0]); + if2_usage(argv[0]); } + opt_bPlotOutputFile = true; break; case O_COLUMN_PLOT: opt_columnPlot = strtol(optarg, &endptr, 10); if (endptr != optarg + strlen(optarg)) { - if2_usage(argv[0]); + if2_usage(argv[0]); } + opt_bPlotOutputFile = true; break; case O_COMP: opt_comp = 1; @@ -140,89 +149,79 @@ if2_main (int argc, char *const argv[]) return (1); } } - - if (opt_outputFile && (optind + 3 != argc)) { + + if ((opt_bImageOutputFile || opt_bPlotOutputFile) && (optind + 3 != argc)) { if2_usage(argv[0]); return (1); } - else if (! opt_outputFile && optind + 2 != argc) { + else if (! (opt_bImageOutputFile || opt_bPlotOutputFile) && optind + 2 != argc) { if2_usage(argv[0]); return (1); } in_file1 = argv[optind]; in_file2 = argv[optind + 1]; - if (opt_outputFile) - out_file = argv[optind + 2]; - + if (opt_bImageOutputFile || opt_bPlotOutputFile) + strOutFile = argv[optind + 2]; + pim_in1 = new ImageFile (); pim_in2 = new ImageFile (); ImageFile& im_in1 = *pim_in1; ImageFile& im_in2 = *pim_in2; - + if (! im_in1.fileRead(in_file1) || ! im_in2.fileRead(in_file2)) { - sys_error (ERR_WARNING, "Error reading an image"); - return (1); + sys_error (ERR_WARNING, "Error reading an image"); + return (1); } - + if (im_in1.nx() != im_in2.nx() || im_in1.ny() != im_in2.ny()) { sys_error (ERR_SEVERE, "Error: Size of image 1 (%d,%d) and image 2 (%d,%d) do not match", - im_in1.nx(), im_in1.ny(), im_in2.nx(), im_in2.ny()); + im_in1.nx(), im_in1.ny(), im_in2.nx(), im_in2.ny()); return(1); } if (im_in1.nx() < 0 || im_in1.ny() < 0) { - sys_error (ERR_SEVERE, "Error: Size of image < 0"); - return(1); + sys_error (ERR_SEVERE, "Error: Size of image < 0"); + return(1); } - + ImageFileArray v1 = im_in1.getArray(); ImageFileArray v2 = im_in2.getArray(); ImageFileArray vout = NULL; - - if (opt_outputFile) { + + if (opt_bImageOutputFile && opt_bPlotOutputFile) { + sys_error (ERR_SEVERE, "Both Image and Plot output files can not be selected simultaneously"); + return (1); + } + if (opt_bImageOutputFile) { pim_out = new ImageFile (im_in1.nx(), im_in1.ny()); vout = pim_out->getArray(); } - + std::string strOperation; int nx = im_in1.nx(); int ny = im_in1.ny(); int nx2 = im_in2.nx(); int ny2 = im_in2.ny(); - + if (opt_add) { strOperation = "Add Images"; - for (int ix = 0; ix < nx; ix++) { - ImageFileColumn in1 = v1[ix]; - ImageFileColumn in2 = v2[ix]; - ImageFileColumn out = vout[ix]; - for (int iy = 0; iy < ny; iy++) - *out++ = *in1++ + *in2++; - } + im_in1.addImages (im_in2, *pim_out); } else if (opt_sub) { strOperation = "Subtract Images"; - for (int ix = 0; ix < nx; ix++) { - ImageFileColumn in1 = v1[ix]; - ImageFileColumn in2 = v2[ix]; - ImageFileColumn out = vout[ix]; - for (int iy = 0; iy < ny; iy++) - *out++ = *in1++ - *in2++; - } + im_in1.subtractImages (im_in2, *pim_out); } else if (opt_mul) { strOperation = "Multiply Images"; - for (int ix = 0; ix < nx; ix++) { - ImageFileColumn in1 = v1[ix]; - ImageFileColumn in2 = v2[ix]; - ImageFileColumn out = vout[ix]; - for (int iy = 0; iy < ny; iy++) - *out++ = *in1++ * *in2++; - } + im_in1.multiplyImages (im_in2, *pim_out); + } else if (opt_divide) { + strOperation = "Divide Images"; + im_in1.divideImages (im_in2, *pim_out); } if (opt_comp) { double d, r, e; im_in1.comparativeStatistics (im_in2, d, r, e); std::cout << "d=" << d << ", r=" << r << ", e=" << e << std::endl; - } + } + int i; if (opt_columnPlot > 0) { if (opt_columnPlot >= nx || opt_columnPlot >= nx2) { @@ -232,71 +231,76 @@ if2_main (int argc, char *const argv[]) double* plot_xaxis = new double [nx]; for (i = 0; i < nx; i++) plot_xaxis[i] = i; -#if HAVE_SGP - SGPDriver driver ("Column Plot"); - SGP sgp (driver); - EZPlot ezplot (sgp); - ezplot.ezset ("clear."); - ezplot.ezset ("xticks major 5."); - ezplot.ezset ("xlabel Column"); - ezplot.ezset ("title Column Plot"); - ezplot.ezset ("ylabel Pixel"); - ezplot.ezset ("box."); - ezplot.ezset ("grid."); - ezplot.addCurve (plot_xaxis, v1[opt_columnPlot], im_in1.ny()); - ezplot.addCurve (plot_xaxis, v2[opt_columnPlot], im_in2.ny()); - ezplot.plot(); - std::cout << "Press enter to continue" << flush; - cio_kb_getc(); -#endif - delete plot_xaxis; - } + + PlotFile plotFile (3, nx); + + plotFile.addColumn (0, plot_xaxis); + plotFile.addColumn (1, v1[opt_columnPlot]); + plotFile.addColumn (2, v2[opt_columnPlot]); + std::ostringstream os; + os << "Column " << opt_columnPlot << " Comparison"; + plotFile.addDescription (os.str().c_str()); + std::string title("title "); + title += os.str(); + plotFile.addEzsetCommand (title.c_str()); + plotFile.addEzsetCommand ("xlabel Column"); + plotFile.addEzsetCommand ("ylabel Pixel Value"); + plotFile.addEzsetCommand ("box"); + plotFile.addEzsetCommand ("grid"); + plotFile.addEzsetCommand ("xticks major 5"); + plotFile.fileWrite (strOutFile.c_str()); + + delete plot_xaxis; + } + if (opt_rowPlot > 0) { if (opt_rowPlot >= ny || opt_rowPlot >= ny2) { sys_error (ERR_SEVERE, "row_plot > ny"); return (1); } double* plot_xaxis = new double [ny]; - double* v1Row = new double [nx]; - double* v2Row = new double [nx2]; - + double* v1Row = new double [ny]; + double* v2Row = new double [ny2]; + for (i = 0; i < ny; i++) plot_xaxis[i] = i; - for (i = 0; i < nx; i++) + for (i = 0; i < ny; i++) v1Row[i] = v1[i][opt_rowPlot]; - for (i = 0; i < nx2; i++) + for (i = 0; i < ny2; i++) v2Row[i] = v2[i][opt_rowPlot]; - -#if HAVE_SGP - SGPDriver driver ("Row Plot"); - SGP sgp (driver); - EZPlot ezplot (sgp); - ezplot.ezset ("clear."); - ezplot.ezset ("xticks major 5."); - ezplot.ezset ("title Row Plot"); - ezplot.ezset ("xlabel Row"); - ezplot.ezset ("ylabel Pixel"); - ezplot.ezset ("box."); - ezplot.ezset ("grid."); - ezplot.addCurve (plot_xaxis, v1Row, im_in1.nx()); - ezplot.addCurve (plot_xaxis, v2Row, im_in2.nx()); - ezplot.plot(); - std::cout << "Press enter to continue" << flush; - cio_kb_getc(); -#endif - delete plot_xaxis; - delete v1Row; - delete v2Row; + + PlotFile plotFile (3, ny); + + plotFile.addColumn (0, plot_xaxis); + plotFile.addColumn (1, v1Row); + plotFile.addColumn (2, v2Row); + std::ostringstream os; + os << "Row " << opt_rowPlot << " Comparison"; + plotFile.addDescription (os.str().c_str()); + std::string title("title "); + title += os.str(); + plotFile.addEzsetCommand (title.c_str()); + plotFile.addEzsetCommand ("xlabel Row"); + plotFile.addEzsetCommand ("ylabel Pixel Value"); + plotFile.addEzsetCommand ("box"); + plotFile.addEzsetCommand ("grid"); + plotFile.addEzsetCommand ("xticks major 5"); + + plotFile.fileWrite (strOutFile.c_str()); + + delete plot_xaxis; + delete v1Row; + delete v2Row; } - - if (opt_outputFile) { + + if (opt_bImageOutputFile) { pim_out->labelsCopy (im_in1, "if2 file 1: "); pim_out->labelsCopy (im_in2, "if2 file 2: "); pim_out->labelAdd (Array2dFileLabel::L_HISTORY, strOperation.c_str(), timerProgram.timerEnd()); - pim_out->fileWrite(out_file); + pim_out->fileWrite (strOutFile); } - + return (0); } @@ -305,7 +309,7 @@ int main (int argc, char *const argv[]) { int retval = 1; - + try { retval = if2_main(argc, argv); } catch (exception e) { @@ -313,7 +317,7 @@ main (int argc, char *const argv[]) } catch (...) { std::cerr << "Unknown exception\n"; } - + return (retval); } #endif