Jerome Piovano

Research in Medical Imaging and Computer Vision

2D_MinimalPath.C

Minimal path between 2 points in an image + back tracking

00001 #include <Image.H>
00002 #include <FastMarching.h>
00003 #include <DericheFilter.h>
00004 #include <Globals.h>
00005 #include <Schemes.h>
00006 
00009 int main(int argc, char* argv[])
00010 {
00011         using namespace Images;
00012         using namespace levelset;
00013 
00014         Image2D<float>      image;                      // Image to segment
00015         //std::ifstream f("image/tiger.inr");
00016         std::ifstream f("image/imageTest.inr");
00017         f >> format("inrimage") >> image;
00018         
00019         Image2D<float>      metric(image.shape());      // Metric of the image
00020         Image2D<float>      data(image.shape());        // Data structure of the fast marching
00021         Eikonal<2, float>   march(&data);               // Fast Marching
00022         Image2D<float>      backtrack = image.copy();   // Result of the minimal path
00023 
00024         #ifdef PRINT_TIME
00025         timeval _time;
00026         Globals::initChrono(_time);
00027         #endif
00028 
00029         // Initialization of the metric 
00030         //------------------------------
00031 
00032         std::cout << " Metric Computation ... " << std::endl;
00033 
00034         DericheFilter<2, float>  deriche(2.0f);
00035         deriche.filter(image);
00036 
00037         // metric = 1/1+|grad(I)|
00038         for (Image2D<float>::iterator<domain> ind=metric.begin() ; ind!=metric.end() ; ++ind )
00039                 metric(ind) = 1/(1+Schemes<2, float>::norm_gradient(image, ind.position()));
00040 
00041         Globals::normalize<2,float>(metric, 0.1, 1);
00042 
00043         std::ofstream f1("metric.inr"); 
00044         f1 << format("inrimage") << metric;
00045         f1.close();
00046 
00047         #ifdef PRINT_TIME
00048         Globals::printChrono("  => metric computation : ", _time);
00049         Globals::initChrono(_time);
00050         #endif
00051 
00052         // Fast Marching
00053         //---------------
00054 
00055         std::cout << " Fast-Marching ... " << std::endl;
00056 
00057         march.set_metric(&metric);
00058 
00059         // seed (first point)
00060         Image2D<float>::Index ind1(933, 15);
00061         march.add_trial_point(ind1);
00062 
00063         march.run();
00064 
00065         std::ofstream f2("fastmarching.inr"); 
00066         f2 << format("inrimage") << data;
00067         f2.close();
00068 
00069         #ifdef PRINT_TIME
00070         Globals::printChrono("  => Fast Marching : ", _time);
00071         Globals::initChrono(_time);
00072         #endif
00073         
00074         // Back Tracking
00075         //----------------
00076         
00077         data += metric;
00078 
00079         std::cout << " BackTracking ... " << std::endl;
00080 
00081         // second point 
00082         Image2D<float>::Index ind2(520, 1040);
00083         Image2D<float>::Index min;
00084 
00085         int inf_coords[2];
00086         int sup_coords[2];
00087         while (ind2 != ind1){
00088                 backtrack(ind2) = 255;
00089 
00090                 Schemes<2,float>::find_neighbours(data, ind2, inf_coords, sup_coords);
00091 
00092                 min = ind2;
00093                 for (int i=0 ; i<2 ; i++){
00094                         Image2D<float>::Index inf = ind2;
00095                         Image2D<float>::Index sup = ind2;
00096                         inf(i+1) = inf_coords[i];
00097                         sup(i+1) = sup_coords[i];
00098 
00099                         if (data(inf)<data(min)) min = inf;
00100                         if (data(sup)<data(min)) min = sup;
00101                 }
00102                 ind2 = min;
00103         }
00104 
00105         std::ofstream f3("backtrack.inr"); 
00106         f3 << format("inrimage") << backtrack;
00107         f3.close();
00108 
00109         #ifdef PRINT_TIME
00110         Globals::printChrono("  => BackTracking : ", _time);
00111         Globals::initChrono(_time);
00112         #endif
00113 }

For further information, please contact Jerome Piovano - Last update 2008-02-08