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 | } |