/* * Sample code for the DIS Pointer Stressmark * * This source code is the completely correct source code based on * the example codes provided by Atlantic Aerospace Division, Titan * Systems Corporation, 2000. * * If you just compile and generate the executables from this source * code, this code would be enough. However, if you wish to get a complete * understanding of this stressmark, it is strongly suggested that you * read the Benchmark Analysis and Specifications Document Version 1.0 * before going on since the detailed comments are given in this documents. * the comments are not repeated here. */ #include #define TRUE 1 #define FALSE !TRUE #define SUCCESS TRUE #define ERROR FLASE #define MIN_PIXEL 0 #define MAX_DIMENSION 32768 #define MIN_SEED -2147483647 #define MAX_SEED -1 #define MAX_NUMBER_LINES 65536 #define MIN_BIT_DEPTH 7 #define MAX_BIT_DEPTH 15 typedef struct { int column; int row; }Coord; /* * Neighborhood structure consists of the GLCM descriptors entropy and * energy for each of 2 distance and 4 angels */ typedef struct { float entropy; float energy; }Descriptors; typedef struct { Descriptors deg0; Descriptors deg45; Descriptors deg90; Descriptors deg135; }Angeles; typedef struct { Angeles distShort; Angeles distLong; }Neighborhood; typedef short int Pixel; /* short int;*/ typedef struct { int numColumns; /* number of columns in image */ int numRows; /* number of rows in image */ Pixel maxImageValue; /* max legal image value */ Pixel *data; /* data pointer */ } Image; // For correct implementation of drawLineSegment #include "initializeImage.c" Pixel *createImage (Pixel *image, int dimension, Pixel maxPixel, int numberLines, int minThickness, int maxThickness) { int i; Coord startPoint; Coord endPoint; int thickness; int startValue; int endValue; Image img; img.numColumns = dimension; img.numRows = dimension; img.maxImageValue = maxPixel; img.data = image; for (i=0; i= 0) && (binIndex < numBins)); sumHist[binIndex] += 1; binIndex = value0 - value1 + maxPixel - MIN_PIXEL; assert((binIndex >= 0) && (binIndex < numBins)); diffHist[binIndex] += 1; totalNumPixels += 1; } value0RowOffset += dimension; value1RowOffset += dimension; } if (totalNumPixels > 0){ int index; double energySum; double energyDifference; double entropyValue; double sumNormalized; double diffNormalized; double scale; energySum = (double) 0; energyDifference = (double) 0; entropyValue = (double) 0; scale = 1.e0/totalNumPixels; for (index = 0; index 0){ sumNormalized = (double) sumHist[index]*scale; entropyValue = entropyValue - sumNormalized * log((double)sumNormalized); energySum = energySum + sumNormalized * sumNormalized ; } if (diffHist[index] > 0){ diffNormalized = (double)diffHist[index]*scale; entropyValue = entropyValue - diffNormalized * log(diffNormalized); energyDifference = energyDifference + diffNormalized * diffNormalized; } } *energy = energySum * energyDifference; *entropy = entropyValue; } return; } void neighborhoodCalculation (Pixel *image, int dimension, int distanceShort, int distanceLong, Neighborhood *neighborhood, Pixel maxPixel) { int *sumHist, *diffHist; int numBins; numBins = (2 * (maxPixel - MIN_PIXEL + 1) -1); sumHist = (int *) malloc(numBins * sizeof(int)); assert (sumHist != NULL); diffHist = (int *)malloc(numBins * sizeof(int)); assert(diffHist != NULL); calcEntropyEnergy(sumHist, diffHist, image, numBins, distanceShort, 0, &(neighborhood->distShort.deg0.entropy), &(neighborhood->distShort.deg0.energy), dimension, maxPixel); calcEntropyEnergy(sumHist, diffHist, image, numBins, distanceShort, distanceShort, &(neighborhood->distShort.deg45.entropy), &(neighborhood->distShort.deg45.energy), dimension, maxPixel); calcEntropyEnergy(sumHist, diffHist, image, numBins, 0, distanceShort, &(neighborhood->distShort.deg90.entropy), &(neighborhood->distShort.deg90.energy), dimension, maxPixel); calcEntropyEnergy(sumHist, diffHist, image, numBins, -distanceShort, distanceShort, &(neighborhood->distShort.deg135.entropy), &(neighborhood->distShort.deg135.energy), dimension, maxPixel); calcEntropyEnergy(sumHist, diffHist, image, numBins, distanceLong, 0, &(neighborhood->distLong.deg0.entropy), &(neighborhood->distLong.deg0.energy), dimension, maxPixel); calcEntropyEnergy(sumHist, diffHist, image, numBins, distanceLong, distanceLong, &(neighborhood->distLong.deg45.entropy), &(neighborhood->distLong.deg45.energy), dimension, maxPixel); calcEntropyEnergy(sumHist, diffHist, image, numBins, 0, distanceLong, &(neighborhood->distLong.deg90.entropy), &(neighborhood->distLong.deg90.energy), dimension, maxPixel); calcEntropyEnergy(sumHist, diffHist, image, numBins, -distanceLong, distanceLong, &(neighborhood->distLong.deg135.entropy), &(neighborhood->distLong.deg135.energy), dimension, maxPixel); free(sumHist); free(diffHist); return; }