51 printf(
"imgMRP(scn, img, %d, %g, %g, %g, %g, %d, %d, %g, %d, %d)\n",
52 imgDim, zoom, shiftX, shiftY, rotation, maxIterNr, skipPriorNr, beta,
58 if(imgDim<2 || imgDim>4096 || imgDim%2)
return(1);
59 if(zoom<0.01 || zoom>1000.)
return(1);
60 if(scn->
dimx<=1 || scn->
dimx>16384)
return(1);
61 if(beta<0.0)
return(1);
62 if(maskDim!=3 && maskDim!=5)
return(1);
68 if(verbose>1) printf(
"allocating memory for the image\n");
73 if(verbose>1) printf(
"setting image header\n");
97 for(plane=0; plane<scn->
dimz; plane++)
102 for(frame=0; frame<scn->
dimt; frame++) {
104 img->
mid[frame]=0.5*(img->
start[frame]+img->
end[frame]);
113 if(verbose>1) printf(
"computing sine tables for back-projection\n");
114 float sinB[3*scn->
dimy/2];
115 float sinBrot[3*scn->
dimy/2];
119 float bpZoom, bpZoomInv;
120 bpZoom=zoom*(float)imgDim/(
float)scn->
dimx;
121 bpZoomInv=1.0/bpZoom;
122 if(verbose>2) printf(
"bpZoom=%g bpZoomInv=%g\n", bpZoom, bpZoomInv);
125 if(verbose>1) printf(
"initialize variables for back-projection\n");
129 offsX=shiftX/pixSize; offsY=shiftY/pixSize;
130 for(
int i=0; i<3*(scn->
dimy)/2; i++) {
132 sinBrot[i]*=bpZoomInv;
135 printf(
"halfDim=%d offsX=%g offsY=%g\n", halfDim, offsX, offsY);
142 if(verbose>1) printf(
"reconstruct one matrix at a time...\n");
144#pragma omp parallel for private(frame)
145 for(plane=0; plane<scn->
dimz; plane++) {
146 for(frame=0; frame<scn->
dimt; frame++) {
150 printf(
"reconstructing plane %d frame %d\n",
161 for(i=0, k=0; i<scn->
dimy; i++)
162 for(j=0; j<scn->
dimx; j++)
163 scnData[k++]=scn->
m[plane][i][j][frame];
165 for(i=0; i<imgDim*imgDim; i++) imgData[i]=0.0;
168 ret=
mrp(scnData, scn->
dimx, scn->
dimy, maxIterNr, osSetNr, maskDim, zoom,
169 beta, skipPriorNr, imgDim, imgData, verbose-3);
171 if(verbose>0) fprintf(stderr,
"mrp() return value %d\n", ret);
178 f=img->
end[frame]-img->
start[frame];
181 for(i=0, k=0; i<img->
dimy; i++)
182 for(j=0; j<img->
dimx; j++)
183 img->
m[plane][i][j][frame] = imgData[k++]*f;
184 if(verbose==1) {fprintf(stdout,
"."); fflush(stdout);}
187 if(verbose==1) {fprintf(stdout,
"\n"); fflush(stdout);}
188 if(failed)
return(8);
190 if(verbose>1) printf(
"imgMRP() done.\n");
292 printf(
"mrp(%d, %d, %d, %d, %d, %g, %g, %d, %d)\n",
293 rays, views, iter, os_sets, maskdim, zoom, beta, skip_prior, dim);
294 if(sinogram==NULL || image==NULL)
return(1);
295 if(rays<2 || views<2 || iter<1 || os_sets<1 || dim<2)
return(1);
296 if(dim%2 || zoom<0.05)
return(2);
297 if(maskdim!=3 && maskdim!=5)
return(2);
302 int views_in_set=views/os_sets;
306 float scale, bp_zoom;
307 recrays=(int)((
float)dim*zoom);
308 bp_zoom=zoom*(float)dim/(
float)recrays;
309 scale=((float)recrays/(float)rays)*bp_zoom*bp_zoom/(
float)views;
311 printf(
" recrays := %d\n", recrays);
312 printf(
" bp_zoom := %g\n", bp_zoom);
313 printf(
" scale := %g\n", scale);
319 printf(
"os_sets :=");
320 for(i=0; i<os_sets; i++) printf(
" %d", seq[i]);
321 printf(
"\n"); fflush(stdout);
326 float sino[recrays*views];
328 float scnset[rays*views];
330 for(
int s=0; s<os_sets; s++) {
331 for(
int j=0; j<views/os_sets; j++) {
332 memcpy((
char*)(scnset + s*rays*views/os_sets + j*rays),
333 (
char*)(sinogram + j*rays*os_sets + s*rays), rays*
sizeof(
float));
341 int scnsize=recrays*views;
346 printf(
" total_counts := %g\n", counts);
347 printf(
" non-zeroes := %d/%d\n", nonzeroNr, scnsize);
353 if(verbose>1) printf(
"creating initial %dx%d image\n", dim, dim);
354 float current_img[imgsize];
355 for(i=0; i<imgsize; i++) image[i]=current_img[i]=0.0;
358 init=counts/(M_PI*(float)((halfdim-1)*(halfdim-1)));
359 for(
int j=halfdim-1; j>=-halfdim; j--) {
360 for(i=-halfdim; i<halfdim; i++) {
361 if((
int)hypot((
double)i, (
double)j) < halfdim-1)
369 if(verbose>1) printf(
"computing sine table\n");
370 float sinB[3*views/2];
372 for(i=0; i<3*views/2; i++) sinB[i]/=bp_zoom;
375 if(verbose>1) {printf(
"iterations\n"); fflush(stdout);}
376 float current_proj[recrays*views_in_set+1];
377 float correction[recrays*views/os_sets];
378 float medcoefs[imgsize], mlcoefs[imgsize];
379 int s, itercount=1, view;
381 if(verbose>3) {printf(
" iteration %d\n", itercount); fflush(stdout);}
383 for(s=0; s<os_sets; s++) {
385 printf(
" os_set %d; seq=%d\n", 1+s, seq[s]);
389 for(i=0; i<recrays*views_in_set; i++) current_proj[i]=0.0;
390 for(i=0; i<views_in_set; i++) {
391 view=seq[s]+i*os_sets;
393 views, recrays, sinB, sinB, 0.0, 0.0, bp_zoom);
397 correction, os_sets, recrays, views);
399 for(i=0; i<imgsize; i++) mlcoefs[i]=0.0;
400 for(i=0; i<views_in_set; i++)
402 seq[s]+i*os_sets, views, recrays, sinB, sinB, 0.0, 0.0, bp_zoom);
404 if(skip_prior<=0 && beta>0.0) {
405 if(verbose>3) {printf(
" applying prior\n"); fflush(stdout);}
407 fMinMaxFin(current_img, imgsize, NULL, &maxv);
408 do_prior(current_img, beta, medcoefs, dim,
409 1.0E-08*maxv, maskdim, &maxm);
411 printf(
" max value in current image := %g\n", maxv);
412 printf(
" max median coefficient := %g\n", maxm);
415 mrpUpdate(medcoefs, mlcoefs, mlcoefs, imgsize);
419 mrpUpdate(mlcoefs, current_img, current_img, imgsize);
422 itercount++; skip_prior--;
423 if(verbose>3) {printf(
" -> next iteration maybe\n"); fflush(stdout);}
424 }
while(itercount<iter);
425 if(verbose>2) {printf(
" iterations done.\n"); fflush(stdout);}
427 for(i=0; i<imgsize; i++) image[i]=current_img[i]*=scale;
429 if(verbose>1) {printf(
"mrp() done.\n"); fflush(stdout);}
int mrp(float *sinogram, int rays, int views, int iter, int os_sets, int maskdim, float zoom, float beta, int skip_prior, int dim, float *image, int verbose)
int imgMRP(IMG *scn, IMG *img, int imgDim, float zoom, float shiftX, float shiftY, float rotation, int maxIterNr, int skipPriorNr, float beta, int maskDim, int osSetNr, int verbose)