Statistiques
| Révision :

root / src / edge_indicator.cpp @ 8

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

1 7 akiss
/*
2 7 akiss

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

7 7 akiss
To execute :
8 8 akiss
 ./edge_indicator img K sigma input_type [transfer_type]
9 7 akiss

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

15 7 akiss
 * authors : Annamaria Kiss (RDP)
16 7 akiss
 * ENS-Lyon
17 7 akiss
 *
18 7 akiss

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