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;
00015
00016 std::ifstream f("image/imageTest.inr");
00017 f >> format("inrimage") >> image;
00018
00019 Image2D<float> metric(image.shape());
00020 Image2D<float> data(image.shape());
00021 Eikonal<2, float> march(&data);
00022 Image2D<float> backtrack = image.copy();
00023
00024 #ifdef PRINT_TIME
00025 timeval _time;
00026 Globals::initChrono(_time);
00027 #endif
00028
00029
00030
00031
00032 std::cout << " Metric Computation ... " << std::endl;
00033
00034 DericheFilter<2, float> deriche(2.0f);
00035 deriche.filter(image);
00036
00037
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
00053
00054
00055 std::cout << " Fast-Marching ... " << std::endl;
00056
00057 march.set_metric(&metric);
00058
00059
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
00075
00076
00077 data += metric;
00078
00079 std::cout << " BackTracking ... " << std::endl;
00080
00081
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 }