Statistiques
| Révision :

root / src / edge_indicator.cpp @ 7

Historique | Voir | Annoter | Télécharger (4,87 ko)

1 7 akiss
/*
2 7 akiss
Anisotropic blur : removes noise while keeping cell walls
3 7 akiss
Parallel version
4 7 akiss
3D only
5 7 akiss

6 7 akiss
To compile :
7 7 akiss
 g++ -o edge_indicator edge_indicator.cpp -O2 -L/usr/X11R6/lib -lm -lpthread -lX11 -fopenmp -l:libtiff.so.4
8 7 akiss
 Needs CImg.h
9 7 akiss

10 7 akiss
To execute :
11 7 akiss
 ./edge_indicator img K sigma [filtertype]
12 7 akiss

13 7 akiss
 img : image in .inr or .inr.gz
14 7 akiss
 K : proportional to width of cell walls (0.1 - 0.3)
15 7 akiss
 sigma : amount of gaussian blur (float)
16 7 akiss
 filtertype (optional) : by default 1/(1+x/K) type edge function. If "exp" is marked, then exp(-x/K) edge function is used
17 7 akiss

18 7 akiss
 * authors : Annamaria Kiss (RDP)
19 7 akiss
 * ENS-Lyon
20 7 akiss
 *
21 7 akiss

22 7 akiss
*/
23 7 akiss
#include <iostream>
24 7 akiss
#include <math.h>
25 7 akiss
#include <sstream>
26 7 akiss
#include <fstream>
27 7 akiss
28 7 akiss
#include "CImg.h"
29 7 akiss
#include <omp.h>
30 7 akiss
31 7 akiss
using namespace cimg_library;
32 7 akiss
using namespace std;
33 7 akiss
34 7 akiss
#include "lsm_lib.h"
35 7 akiss
36 7 akiss
//-----------------------------------------------------------------------------
37 7 akiss
//Main
38 7 akiss
//-----------------------------------------------------------------------------
39 7 akiss
int main (int argc, char* argv[])
40 7 akiss
{
41 7 akiss
 // double begin_main=omp_get_wtime();
42 7 akiss
43 7 akiss
  if(argc<4 || argc>5)
44 7 akiss
    {
45 7 akiss
      cout<<"!! wrong number of arguments"<<endl;
46 7 akiss
      cout<<"how to execute : edge_indicator img K sigma gamma upDiter nbIter [type]"<<endl;
47 7 akiss
      cout<<" img : image in .inr or .inr.gz"<<endl;
48 7 akiss
          cout<<" K : proportional to width of cell walls (0.1 - 0.3)"<<endl;
49 7 akiss
          cout<<" sigma : amount of gaussian blur (float)"<<endl;
50 7 akiss
          cout<<" filtertype (optional) : by default 'hill' that is 1/(1+x/K) type edge function. If 'exp' is marked, then exp(-x/K) edge function is used"<<endl;
51 7 akiss
      return 0;
52 7 akiss
    }
53 7 akiss
54 7 akiss
55 7 akiss
  string filter_type="hill";
56 7 akiss
  if (argc==5)
57 7 akiss
        {
58 7 akiss
        if (string(argv[4]).compare("exp")==0)
59 7 akiss
                {filter_type="exp";}
60 7 akiss
        }
61 7 akiss
62 7 akiss
63 7 akiss
  //Open image with name in argument
64 7 akiss
  //image is converted to unsigned char (0 to 255) and then to float
65 7 akiss
  string name=argv[1];
66 7 akiss
  CImg<> img1;
67 7 akiss
  CImg<char> description;
68 7 akiss
  float tailleVoxel[3] = {0}; // resolution initialisation
69 7 akiss
  bool gzipped = false;
70 7 akiss
  bool tiffile = false;
71 7 akiss
72 7 akiss
  if(name.compare(name.size()-4,4,".inr")==0)
73 7 akiss
    {
74 7 akiss
      img1.load(name.c_str());
75 7 akiss
      img1.get_load_inr(name.c_str(),tailleVoxel); // reads resolution
76 7 akiss
    }
77 7 akiss
  else if(name.compare(name.size()-7,7,".inr.gz")==0)
78 7 akiss
    {
79 7 akiss
      gzipped = true;
80 7 akiss
      string oldname = name;
81 7 akiss
      name.erase(name.size()-3);
82 7 akiss
      string zip="gunzip -c "+oldname+" > "+name;
83 7 akiss
      if(system(zip.c_str())); // decompress image file
84 7 akiss
      img1.load(name.c_str()); //read image
85 7 akiss
      img1.get_load_inr(name.c_str(),tailleVoxel); // read resolution
86 7 akiss
      zip="rm "+name;
87 7 akiss
      if(system(zip.c_str())); //removes decompressed image
88 7 akiss
    }
89 7 akiss
  else if(name.compare(name.size()-4,4,".tif")==0)
90 7 akiss
        {
91 7 akiss
          tiffile = true;
92 7 akiss
          cout<<"file to read : "<<name<<endl;
93 7 akiss
          img1.load_tiff(name.c_str(),0,~0U,1,tailleVoxel,&description);
94 7 akiss
        }
95 7 akiss
  else
96 7 akiss
    {cout<<"!! wrong file extension (not an inr/inr.gz/tif)  : "<<name<<endl;
97 7 akiss
      return 0;}
98 7 akiss
99 7 akiss
  CImg<float> img=img1;
100 7 akiss
  img1.assign();
101 7 akiss
  cout<<"image : "<<name<<endl;
102 7 akiss
  cout<<"gzipped : "<<gzipped<<endl;
103 7 akiss
  cout<<"image depth : "<<img.depth()<<endl;
104 7 akiss
  if(img.depth()<=1)
105 7 akiss
    {
106 7 akiss
      cout<<"This is not a 3D image"<<endl;
107 7 akiss
      return  0;
108 7 akiss
    }
109 7 akiss
  //---------------------------------------------------------Parameters
110 7 akiss
  float dt=0.1;
111 7 akiss
  float  K= atof(argv[2]);
112 7 akiss
  float sigma=atof(argv[3]);
113 7 akiss
114 7 akiss
  cout<<"Voxel size : ("<<tailleVoxel[0]<<","<<tailleVoxel[1]<<","<<tailleVoxel[2]<<")"<<endl;
115 7 akiss
116 7 akiss
  //--------------------------------------------------------Name and directories
117 7 akiss
  string insert=string("_edgeind-K")+argv[2]+"s"+argv[3]+"-type-"+filter_type;
118 7 akiss
  name.insert(name.size()-4,insert);
119 7 akiss
  size_t test=name.rfind("/");
120 7 akiss
  if(test!=name.npos)
121 7 akiss
    {name.erase(0,test+1);}
122 7 akiss
123 7 akiss
  //---------------------------------------------------------------------Processing
124 7 akiss
  //Evolution during nbIter
125 7 akiss
      //-------------------------------------------------------------------------3D
126 7 akiss
      cout<<"3D image"<<endl;
127 7 akiss
      cout <<"Computing Hessian"<<endl;
128 7 akiss
129 7 akiss
      int nthreads;
130 7 akiss
      CImg<float> fx;
131 7 akiss
      CImg<float> edgeind;
132 7 akiss
133 7 akiss
      // make a blur before taking derivatives
134 7 akiss
          CImg<float> imgBlur=img.get_blur(sigma);
135 7 akiss
      fx=edge_lambda3(imgBlur);
136 7 akiss
137 7 akiss
    if (filter_type.compare("hill")==0)
138 7 akiss
                {
139 7 akiss
                        edgeind=edge_indicator3(img,K);
140 7 akiss
                }
141 7 akiss
                else
142 7 akiss
                {
143 7 akiss
                        edgeind=edge_indicator3exp(img,K);
144 7 akiss
                }
145 7 akiss
146 7 akiss
147 7 akiss
        float maxi=edgeind.max();
148 7 akiss
        float mini=edgeind.min();
149 7 akiss
        edgeind=maxi-edgeind;
150 7 akiss
        maxi=edgeind.max();
151 7 akiss
        mini=edgeind.min();
152 7 akiss
        edgeind=edgeind*255./(maxi-mini);
153 7 akiss
    //edgeind=(edgeind-maxi)*255./(mini-maxi);
154 7 akiss
155 7 akiss
          //Saving results
156 7 akiss
              string newname=name;
157 7 akiss
              CImg<unsigned char> imgbis=edgeind;
158 7 akiss
              //CImg<float> imgbis=edgeind;
159 7 akiss
              cout<<"Save image"<<endl;
160 7 akiss
              cout<<"image : "<<newname<<endl;
161 7 akiss
              if (tiffile)
162 7 akiss
                        {
163 7 akiss
                                imgbis.save_tiff(newname.c_str(),0,tailleVoxel,description.data());
164 7 akiss
                        }
165 7 akiss
                  else
166 7 akiss
                        {
167 7 akiss
                          imgbis.save_inr(newname.c_str(),tailleVoxel);
168 7 akiss
                          if (gzipped)
169 7 akiss
                          {
170 7 akiss
                                string zip="gzip -f "+newname;
171 7 akiss
                                if(system(zip.c_str()));
172 7 akiss
                                }
173 7 akiss
                  }
174 7 akiss
              imgbis.assign();
175 7 akiss
176 7 akiss
  cout << "Done!"<<endl;
177 7 akiss
178 7 akiss
179 7 akiss
  return 0;
180 7 akiss
}