/*---------------------------------------------------------------------------*/ /* Program: header.c */ /* */ /* Purpose: This program reads the header from an image in KUIM format */ /* and prints this information. */ /* */ /* Author: John Gauch */ /* */ /* Date: March 23, 1994 */ /* */ /* Note: Copyright (C) The University of Kansas, 1994 */ /*---------------------------------------------------------------------------*/ #include /*---------------------------------------------------------------------------*/ /* Purpose: This is the main program. */ /*---------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { /* Image variables */ char Name1[50]; IM_TYPE *Image1; INT_TYPE *Data1; INT_TYPE *Histo; FLOAT_TYPE *Data2; int PixType, Xdim, Ydim, Zdim, DimCnt; char Title[nTITLE]; /* Program variables */ int Debug = FALSE; int i = 0; int Count; int Min1, Max1; float Min2, Max2; double Prob, Entropy; float Ave, Ave2, Var; /* Interpret program options */ printf("HEADER Program - KUIM Version 1.0\n\n"); while ((++i < argc) && (argv[i][0] == '-')) switch (argv[i][1]) { case 'd': Debug = TRUE; break; default: Error("Invalid option encountered"); break; } /* Check number of file names */ if (argc - i != 1) { fprintf(stderr, "Usage: header [options] infile\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"); /* Read input image */ Image1 = im_open(Name1, &PixType, &Xdim, &Ydim, &Zdim, &DimCnt); printf("Image Name = %s\n", Name1); /* Print image dimension information */ if (DimCnt == 0) printf("Image is zero dimensional\n"); else if (DimCnt == 1) printf("Image Dimensions = %d\n", Xdim); else if (DimCnt == 2) printf("Image Dimensions = %d,%d\n", Xdim, Ydim); else if (DimCnt == 3) printf("Image Dimensions = %d,%d,%d\n", Xdim, Ydim, Zdim); /* Print pixel type information */ switch (PixType) { case BYTE: printf("Image Type = BYTE\n"); break; case SHORT: printf("Image Type = SHORT\n"); break; case INT: printf("Image Type = INT\n"); break; case FLOAT: printf("Image Type = FLOAT\n"); break; case DOUBLE: printf("Image Type = DOUBLE\n"); break; case COMPLEX: printf("Image Type = COMPLEX\n"); break; case COLOR: printf("Image Type = COLOR\n"); break; case PSEUDO: printf("Image Type = PSEUDO\n"); break; case JPEG_GRAY: printf("Image Type = JPEG_GRAY\n"); break; case JPEG_RGB: printf("Image Type = JPEG_RGB\n"); break; default: Error("Invalid image type"); } /* Print image title */ im_get_title(Image1, Title); if (strlen(Title) > 0) printf("Image Title = '%s'\n", Title); /* Print min and max values and entropy */ if (PixType == BYTE || PixType == SHORT || PixType == INT || PixType == JPEG_GRAY) { /* Find intensity range */ Data1 = (INT_TYPE *) im_alloc1D(Image1, INT); im_read(Image1, INT, (char *) Data1); Ave = Ave2 = Var = 0.0; Min1 = Max1 = Data1[0]; Count = Xdim * Ydim * Zdim; for (i = 0; i < Count; i++) { if (Min1 > Data1[i]) Min1 = Data1[i]; else if (Max1 < Data1[i]) Max1 = Data1[i]; Ave += Data1[i]; Ave2 += Data1[i] * Data1[i]; } Ave /= Count; Ave2 /= Count; Var = Ave2 - Ave * Ave; printf("Image Range = [%d,%d]\n", Min1, Max1); /* Calculate entropy */ Image1 = im_create("/dev/null", INT, Max1 - Min1 + 1, 1, 1); Histo = (INT_TYPE *) im_alloc1D(Image1, INT); for (i = 0; i < (Max1 - Min1 + 1); i++) Histo[i] = 0; for (i = 0; i < Count; i++) Histo[Data1[i] - Min1]++; Entropy = 0; for (i = 0; i < (Max1 - Min1 + 1); i++) if (Histo[i] > 0) { Prob = (double) Histo[i] / (double) Count; Entropy -= Prob * log(Prob) / log(2.0); } printf("Entropy = %7.2lf\n", Entropy); printf("Mean = %7.2f\n", Ave); printf("Variance = %7.2f\n", Var); printf("StdDev = %7.2f\n", (float) sqrt((double) Var)); } /* Print min and max values and entropy */ else if (PixType == FLOAT || PixType == DOUBLE) { /* Find intensity range */ Data2 = (FLOAT_TYPE *) im_alloc1D(Image1, FLOAT); im_read(Image1, FLOAT, (char *) Data2); Ave = Ave2 = Var = 0.0; Min2 = Max2 = Data2[0]; Count = Xdim * Ydim * Zdim; for (i = 0; i < Count; i++) { if (Min2 > Data2[i]) Min2 = Data2[i]; else if (Max2 < Data2[i]) Max2 = Data2[i]; Ave += Data2[i]; Ave2 += Data2[i] * Data2[i]; } Ave /= Count; Ave2 /= Count; Var = Ave2 - Ave * Ave; printf("Image Range = [%f..%f]\n", Min2, Max2); /* Calculate entropy */ Image1 = im_create("/dev/null", INT, (int) (Max2 - Min2 + 1), 1, 1); Histo = (INT_TYPE *) im_alloc1D(Image1, INT); for (i = 0; i < (Max2 - Min2 + 1); i++) Histo[i] = 0; for (i = 0; i < Count; i++) Histo[(int) (Data2[i] - Min2)]++; Entropy = 0; for (i = 0; i < (Max2 - Min2 + 1); i++) if (Histo[i] > 0) { Prob = (double) Histo[i] / (double) Count; Entropy -= Prob * log(Prob) / log(2.0); } printf("Entropy = %7.2lf\n", Entropy); printf("Mean = %7.2f\n", Ave); printf("Variance = %7.2f\n", Var); printf("StdDev = %7.2f\n", (float) sqrt((double) Var)); } return (0); }