Ejemplo n.º 1
0
int main(int argc, char **argv) {

  if(argc!=3){
    printf("graphFindLeaves graph.gr leaves.cl\n");
    exit(0);
  }

  Graph<Point3D, EdgeW<Point3D> >* gr =
    new Graph<Point3D, EdgeW<Point3D> >(argv[1]);

  Cloud<Point3D>* cl = new Cloud<Point3D>();

  vector<int> pointsToAdd = gr->findLeaves();

  for(int i = 0; i < pointsToAdd.size(); i++){
      cl->addPoint(gr->cloud->points[pointsToAdd[i]]->coords[0],
                   gr->cloud->points[pointsToAdd[i]]->coords[1],
                   gr->cloud->points[pointsToAdd[i]]->coords[2]);
  }

  //Leaves are green
  cl->v_r = 0;
  cl->v_g = 1;
  cl->v_b = 0;
  cl->v_radius = 0.8;

  cl->saveToFile(argv[2]);

}
Ejemplo n.º 2
0
int main(int argc, char **argv) {

  vector<int>   idxs(3);
  vector<float> microm(3);
  char buff[1024];
  // For the color
  const gsl_rng_type * T2;
  gsl_rng * r;
  gsl_rng_env_setup();
  T2 = gsl_rng_default;
  r = gsl_rng_alloc (T2);


  // Cube<uchar, ulong>* cube = new Cube<uchar, ulong>("/media/neurons/cut2/cut2.nfo");
  // Cloud_P* decimatedCloud = CloudFactory::load("/media/neurons/cut2/decimated.cl");

  Cube<float, double>* cube = new Cube<float, double>
    ("/media/neurons/steerableFilters3D/tmp/cut/cut.nfo");
  Cloud_P* decimatedCloud = CloudFactory::load
    ("/media/neurons/steerableFilters3D/tmp/cut/dense.cl");
  Cloud<Point3D>* seedPointsSelected = new Cloud<Point3D>();

  DistanceDijkstraColorNegatedEuclidean* djkc
    = new DistanceDijkstraColorNegatedEuclidean(cube);
  CubeLiveWire* cubeLiveWire = new CubeLiveWire(cube, djkc);;


  vector<int> origIdxs(3);
  origIdxs[0] = 151;
  origIdxs[1] = 152;
  origIdxs[2] = 9;
  if(fileExists("/media/neurons/steerableFilters3D/tmp/cut/parents.nfo") &&
     fileExists("/media/neurons/steerableFilters3D/tmp/cut/distances.nfo")){
    printf("Loading the distances .... ");fflush(stdout);
    cubeLiveWire->loadParents("/media/neurons/steerableFilters3D/tmp/cut/parents.nfo");
    cubeLiveWire->loadDistances("/media/neurons/steerableFilters3D/tmp/cut/distances.nfo");
  } else{
    printf("Computing the distances .... ");fflush(stdout);
    cubeLiveWire->computeDistances(origIdxs[0],origIdxs[1],origIdxs[2]);
    cubeLiveWire->saveParents("parents");
    cubeLiveWire->saveDistances("distances");
  }
  printf(" distances done \n");


  multimap<float, Graph<Point3D, EdgeW<Point3D> >*> paths;

  Cloud< Point3D>* cloud = new Cloud<Point3D>();
  cube->indexesToMicrometers(origIdxs,microm);
  cloud->addPoint(microm[0],microm[1],microm[2]);
  cloud->v_g = 1.0;
  cloud->v_radius = 2.0;
  cloud->saveToFile("/media/neurons/steerableFilters3D/tmp/cut/original.cl");

  float cost;

  printf("Finding the shortest paths from all points to the soma[");fflush(stdout);
  for(int i = 0; i < decimatedCloud->points.size(); i++){
    cube->micrometersToIndexes3(decimatedCloud->points[i]->coords[0],
                                decimatedCloud->points[i]->coords[1],
                                decimatedCloud->points[i]->coords[2],
                                idxs[0],idxs[1],idxs[2]);

    Graph<Point3D, EdgeW<Point3D> >* shortestPath =
      cubeLiveWire->findShortestPathG(origIdxs[0],origIdxs[1],origIdxs[2],
                                      idxs[0],idxs[1],idxs[2]
                                      );
    cost = shortestPath->cloud->points.size() -
      cube->integralOverCloud(shortestPath->cloud);
    paths.insert(pair<float, Graph<Point3D, EdgeW<Point3D> >*>
                 ( exp(cost/(shortestPath->cloud->points.size())), shortestPath));
    if(i%100 == 0) printf("%02f]\r",
                          float(i*100)/decimatedCloud->points.size());fflush(stdout);
  }
  printf("\n");


  // Saves the paths according to the minimum mean distance
  if(1){
    int nGraphSaved = 0;
    for(multimap< float, Graph<Point3D, EdgeW<Point3D> >*>::iterator
          iter = paths.begin();
        iter != paths.end();
        iter++){
      Graph<Point3D, EdgeW<Point3D> >* gr = (*iter).second;
      sprintf(buff, "/media/neurons/steerableFilters3D/tmp/cut/opath%04i.gr",
              nGraphSaved++);
      gr->v_r = gsl_rng_uniform(r);
      gr->v_g = gsl_rng_uniform(r);
      gr->v_b = gsl_rng_uniform(r);
      gr->v_radius = 0.3;
      gr->cloud->v_r = gsl_rng_uniform(r);
      gr->cloud->v_g = gsl_rng_uniform(r);
      gr->cloud->v_b = gsl_rng_uniform(r);
      gr->cloud->v_radius = 0.3;
      gr->saveToFile(buff);
      if(nGraphSaved%100 == 0)
        printf("Saving the %i path with size %i\n", nGraphSaved, gr->cloud->points.size());
    }
  }


  // Getting the first 100 paths
  multimap< float, Graph<Point3D, EdgeW<Point3D> >*>::iterator
    iter = paths.begin();

  int cubeLength = cube->cubeDepth*cube->cubeHeight*cube->cubeWidth;
  int* visited_orig   = (int*) malloc(cubeLength*sizeof(int));
  int*** visited;
  visited = (int***) malloc(cube->cubeDepth*sizeof(int**));
  for(int z = 0; z < cube->cubeDepth; z++){
    visited  [z] = (int**) malloc(cube->cubeHeight*sizeof(int*));
    for(int j = 0; j < cube->cubeHeight; j++){
      visited[z][j] =(int*) &visited_orig [(z*cube->cubeHeight + j)*cube->cubeWidth];
    }
  }
  for(int i = 0; i < cubeLength; i++)
    visited_orig[i] = 0;




  int limitEnd = decimatedCloud->points.size()-1;
  // int limitEnd = 500 ;
  int nGraphsAdded = 0;
  int nGraphsRejected = 0;
  while(nGraphsAdded < limitEnd){
    iter = paths.begin();
    Graph<Point3D, EdgeW<Point3D> >* gr = (*iter).second;
    int nPoint = 0;
    bool alreadyVisited = false;
    //Check if there is a visited part of the path

    for(nPoint = 0; nPoint < gr->cloud->points.size(); nPoint++){
      microm[0] = gr->cloud->points[nPoint]->coords[0];
      microm[1] = gr->cloud->points[nPoint]->coords[1];
      microm[2] = gr->cloud->points[nPoint]->coords[2];
      cube->micrometersToIndexes(microm, idxs);
      if(visited[idxs[2]][idxs[1]][idxs[0]] == true){
        alreadyVisited = true;
        break;  // we reached a visited voxel
      }
    }

    //If the path has been already visited, we better forget of the visited part
    // and add a new graph to the list
    if(alreadyVisited){
      Graph<Point3D, EdgeW<Point3D> >* toAdd = gr->subGraphToPoint(nPoint);
      cost = toAdd->cloud->points.size() -
        cube->integralOverCloud(toAdd->cloud);
      if(nGraphsRejected%100 == 0)
        printf("Rejected %i paths\n", nGraphsRejected++);
      fflush(stdout);
      nGraphsRejected++;
      paths.erase(paths.begin());
      paths.insert(pair<float, Graph<Point3D, EdgeW<Point3D> >*>
                   (exp(cost/(toAdd->cloud->points.size())), toAdd));
    } else {
      for(int i = 0; i < gr->cloud->points.size(); i++){
        microm[0] = gr->cloud->points[i]->coords[0];
        microm[1] = gr->cloud->points[i]->coords[1];
        microm[2] = gr->cloud->points[i]->coords[2];
        if( (i==0) ||
            ((i == gr->cloud->points.size()-1)&&(i>0))
          )
          seedPointsSelected->points.push_back
            (new Point3D(microm[0],microm[1],microm[2]));
        cube->micrometersToIndexes(microm, idxs);
        visited[idxs[2]][idxs[1]][idxs[0]] = true;
        visited[origIdxs[2]][origIdxs[1]][origIdxs[0]] = false;
      }
      gr->v_r = gsl_rng_uniform(r);
      gr->v_g = gsl_rng_uniform(r);
      gr->v_b = gsl_rng_uniform(r);
      gr->v_radius = 0.3;
      gr->cloud->v_r = gsl_rng_uniform(r);
      gr->cloud->v_g = gsl_rng_uniform(r);
      gr->cloud->v_b = gsl_rng_uniform(r);
      gr->cloud->v_radius = 0.3;

      // cost = cube->integralOverCloud(gr->cloud)/gr->cloud->points.size();

      sprintf(buff, "/media/neurons/steerableFilters3D/tmp/cut/path%04i.gr",nGraphsAdded);
      nGraphsAdded++;
      gr->saveToFile(buff);
      if(nGraphsAdded%100 == 0)
        printf("Adding the %i path with size %i\n", nGraphsAdded, gr->cloud->points.size());
      paths.erase(paths.begin());
    }

  }//while
  seedPointsSelected->v_r = 1;
  seedPointsSelected->v_g = 0;
  seedPointsSelected->v_b = 1;
  seedPointsSelected->v_radius = 0.7;
  seedPointsSelected->saveToFile("/media/neurons/steerableFilters3D/tmp/cut/seedPointsSelected.cl");

  // Saves the visited points into a cube

  Cube<int, long>* visitedC =
    new Cube<int, long>(cube->cubeWidth, cube->cubeHeight, cube->cubeDepth,
                        cube->directory + "visited",
                        cube->voxelWidth, cube->voxelHeight, cube->voxelDepth);
  for(int x = 0; x < cube->cubeWidth; x++)
    for(int y = 0; y < cube->cubeHeight; y++)
      for(int z = 0; z < cube->cubeDepth; z++){
        visitedC->put(x,y,z, visited[z][y][x]);
      }


}//main