c9aba18a
Laila Saadatifard
ivote3 on the GPU...
|
1
|
#include <iostream>
|
46820b25
Laila Saadatifard
create an obj fil...
|
2
|
#include <string>
|
c9aba18a
Laila Saadatifard
ivote3 on the GPU...
|
3
|
#include <fstream>
|
c9aba18a
Laila Saadatifard
ivote3 on the GPU...
|
4
5
6
7
|
#include <cuda_runtime.h>
#include <stim/math/vector.h>
#include <stim/parser/arguments.h>
#include <stim/parser/filename.h>
|
c9aba18a
Laila Saadatifard
ivote3 on the GPU...
|
8
|
#include <stim/visualization/colormap.h>
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
9
|
#include <stim/image/image.h>
|
c9aba18a
Laila Saadatifard
ivote3 on the GPU...
|
10
11
|
#define pi 3.14159
|
1f55a874
Laila Saadatifard
upload the fixed ...
|
12
13
14
15
16
17
18
|
//#define M_PI 3.14159
//#include <stim/math/circle.h>
//#include <stim/math/vec3.h>
//#include <stim/math/plane.h>
//#include <stim/math/vector.h>
//#include <stim/visualization/aabb3.h>
|
a744d027
Laila Saadatifard
upload the ivote3...
|
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
/*void test_3(float* gpu_out, float* gpu_grad, float rmax, float phi, int n, int x, int y, int z);
int main(){
int n=20;
float rmax;
float phi_deg;
float phi;
rmax=4;
phi_deg = 15;
phi = phi_deg * pi/180;
int x,y,z;
x=y=z=1;
unsigned int size = x*y*z*sizeof (float);
float* cpu_grad = (float*) malloc(3*size);
float* gpu_grad;
cudaMalloc(&gpu_grad, 3*size);
cpu_grad[0]=1;
cpu_grad[1]=0;
cpu_grad[2]=-0.5;
cudaMemcpy(gpu_grad, cpu_grad, 3*size, cudaMemcpyHostToDevice);
float* cpu_out = (float*) malloc(3*size*(n+1));
float* gpu_out;
cudaMalloc(&gpu_out, 3*size*(n+1));
test_3(gpu_out, gpu_grad, rmax, phi, n, x, y, z);
cudaMemcpy(cpu_out, gpu_out, 3*size*(n+1), cudaMemcpyDeviceToHost);
std::ofstream list("circle_check_cuda1.txt");
if (list.is_open()){
for (int j=0; j<=n; ++j)
list << cpu_out[3*j] << '\t' << cpu_out[3*j +1] << '\t' << cpu_out[3*j + 2] << '\n';
}
list.close();
*/
|
1f55a874
Laila Saadatifard
upload the fixed ...
|
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
/*
int main(){
stim::vec3<float> g(-44,-3.4,-0.005); // form a vec3 variable for the gradient vector
stim::vec3<float> g_sph = g.cart2sph(); //convert cartesian coordinate to spherical for the gradient vector
int n =36; //set the number of points to find the boundaries of the conical voting area
int xi = 105;
int yi = 17;
int zi = 23;
float xc = 12 * cos(g_sph[1]) * sin(g_sph[2]); //calculate the center point of the surface of the voting area for the voter
float yc = 10 * sin(g_sph[1]) * sin(g_sph[2]) ;
float zc = 10 * cos(g_sph[2]) ;
float r = sqrt(xc*xc + yc*yc + zc*zc);
xc+=xi;
yc+=yi;
zc+=zi;
stim::vec3<float> center(xc,yc,zc);
float d = 2 * r * tan(25*pi/180 ); //find the diameter of the conical voting area
stim::vec3<float> norm = g.norm(); //compute the normalize gradient vector
float step = 360.0/(float) n;
stim::circle<float> cir(center, d, norm);
stim::aabb3<int> bb(xi,yi,zi);
bb.insert(xc,yc,zc);
for(float j = 0; j <360.0; j += step){
stim::vec3<float> out = cir.p(j);
bb.insert(out[0], out[1], out[2]);
}
bb.trim_low(0,0,0);
bb.trim_high(128-1, 128-1, 128-1);
std::cout<< bb.low[0] << '\t' << bb.low[1] << '\t' << bb.low[2] << '\n';
std::cout<< bb.high[0] << '\t' << bb.high[1] << '\t' << bb.high[2] << '\n';
std::cin >> n;
*/
/*int n=10;
stim::circle<float> cir;
float* c0= (float*) malloc(3*sizeof(float));
c0[0] =-4;
c0[1]=0;
c0[2] = 3;
stim::vec3<float> c(c0[0],c0[1],c0[2]);
float len = c.len();
stim::vec3<float> norm(c0[0]/len,c0[1]/len,c0[2]/len);
std::cout<< len << '\n';
std::cout<< norm << '\n';
cir.center(c);
cir.normal(norm);
cir.scale(2);
stim::vec3<float> out = cir.p(45);
std::vector<stim::vec3<float>> out2 = cir.getPoints(n);
|
a744d027
Laila Saadatifard
upload the ivote3...
|
107
|
|
1f55a874
Laila Saadatifard
upload the fixed ...
|
108
109
110
|
std::cout<< out << '\n';
std::cout <<out[0] << '\t' << out[1] << '\t' << out[2] <<'\n';
std::cout<< c << '\n';
|
a744d027
Laila Saadatifard
upload the ivote3...
|
111
|
|
1f55a874
Laila Saadatifard
upload the fixed ...
|
112
113
114
115
116
117
118
119
120
|
for (std::vector<stim::vec3<float>>::const_iterator i = out2.begin(); i != out2.end(); ++i)
std::cout << *i << '\n';
std::ofstream list("circle_check.txt");
if (list.is_open()){
for (std::vector<stim::vec3<float>>::const_iterator j = out2.begin(); j != out2.end(); ++j)
list << *j << '\n';
}
list.close();
std::cin >> n;
|
a744d027
Laila Saadatifard
upload the ivote3...
|
121
122
|
}
|
a744d027
Laila Saadatifard
upload the ivote3...
|
123
|
*/
|
c9aba18a
Laila Saadatifard
ivote3 on the GPU...
|
124
|
|
1f55a874
Laila Saadatifard
upload the fixed ...
|
125
|
|
46820b25
Laila Saadatifard
create an obj fil...
|
126
|
void ivote3(float* img, float std[], float anisotropy, float phi, float d_phi, unsigned int r[], int iter, float t, unsigned int conn[],
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
127
|
unsigned int x, unsigned int y, unsigned int z);
|
46820b25
Laila Saadatifard
create an obj fil...
|
128
|
void lmax(float* center, float* vote, float t1, unsigned int conn[], unsigned int x, unsigned int y, unsigned int z);
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
129
130
131
132
133
134
135
136
137
138
139
|
void invert_data(float* cpuI, unsigned int x, unsigned int y, unsigned int z){
for(int ix = 0; ix < x; ix++){
for (int iy = 0; iy < y; iy++){
for (int iz = 0; iz < z; iz++){
int idx = iz * x * y + iy * x + ix;
cpuI[idx] = 255 - cpuI[idx];
}
}
}
}
|
94d437dd
Laila Saadatifard
ivote3 code compi...
|
140
|
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
141
142
|
int main(int argc, char** argv){
|
94d437dd
Laila Saadatifard
ivote3 code compi...
|
143
144
145
146
147
148
149
150
151
152
|
cudaDeviceProp prop;
int count;
cudaGetDeviceCount(&count);
//printf("cudadevicecount: %i\n", count);
for (int i=0; i<count; i++){
cudaGetDeviceProperties(&prop, i);
printf("current device ID: %d\n", i);
printf("device name: %s\n", prop.name);
printf("total global mem: %lu\n", prop.totalGlobalMem);
|
89604e92
Laila Saadatifard
ivote3 run on the...
|
153
|
printf("shared memory per block: %lu\n", prop.sharedMemPerBlock);
|
94d437dd
Laila Saadatifard
ivote3 code compi...
|
154
|
}
|
89604e92
Laila Saadatifard
ivote3 run on the...
|
155
|
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
//output advertisement
std::cout<<std::endl<<std::endl;
std::cout<<"========================================================================="<<std::endl;
std::cout<<"Thank you for using the ivote3 segmentation tool!"<<std::endl;
std::cout<<"Scalable Tissue Imaging and Modeling (STIM) Lab, University of Houston"<<std::endl;
std::cout<<"Developers: Laila Saadatifard and David Mayerich"<<std::endl;
std::cout<<"Source: https://git.stim.ee.uh.edu/segmentation/ivote3"<<std::endl;
std::cout<<"========================================================================="<<std::endl<<std::endl;
stim::arglist args;
#ifdef _WIN32
args.set_ansi(false);
#endif
//add arduments
args.add("help", "prints this help");
args.add("x", "size of the dataset along X axis", "positive value");
args.add("y", "size of the dataset along Y axis", "positive value");
args.add("z", "size of the dataset along Z axis", "positive value");
args.add("t", "threshold value for the final result", "positive valu");
|
94d437dd
Laila Saadatifard
ivote3 code compi...
|
177
|
args.add("invert", "to invert the input data set", "string");
|
1f55a874
Laila Saadatifard
upload the fixed ...
|
178
|
args.add("anisotropy", "anisotropy value of the imaging", "1");
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
|
//parse the command line arguments.
args.parse(argc, argv);
//display the help text if requested
if(args["help"].is_set()){
std::cout<<std::endl<<"usage: ivote input_image output_list --option [A B C ...]"<<std::endl;
std::cout<<std::endl<<std::endl
<< "examples: ivote blue.bmp list.txt "<<std::endl;
std::cout<<std::endl<<std::endl;
std::cout<<args.str()<<std::endl;
exit(1);
}
//if the input and output files aren't specified, throw an error and exit
if(args.nargs() < 2){
std::cout<<"ERROR: two files must be specified for segmentation, enter ivote --help for options."<<std::endl<<std::endl;
exit(1);
}
//get the input image file
stim::filename Ifilename(args.arg(0));
//get the output file name
stim::filename OutName(args.arg(1));
//set the x, y, z.
int x = args["x"].as_int();
int y = args["y"].as_int();
int z = args["z"].as_int();
//set the threshold.
float t = args["t"].as_float();
|
94d437dd
Laila Saadatifard
ivote3 code compi...
|
212
213
|
//set the anisotropy
float anisotropy = args["anisotropy"].as_float();
|
a744d027
Laila Saadatifard
upload the ivote3...
|
214
|
unsigned int rmax = 10;
|
46820b25
Laila Saadatifard
create an obj fil...
|
215
|
unsigned int r[3] = { 12, rmax, rmax};
|
94d437dd
Laila Saadatifard
ivote3 code compi...
|
216
217
|
float std = 5;
float sigma[3] = { std, std, std};
|
3f0e43ce
Laila Saadatifard
compute the local...
|
218
|
unsigned int nlmax = 5;
|
94d437dd
Laila Saadatifard
ivote3 code compi...
|
219
220
|
unsigned int conn[3] = { nlmax, nlmax, nlmax};
float phi_deg = 25.0;
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
221
|
float phi = phi_deg * pi /180;
|
94d437dd
Laila Saadatifard
ivote3 code compi...
|
222
223
|
int iter = 8;
float d_phi = phi/(iter+2);
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
224
225
|
std::string filename = Ifilename.str();
|
c9aba18a
Laila Saadatifard
ivote3 on the GPU...
|
226
227
|
unsigned int bytes = x*y*z*sizeof(float);
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
228
|
//allocate space on the cpu for the input data
|
c9aba18a
Laila Saadatifard
ivote3 on the GPU...
|
229
230
|
float* cpuI = (float*) malloc(bytes);
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
231
|
//load the input file into the cpuI
|
c9aba18a
Laila Saadatifard
ivote3 on the GPU...
|
232
233
234
|
std::ifstream nissl(filename, std::ios::in | std::ios::binary);
nissl.read((char*)cpuI, bytes);
nissl.close();
|
94d437dd
Laila Saadatifard
ivote3 code compi...
|
235
236
|
if(args["invert"].is_set())
invert_data(cpuI, x, y, z);
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
237
238
|
//write a new file from the cpuI.
|
46820b25
Laila Saadatifard
create an obj fil...
|
239
|
std::ofstream original("shared2D-v1/inv-128.vol", std::ofstream::out | std::ofstream::binary);
|
c9aba18a
Laila Saadatifard
ivote3 on the GPU...
|
240
241
|
original.write((char*)cpuI, bytes);
original.close();
|
c9aba18a
Laila Saadatifard
ivote3 on the GPU...
|
242
|
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
243
|
//allocate space on the cpu for the output result
|
89604e92
Laila Saadatifard
ivote3 run on the...
|
244
|
float* cpu_out = (float*) malloc(bytes);
|
c9aba18a
Laila Saadatifard
ivote3 on the GPU...
|
245
|
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
246
|
// call the ivote function
|
46820b25
Laila Saadatifard
create an obj fil...
|
247
248
|
//ivote3(cpu_out, cpuI, sigma, anisotropy, phi, d_phi, r, iter, t, conn, x, y, z);
ivote3(cpuI, sigma, anisotropy, phi, d_phi, r, iter, t, conn, x, y, z);
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
249
|
//write the blurred file from the cpuI.
|
89604e92
Laila Saadatifard
ivote3 run on the...
|
250
|
std::ofstream fblur("shared2D-v8/vote8.vol", std::ofstream::out | std::ofstream::binary);
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
251
252
|
fblur.write((char*)cpuI, bytes);
fblur.close();
|
a744d027
Laila Saadatifard
upload the ivote3...
|
253
254
255
256
257
258
259
|
//stim::image<float>imgrad3;
//imgrad3.set_interleaved3(cpu_out, 128,128,128,3);
//std::ofstream fgx("syn/gx-128.vol", std::ofstream::out | std::ofstream::binary);
//fgx.write((char*)imgrad3.channel(0).data(), bytes);
//fgx.close();
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
260
|
//write the output file.
|
a744d027
Laila Saadatifard
upload the ivote3...
|
261
262
|
//for (int t0=0; t0<=5000; t0+=100){
// float t1 = t0;
|
46820b25
Laila Saadatifard
create an obj fil...
|
263
264
265
|
int t0 = t;
lmax(cpu_out, cpuI, t, conn, x, y, z);
//std::ofstream fo("shared2D-v8/" + OutName.str(), std::ofstream::out | std::ofstream::binary);
|
a744d027
Laila Saadatifard
upload the ivote3...
|
266
|
std::ofstream fo( OutName.str()+std::to_string(t0)+".vol", std::ofstream::out | std::ofstream::binary);
|
46820b25
Laila Saadatifard
create an obj fil...
|
267
268
|
fo.write((char*)cpu_out, bytes);
fo.close();
|
c9aba18a
Laila Saadatifard
ivote3 on the GPU...
|
269
|
|
94d437dd
Laila Saadatifard
ivote3 code compi...
|
270
|
// creat a file for saving the list centers
|
46820b25
Laila Saadatifard
create an obj fil...
|
271
|
|
3f0e43ce
Laila Saadatifard
compute the local...
|
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
|
std::ofstream list(OutName.str()+std::to_string(t0)+".obj");
// set the number of detected cells to zero.
int nod = 0;
if (list.is_open()){
for (int iz=0; iz<z; iz++){
for (int iy=0; iy<y; iy++){
for (int ix=0; ix<x; ix++){
int idx = iz * x * y + iy * x + ix;
if (cpu_out[idx]>0){
nod++;
list << "v" << "\t" << ix << "\t" << iy << "\t"<< iz << "\t" << cpu_out[idx] << '\n' ;
}
}
}
}
list << "p" << "\t";
for (unsigned int i_nod =1 ; i_nod <=nod; i_nod++){
list << i_nod << "\t";
}
list.close();
}
|
a744d027
Laila Saadatifard
upload the ivote3...
|
299
|
//}
|
f12505fb
Laila Saadatifard
upload the ivote ...
|
300
|
cudaDeviceReset();
|
c9aba18a
Laila Saadatifard
ivote3 on the GPU...
|
301
|
|
c9aba18a
Laila Saadatifard
ivote3 on the GPU...
|
302
|
}
|