/*---------------------------------------------------------------------------*/ /* Program: extract.c */ /* */ /* Purpose: This program extracts subimages of KUIM format images. */ /* The desired image range to be extracted is specified using */ /* -x -y and -z switches (instead of the old -d method). */ /* */ /* Author: John Gauch / Chunyen Liu */ /* */ /* Date: April 4, 1996 */ /* */ /* Note: Copyright (C) The University of Kansas, 1996 */ /*---------------------------------------------------------------------------*/ #include #include /* Image variables */ char Name1[50]; char Name2[50]; IM_TYPE *Image1; IM_TYPE *Image2; int PixType, Xdim, Ydim, Zdim, DimCnt; /* Program variables */ int LowX = 0, HighX = 0; int LowY = 0, HighY = 0; int LowZ = 0, HighZ = 0; int ChangeX = FALSE; int ChangeY = FALSE; int ChangeZ = FALSE; int Debug = FALSE; /*---------------------------------------------------------------------------*/ /* Purpose: This routine handles color images. */ /*---------------------------------------------------------------------------*/ void ColorExtract() { COLOR_TYPE *Data0; COLOR_TYPE *Data1; COLOR_TYPE **Data2; COLOR_TYPE ***Data3; int i, x, y, z; /* Handle 1D images */ if (DimCnt == 1) { Image2 = im_create(Name2, PixType, Xdim, 1, 1); Data0 = (COLOR_TYPE *) im_alloc1D(Image2, COLOR); Data1 = (COLOR_TYPE *) im_alloc1D(Image1, COLOR); im_read(Image1, COLOR, (char *) Data1); i = 0; for (x = 0; x < Xdim; x++) Data0[i++] = Data1[LowX + x]; im_free1D((char *) Data1); } /* Handle 2D images */ else if (DimCnt == 2) { if (Xdim == 1) Image2 = im_create(Name2, PixType, Ydim, 1, 1); else Image2 = im_create(Name2, PixType, Xdim, Ydim, 1); Data0 = (COLOR_TYPE *) im_alloc1D(Image2, COLOR); Data2 = (COLOR_TYPE **) im_alloc2D(Image1, COLOR); im_read(Image1, COLOR, (char *) &(Data2[0][0])); i = 0; for (y = 0; y < Ydim; y++) for (x = 0; x < Xdim; x++) Data0[i++] = Data2[LowY + y][LowX + x]; im_free2D((char **) Data2); } /* Handle 3D images */ else if (DimCnt == 3) { if ((Xdim == 1) && (Ydim == 1)) Image2 = im_create(Name2, PixType, Zdim, 1, 1); else if (Xdim == 1) Image2 = im_create(Name2, PixType, Ydim, Zdim, 1); else if (Ydim == 1) Image2 = im_create(Name2, PixType, Xdim, Zdim, 1); else Image2 = im_create(Name2, PixType, Xdim, Ydim, Zdim); Data0 = (COLOR_TYPE *) im_alloc1D(Image2, COLOR); Data3 = (COLOR_TYPE ***) im_alloc3D(Image1, COLOR); im_read(Image1, COLOR, (char *) &(Data3[0][0][0])); i = 0; for (z = 0; z < Zdim; z++) for (y = 0; y < Ydim; y++) for (x = 0; x < Xdim; x++) Data0[i++] = Data3[LowZ + z][LowY + y][LowX + x]; im_free3D((char ***) Data3); } /* Write image data */ im_write(Image2, COLOR, (char *) Data0); im_free1D((char *) Data0); } /*---------------------------------------------------------------------------*/ /* Purpose: This routine handles scalar images. */ /*---------------------------------------------------------------------------*/ void FloatExtract() { FLOAT_TYPE *Data0; FLOAT_TYPE *Data1; FLOAT_TYPE **Data2; FLOAT_TYPE ***Data3; int i, x, y, z; /* Handle 1D images */ if (DimCnt == 1) { Image2 = im_create(Name2, PixType, Xdim, 1, 1); Data0 = (FLOAT_TYPE *) im_alloc1D(Image2, FLOAT); Data1 = (FLOAT_TYPE *) im_alloc1D(Image1, FLOAT); im_read(Image1, FLOAT, (char *) Data1); i = 0; for (x = 0; x < Xdim; x++) Data0[i++] = Data1[LowX + x]; im_free1D((char *) Data1); } /* Handle 2D images */ else if (DimCnt == 2) { if (Xdim == 1) Image2 = im_create(Name2, PixType, Ydim, 1, 1); else Image2 = im_create(Name2, PixType, Xdim, Ydim, 1); Data0 = (FLOAT_TYPE *) im_alloc1D(Image2, FLOAT); Data2 = (FLOAT_TYPE **) im_alloc2D(Image1, FLOAT); im_read(Image1, FLOAT, (char *) &(Data2[0][0])); i = 0; for (y = 0; y < Ydim; y++) for (x = 0; x < Xdim; x++) Data0[i++] = Data2[LowY + y][LowX + x]; im_free2D((char **) Data2); } /* Handle 3D images */ else if (DimCnt == 3) { if ((Xdim == 1) && (Ydim == 1)) Image2 = im_create(Name2, PixType, Zdim, 1, 1); else if (Xdim == 1) Image2 = im_create(Name2, PixType, Ydim, Zdim, 1); else if (Ydim == 1) Image2 = im_create(Name2, PixType, Xdim, Zdim, 1); else Image2 = im_create(Name2, PixType, Xdim, Ydim, Zdim); Data0 = (FLOAT_TYPE *) im_alloc1D(Image2, FLOAT); Data3 = (FLOAT_TYPE ***) im_alloc3D(Image1, FLOAT); im_read(Image1, FLOAT, (char *) &(Data3[0][0][0])); i = 0; for (z = 0; z < Zdim; z++) for (y = 0; y < Ydim; y++) for (x = 0; x < Xdim; x++) Data0[i++] = Data3[LowZ + z][LowY + y][LowX + x]; im_free3D((char ***) Data3); } /* Write image data */ im_write(Image2, FLOAT, (char *) Data0); im_free1D((char *) Data0); } /*---------------------------------------------------------------------------*/ /* Purpose: This is the main program. */ /*---------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { int i = 0; int Square = FALSE, CenterX, CenterY, SideLength; /* Interpret program options */ printf("EXTRACT Program - KUIM Version 2.0\n\n"); while ((++i < argc) && (argv[i][0] == '-')) switch (argv[i][1]) { case 'r': Square = TRUE; CenterX = rand() % 300 + 100; CenterY = rand() % 300 + 100; if (sscanf(argv[++i], "%d", &SideLength) == 0) Error("Could not get side length"); break; case 's': Square = TRUE; if (sscanf(argv[++i], "%d", &CenterX) == 0) Error("Could not get center X value"); if (sscanf(argv[++i], "%d", &CenterY) == 0) Error("Could not get center Y value"); if (sscanf(argv[++i], "%d", &SideLength) == 0) Error("Could not get side length"); break; case 'x': ChangeX = TRUE; if (sscanf(argv[++i], "%d", &LowX) == 0) Error("Could not get low X value"); if (sscanf(argv[++i], "%d", &HighX) == 0) Error("Could not get high X value"); break; case 'y': ChangeY = TRUE; if (sscanf(argv[++i], "%d", &LowY) == 0) Error("Could not get low Y value"); if (sscanf(argv[++i], "%d", &HighY) == 0) Error("Could not get high Y value"); break; case 'z': ChangeZ = TRUE; if (sscanf(argv[++i], "%d", &LowZ) == 0) Error("Could not get low Z value"); if (sscanf(argv[++i], "%d", &HighZ) == 0) Error("Could not get high Z value"); break; case 'd': Debug = TRUE; break; default: Error("Invalid option encountered"); break; } /* Check number of file names */ if (argc - i != 2) { fprintf(stderr, "Usage: extract [options] infile outfile\n"); fprintf(stderr, " [-r width] Random extract size\n"); fprintf(stderr, " [-s cx cy width] Center and width of square\n"); fprintf(stderr, " [-x xl xh] Range of X values\n"); fprintf(stderr, " [-y yl yh] Range of Y values\n"); fprintf(stderr, " [-z zl zh] Range of Z values\n"); fprintf(stderr, " [-d] Print debugging information\n"); exit(1); } /* Get image file names from argument list */ if (sscanf(argv[i++], "%s", Name1) == 0) Error("Could not get input file name"); if (sscanf(argv[i++], "%s", Name2) == 0) Error("Could not get output file name"); /* Read input image */ Image1 = im_open(Name1, &PixType, &Xdim, &Ydim, &Zdim, &DimCnt); /* Check parameters */ if ((ChangeX == FALSE) && (ChangeY == FALSE) && (ChangeZ == FALSE) && (Square == FALSE)) Error("No subrange specified"); if ((LowX < 0) || (LowX > HighX) || (HighX >= Xdim)) Error("Invalid X range specified"); if ((LowY < 0) || (LowY > HighY) || (HighY >= Ydim)) Error("Invalid Y range specified"); if ((LowZ < 0) || (LowZ > HighZ) || (HighZ >= Zdim)) Error("Invalid Z range specified"); if (Square == TRUE) { Xdim = Ydim = SideLength; LowX = CenterX - (int) (SideLength / 2); LowY = CenterY - (int) (SideLength / 2); HighX = CenterX + (int) (SideLength / 2) - 1; HighY = CenterY + (int) (SideLength / 2) - 1; } if (ChangeX == TRUE) Xdim = HighX - LowX + 1; if (ChangeY == TRUE) Ydim = HighY - LowY + 1; if (ChangeZ == TRUE) Zdim = HighZ - LowZ + 1; if ((Xdim == 1) && (Ydim == 1) && (Zdim == 1)) Error("Can not create zero dimensional image"); /* Perform extraction */ if (PixType == COLOR || PixType == PSEUDO || PixType == JPEG_RGB) ColorExtract(); else FloatExtract(); return (0); }