/*---------------------------------------------------------------------------*/ /* Program: add.c */ /* */ /* Purpose: This program adds (or subtracts) two images in KUIM format. */ /* */ /* Author: John Gauch, Edu Metz */ /* */ /* Date: March 29, 1994 - Original program. */ /* July 23, 1996 - Color support added. */ /* */ /* Note: Copyright (C) The University of Kansas, 1994-1996 */ /*---------------------------------------------------------------------------*/ #include /* Program parameters */ int Debug = FALSE; float A = 1.0; float B = -1.0; /* Image variables */ char Name1[50]; char Name2[50]; char Name3[50]; IM_TYPE *Image1; IM_TYPE *Image2; IM_TYPE *Image3; int PixType, Xdim, Ydim, Zdim, DimCnt; /*---------------------------------------------------------------------------*/ /* Purpose: This routine adds two grey images. */ /*---------------------------------------------------------------------------*/ void GreyAdd() { FLOAT_TYPE *Data1; FLOAT_TYPE *Data2; FLOAT_TYPE *Data3; int i, Count; /* Read input image1 */ Data1 = (FLOAT_TYPE *) im_alloc1D(Image1, FLOAT); im_read(Image1, FLOAT, (char *) Data1); /* Read input image2 */ Data2 = (FLOAT_TYPE *) im_alloc1D(Image2, FLOAT); im_read(Image2, FLOAT, (char *) Data2); /* Create output image */ Image3 = im_create(Name3, PixType, Xdim, Ydim, Zdim); Data3 = (FLOAT_TYPE *) im_alloc1D(Image3, FLOAT); /* Add images together */ if (Debug == TRUE) printf("A = %f, B = %f\n", A, B); Count = Xdim * Ydim * Zdim; for (i = 0; i < Count; i++) Data3[i] = A * Data1[i] + B * Data2[i]; /* Write information to output image */ im_write(Image3, FLOAT, (char *) Data3); im_free1D((char *) Data1); im_free1D((char *) Data2); im_free1D((char *) Data3); } /*---------------------------------------------------------------------------*/ /* Purpose: This routine adds two color images. */ /*---------------------------------------------------------------------------*/ void ColorAdd() { COLOR_TYPE *Data1; COLOR_TYPE *Data2; COLOR_TYPE *Data3; int i, Count, Temp; /* Read input image1 */ Data1 = (COLOR_TYPE *) im_alloc1D(Image1, COLOR); im_read(Image1, COLOR, (char *) Data1); /* Read input image2 */ Data2 = (COLOR_TYPE *) im_alloc1D(Image2, COLOR); im_read(Image2, COLOR, (char *) Data2); /* Create output image */ Image3 = im_create(Name3, PixType, Xdim, Ydim, Zdim); Data3 = (COLOR_TYPE *) im_alloc1D(Image3, COLOR); /* Add images together */ if (Debug == TRUE) printf("A = %f, B = %f\n", A, B); Count = Xdim * Ydim * Zdim; for (i = 0; i < Count; i++) { Temp = (int) (A * Data1[i].r + B * Data2[i].r); if (Temp < 0) Temp = 0; else if (Temp > 255) Temp = 255; Data3[i].r = Temp; Temp = (int) (A * Data1[i].g + B * Data2[i].g); if (Temp < 0) Temp = 0; else if (Temp > 255) Temp = 255; Data3[i].g = Temp; Temp = (int) (A * Data1[i].b + B * Data2[i].b); if (Temp < 0) Temp = 0; else if (Temp > 255) Temp = 255; Data3[i].b = Temp; } /* Write information to output image */ im_write(Image3, COLOR, (char *) Data3); im_free1D((char *) Data1); im_free1D((char *) Data2); im_free1D((char *) Data3); } /*---------------------------------------------------------------------------*/ /* Purpose: This is the main program. */ /*---------------------------------------------------------------------------*/ main(int argc, char *argv[]) { /* Program variables */ int i = 0; int PixType2, Xdim2, Ydim2, Zdim2; /* Interpret program options */ printf("ADD Program - KUIM Version 2.0\n\n"); while ((++i < argc) && (argv[i][0] == '-')) switch (argv[i][1]) { case 'd': Debug = TRUE; break; case 'a': if (sscanf(argv[++i], "%f", &A) == 0) Error("Could not get A argument"); break; case 'b': if (sscanf(argv[++i], "%f", &B) == 0) Error("Could not get A argument"); break; default: Error("Invalid option encountered"); break; } /* Check number of file names */ if (argc - i != 3) { fprintf(stderr, "Usage: add [options] infile1 infile2 outfile\n"); fprintf(stderr, " [-d] Print debugging information\n"); fprintf(stderr, " [-a #] First image weight (1)\n"); fprintf(stderr, " [-b #] Second image weight (-1)\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 input file name"); if (sscanf(argv[i++], "%s", Name3) == 0) Error("Could not get output file name"); /* Read PixType of image1 and image2 */ Image1 = im_open(Name1, &PixType, &Xdim, &Ydim, &Zdim, &DimCnt); Image2 = im_open(Name2, &PixType2, &Xdim2, &Ydim2, &Zdim2, &DimCnt); if ((Xdim != Xdim2) || (Ydim != Ydim2) || (Zdim != Zdim2)) Error("Image dimensions do not match"); /* Process input images */ if (PixType == COLOR || PixType == PSEUDO || PixType == JPEG_RGB) ColorAdd(); else GreyAdd(); return (0); }