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 }