void locateNovelFeatures(ImageList* novelImages, GraphDiscription graphTemplate, GraphDiscription bunchGraph, JetMasks masks, char* imageDir, char* outputDir, JetDisplacementEstimator dispEst){ ImageList *subject, *replicate; int i; for(subject = novelImages; subject != NULL; subject = subject->next_subject){ for(replicate = subject; replicate != NULL; replicate = replicate->next_replicate){ Image novel = readRawImage(makePath(imageDir,replicate->filename)); int *verts = (int*)malloc(sizeof(int)*bunchGraph->numVert); printf("Fitting graph for image: %s |", replicate->filename); fflush(stdout); for(i = 0; i < bunchGraph->numVert; i++){ printf("#"); fflush(stdout); guessVertexLocation(i, i, graphTemplate, bunchGraph); graphTemplate->verts[i].x = graphTemplate->verts[i].x; graphTemplate->verts[i].y = graphTemplate->verts[i].y; LocatePoint( &(graphTemplate->verts[i].x), &(graphTemplate->verts[i].y), bunchGraph->bunch[i], novel, masks, dispEst); verts[i] = i; } printf("|\n"); fflush(stdout); permuteArray(verts, bunchGraph->numVert); freeImage(novel); saveGraphDiscription(makePath(outputDir,replicate->filename),graphTemplate); } } }
GraphDiscription extractModelJets(ImageList* modelImages, char* imageDir, char* graphDir, JetMasks masks){ ImageList *subject, *replicate; GraphDiscription mj = NULL; int count = 0, i; for(subject = modelImages; subject != NULL; subject = subject->next_subject){ for(replicate = subject; replicate != NULL; replicate = replicate->next_replicate){ /* load the model graph */ GraphDiscription gd = readGraphDiscription(makePath(graphDir,replicate->filename)); /* Load the model image */ Image model = readRawImage(makePath(imageDir,replicate->filename)); /*MESSAGE2ARG("Extracting Jets From Image #%d. <%s>", count, replicate->filename);*/ if(count == 0){ /* load up a default graph */ mj = readGraphDiscription(makePath(graphDir,replicate->filename)); } else{ assert(mj->numVert == gd->numVert); for(i = 0; i < mj->numVert; i++){ /* Accumulate mean locations */ mj->verts[i].x += gd->verts[i].x; mj->verts[i].y += gd->verts[i].y; } } /* extract jets */ printf("Extracting jets from model image #%03d. <%s> |", count, replicate->filename); fflush(stdout); for(i = 0; i < gd->numVert; i++){ printf("#"); fflush(stdout); addJetToBunch( mj->bunch[i], extractJet(gd->verts[i].x, gd->verts[i].y, model, masks)); } printf("|\n"); freeImage(model); freeGraphDiscription(gd); count++; } } for(i = 0; i < mj->numVert; i++){ /* Accumulate mean locations */ mj->verts[i].x /= count; mj->verts[i].y /= count; } return mj; }
int main(int argc, char** argv){ Arguments args; ImageList *imagenames, *subject, *replicate; JetMasks masks; GraphDiscription gd; Image face; FaceGraph graph; int i; int imagenum = 0, numImage; processCommand(argc,argv, &args); masks = readMasksFile(args.masksFile); imagenames = getImageNames(args.imageFile, &numImage); for(subject = imagenames; subject != NULL; subject = subject->next_subject){ for(replicate = subject; replicate != NULL; replicate = replicate->next_replicate){ imagenum++; printf("Processing: %s (%5d of %5d) %5.2f%% \n" , replicate->filename, imagenum, numImage, imagenum*100.0/numImage); fflush(stdout); gd = readGraphDiscription(makePath(args.graphDir,replicate->filename)); face = readRawImage(makePath(args.imageDir,replicate->filename)); graph = makeFaceGraph(gd->numVert, gd->numVert+gd->numEdge); graph->params =masks->params; for( i = 0; i < gd->numVert; i++){ graph->jets[i] = extractJet(gd->verts[i].x,gd->verts[i].y,face,masks); } for( i = 0; i < gd->numEdge; i++){ double x = 0.5*(gd->verts[gd->edges[i].vert1].x + gd->verts[gd->edges[i].vert1].x); double y = 0.5*(gd->verts[gd->edges[i].vert1].y + gd->verts[gd->edges[i].vert1].y); graph->jets[ gd->numVert + i ] = extractJet(x,y,face,masks); } saveFaceGraph(makePath(args.outputDir,replicate->filename),graph); freeImage(face); freeGraphDiscription(gd); freeFaceGraph(graph); } } printf("\n"); return 0; }
void convertImages(Arguments* args){ FILE* list; JetMasks masks; int x, y,i,j; char imagename[MAX_FILENAME_LENGTH]; char filename[MAX_FILENAME_LENGTH]; MESSAGE("Creating gabor masks."); masks = readMasksFile(args->maskFile); if(args->saveMasks){ for(y = 0; y < masks->size; y++){ char outname[MAX_FILENAME_LENGTH]; sprintf(outname, "mask%03d.pgm",y); writePGMImage(masks->masks[y],outname,0); } } list = fopen(args->imageList,"r"); if(!list){ printf("Error opening file: %s\n", args->imageList); exit(1); } while(fscanf(list, "%s", imagename) == 1){ Image im; Image grid; sprintf(filename, "%s/%s", args->inputDir, imagename); im = readRawImage(filename); MESSAGE1ARG("Processing file: %s",filename); /* Find the number of points in the grid */ i = 0; for( x = args->gridStartX; x < im->width; x += args->gridSpaceX){ for( y = args->gridStartY; y < im->height; y+= args->gridSpaceY){ i++; } } grid = makeImage(i,masks->size,1); /* Compute convolutions */ i = 0; for( x = args->gridStartX; x < im->width; x += args->gridSpaceX){ for( y = args->gridStartY; y < im->height; y+= args->gridSpaceY){ for(j = 0; j < masks->size; j++){ if( i < grid->width ) IE(grid,i,j,0) = convolvePoint(x, y, 0, im, masks->masks[j]); } i++; } } sprintf(filename, "%s/%s", args->sfiDir, imagename); writeRawImage(grid,filename); freeImage(grid); freeImage(im); } fclose(list); }