51 {
52 PetscInitialize(&argc,&argv,(
char *)0,
help);
53
54 PetscBool flg = PETSC_TRUE;
55 char meta_file_name_1[255];
56 PetscBool meta_flg_file_1 = PETSC_FALSE;
57 char meta_file_name_2[255];
58 PetscBool meta_flg_file_2 = PETSC_FALSE;
59
60 char output_name[255] = "newImage.mhd";
61 PetscBool gauss_flag = PETSC_FALSE;
62
63
64
65 ierr = PetscOptionsBegin(PETSC_COMM_WORLD,
"",
"Meta merge",
"none"); CHKERRQ(
ierr);
66
67
68 ierr = PetscOptionsString(
69 "-meta_image1",
70 "meta image name","",
71 "file.mhd",meta_file_name_1,255,&meta_flg_file_1
73
74 ierr = PetscOptionsString(
75 "-o",
76 "output file","",
77 "newImage.mhd",output_name,255,PETSC_NULL
79
80
81
82 ierr = PetscOptionsString(
83 "-meta_image2",
84 "meta image name","",
85 "file.mhd",meta_file_name_2,255,&meta_flg_file_2
87
88 ierr = PetscOptionsEnd(); CHKERRQ(
ierr);
89 int my_vector[3] = {0, 0, 0};
90 int my_vector_gauss[2] = {3, 2};
91 int nmax = 3;
93 nmax=2;
95
96
97 MetaImage meta_file1(meta_file_name_1);
98 cout << "Quantity of file 1: " << meta_file1.Quantity() << endl;
99 const int *dim_size1 = meta_file1.DimSize();
100 cout << "Image dimension: " << dim_size1[0] << " " << dim_size1[1] << " " << dim_size1[2] << endl;
101 const double *element_size1 = meta_file1.ElementSize();
102 cout << "Image element size: " << element_size1[0] << " " << element_size1[1] << " " << element_size1[2] << endl;
103
104 MetaImage meta_file2(meta_file_name_2);
105 cout << "\nQuantity of file 2: " << meta_file2.Quantity() << endl;
106 const int *dim_size2 = meta_file2.DimSize();
107 cout << "Image dimension: " << dim_size2[0] << " " << dim_size2[1] << " " << dim_size2[2] << endl;
108 const double *element_size2 = meta_file2.ElementSize();
109 cout << "Image element size: " << element_size2[0] << " " << element_size2[1] << " " << element_size2[2] << endl;
110
111 cout<< "\nTranslation vector: " << my_vector[0] << " " << my_vector[1] << " " << my_vector[2] << endl;
112
113
114
115
116
117
118
119
120
121
122 int quantity = meta_file1.Quantity();
123 if(meta_flg_file_2) quantity += meta_file2.Quantity();
124 std::vector<float> data_vec(quantity);
125 float *data = &data_vec[0];
126
127
128
129
130
131
132
133 float sum1 = 0;
134 float sum2= 0;
136 for(int i0 = 0; i0 != dim_size1[2]; i0++) {
137 for(int i1 = 0; i1 != dim_size1[1]; i1++) {
138 for(int i2 = 0; i2 != dim_size1[0]; i2++) {
139
140 vector<float> vec_density, vec_dist;
141 vector<int> vec_ix,vec_iy,vec_iz, vec_idx;
142
143 data[
i] = meta_file1.ElementData(
i);
145
147 i2,i1,i0,
148 my_vector_gauss[0],
149 vec_ix,
150 vec_iy,
151 vec_iz,
152 vec_idx,
153 vec_dist,
154 vec_density,
155 meta_file1
156 );
157
158 if (gauss_flag) {
160 }
162
163
164
165
167 }
168 }
169 }
170
171 if(meta_flg_file_2) {
172
173 for(int i0 = 0; i0 != dim_size2[2]; i0++) {
174 for(int i1 = 0; i1 != dim_size2[1]; i1++) {
175 for(int i2 = 0; i2 != dim_size2[0]; i2++) {
176
177 int z = dim_size2[0]*dim_size2[1] * ((i0 - my_vector[2])%dim_size2[2]);
178 int y = ((i1 - my_vector[1])%dim_size2[1])*dim_size2[1];
179 int x = (i2 - my_vector[0])%dim_size2[0];
180 if (i0 - my_vector[2] >= dim_size2[2] || i1 - my_vector[1] >= dim_size2[1] || i2 - my_vector[0] >= dim_size2[0] ||
181 i0 - my_vector[2] < 0 || i1 - my_vector[1] < 0 || i2 - my_vector[0] < 0){
182 data[
i++] = -1024;
continue;
183 }
184 data[
i++] = meta_file2.ElementData(x + y + z);
185 }
186 }
187 }
188 }
189 int Z_dimensions = dim_size1[2];
190
191 if(meta_flg_file_2) Z_dimensions += dim_size2[2];
192 int global_dimsize[3] = {dim_size1[0], dim_size1[1], Z_dimensions};
193 cout << "MHD converter. Writing file." << endl;
194
195 MetaImage newImage(3, global_dimsize, element_size1, MET_CHAR, 1, data);
196 newImage.FileName(output_name);
197 newImage.ObjectTypeName("Image");
198
199
200 newImage.BinaryData(true);
201 newImage.ElementType(MET_FLOAT);
202 newImage.Write(output_name);
203 if (gauss_flag) printf("Sum without smoothing: %g Sum with smoothing: %g \n",sum1,sum2 );
204 cout << "File saved." << endl;
205
206 newImage.Clear();
207
208
209 PetscFinalize();
210 PetscFunctionReturn(0);
211}
float mapGaussSmooth(const float sigma, const vector< float > &vec_density, const vector< float > &vec_dist)
PetscErrorCode getInidcesForGivenCoordinate(const float x, const float y, const float z, const float size, vector< int > &vec_ix, vector< int > &vec_iy, vector< int > &vec_iz, vector< int > &vec_idx, vector< float > &vec_dist, vector< float > &vec_density, MetaImage &meta_file)
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
PetscErrorCode PetscOptionsGetIntArray(PetscOptions options, const char pre[], const char name[], PetscInt dvalue[], PetscInt *nmax, PetscBool *set)