48 printf(
"imgMRP(scn, img, %d, %g, %g, %g, %g, %d, %d, %g, %d, %d)\n",
49 imgDim, zoom, shiftX, shiftY, rotation, maxIterNr, skipPriorNr, beta,
55 if(imgDim<2 || imgDim>4096 || imgDim%2)
return(1);
56 if(zoom<0.01 || zoom>1000.)
return(1);
57 if(scn->
dimx<=1 || scn->
dimx>16384)
return(1);
58 if(beta<0.0)
return(1);
59 if(maskDim!=3 && maskDim!=5)
return(1);
65 if(verbose>1) printf(
"allocating memory for the image\n");
70 if(verbose>1) printf(
"setting image header\n");
94 for(plane=0; plane<scn->
dimz; plane++)
99 for(frame=0; frame<scn->
dimt; frame++) {
101 img->
mid[frame]=0.5*(img->
start[frame]+img->
end[frame]);
110 if(verbose>1) printf(
"computing sine tables for back-projection\n");
111 float sinB[3*scn->
dimy/2];
112 float sinBrot[3*scn->
dimy/2];
116 float bpZoom, bpZoomInv;
117 bpZoom=zoom*(float)imgDim/(
float)scn->
dimx;
118 bpZoomInv=1.0/bpZoom;
119 if(verbose>2) printf(
"bpZoom=%g bpZoomInv=%g\n", bpZoom, bpZoomInv);
122 if(verbose>1) printf(
"initialize variables for back-projection\n");
126 offsX=shiftX/pixSize; offsY=shiftY/pixSize;
127 for(
int i=0; i<3*(scn->
dimy)/2; i++) {
129 sinBrot[i]*=bpZoomInv;
132 printf(
"halfDim=%d offsX=%g offsY=%g\n", halfDim, offsX, offsY);
139 if(verbose>1) printf(
"reconstruct one matrix at a time...\n");
141#pragma omp parallel for private(frame)
142 for(plane=0; plane<scn->
dimz; plane++) {
143 for(frame=0; frame<scn->
dimt; frame++) {
147 printf(
"reconstructing plane %d frame %d\n",
158 for(i=0, k=0; i<scn->
dimy; i++)
159 for(j=0; j<scn->
dimx; j++)
160 scnData[k++]=scn->
m[plane][i][j][frame];
162 for(i=0; i<imgDim*imgDim; i++) imgData[i]=0.0;
165 ret=
mrp(scnData, scn->
dimx, scn->
dimy, maxIterNr, osSetNr, maskDim, zoom,
166 beta, skipPriorNr, imgDim, imgData, verbose-3);
168 if(verbose>0) fprintf(stderr,
"mrp() return value %d\n", ret);
175 f=img->
end[frame]-img->
start[frame];
178 for(i=0, k=0; i<img->
dimy; i++)
179 for(j=0; j<img->
dimx; j++)
180 img->
m[plane][i][j][frame] = imgData[k++]*f;
181 if(verbose==1) {fprintf(stdout,
"."); fflush(stdout);}
184 if(verbose==1) {fprintf(stdout,
"\n"); fflush(stdout);}
185 if(failed)
return(8);
187 if(verbose>1) printf(
"imgMRP() done.\n");
289 printf(
"mrp(%d, %d, %d, %d, %d, %g, %g, %d, %d)\n",
290 rays, views, iter, os_sets, maskdim, zoom, beta, skip_prior, dim);
291 if(sinogram==NULL || image==NULL)
return(1);
292 if(rays<2 || views<2 || iter<1 || os_sets<1 || dim<2)
return(1);
293 if(dim%2 || zoom<0.05)
return(2);
294 if(maskdim!=3 && maskdim!=5)
return(2);
299 int views_in_set=views/os_sets;
303 float scale, bp_zoom;
304 recrays=(int)((
float)dim*zoom);
305 bp_zoom=zoom*(float)dim/(
float)recrays;
306 scale=((float)recrays/(float)rays)*bp_zoom*bp_zoom/(
float)views;
308 printf(
" recrays := %d\n", recrays);
309 printf(
" bp_zoom := %g\n", bp_zoom);
310 printf(
" scale := %g\n", scale);
316 printf(
"os_sets :=");
317 for(i=0; i<os_sets; i++) printf(
" %d", seq[i]);
318 printf(
"\n"); fflush(stdout);
323 float sino[recrays*views];
325 float scnset[rays*views];
327 for(
int s=0; s<os_sets; s++) {
328 for(
int j=0; j<views/os_sets; j++) {
329 memcpy((
char*)(scnset + s*rays*views/os_sets + j*rays),
330 (
char*)(sinogram + j*rays*os_sets + s*rays), rays*
sizeof(
float));
338 int scnsize=recrays*views;
343 printf(
" total_counts := %g\n", counts);
344 printf(
" non-zeroes := %d/%d\n", nonzeroNr, scnsize);
350 if(verbose>1) printf(
"creating initial %dx%d image\n", dim, dim);
351 float current_img[imgsize];
352 for(i=0; i<imgsize; i++) image[i]=current_img[i]=0.0;
355 init=counts/(M_PI*(float)((halfdim-1)*(halfdim-1)));
356 for(
int j=halfdim-1; j>=-halfdim; j--) {
357 for(i=-halfdim; i<halfdim; i++) {
358 if((
int)hypot((
double)i, (
double)j) < halfdim-1)
366 if(verbose>1) printf(
"computing sine table\n");
367 float sinB[3*views/2];
369 for(i=0; i<3*views/2; i++) sinB[i]/=bp_zoom;
372 if(verbose>1) {printf(
"iterations\n"); fflush(stdout);}
373 float current_proj[recrays*views_in_set+1];
374 float correction[recrays*views/os_sets];
375 float medcoefs[imgsize], mlcoefs[imgsize];
376 int s, itercount=1, view;
378 if(verbose>3) {printf(
" iteration %d\n", itercount); fflush(stdout);}
380 for(s=0; s<os_sets; s++) {
382 printf(
" os_set %d; seq=%d\n", 1+s, seq[s]);
386 for(i=0; i<recrays*views_in_set; i++) current_proj[i]=0.0;
387 for(i=0; i<views_in_set; i++) {
388 view=seq[s]+i*os_sets;
390 views, recrays, sinB, sinB, 0.0, 0.0, bp_zoom);
394 correction, os_sets, recrays, views);
396 for(i=0; i<imgsize; i++) mlcoefs[i]=0.0;
397 for(i=0; i<views_in_set; i++)
399 seq[s]+i*os_sets, views, recrays, sinB, sinB, 0.0, 0.0, bp_zoom);
401 if(skip_prior<=0 && beta>0.0) {
402 if(verbose>3) {printf(
" applying prior\n"); fflush(stdout);}
404 fMinMaxFin(current_img, imgsize, NULL, &maxv);
405 do_prior(current_img, beta, medcoefs, dim,
406 1.0E-08*maxv, maskdim, &maxm);
408 printf(
" max value in current image := %g\n", maxv);
409 printf(
" max median coefficient := %g\n", maxm);
412 mrpUpdate(medcoefs, mlcoefs, mlcoefs, imgsize);
416 mrpUpdate(mlcoefs, current_img, current_img, imgsize);
419 itercount++; skip_prior--;
420 if(verbose>3) {printf(
" -> next iteration maybe\n"); fflush(stdout);}
421 }
while(itercount<iter);
422 if(verbose>2) {printf(
" iterations done.\n"); fflush(stdout);}
424 for(i=0; i<imgsize; i++) image[i]=current_img[i]*=scale;
426 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)