27 if(verbose>0) printf(
"imgReprojection()\n");
30 int plane, frame, binNr, viewNr;
31 float *scnData, *imgData, *fptr, f;
32 float *sinB, bpZoom, bpZoomInv;
42 scn->
dimx=binNr=288; scn->
dimy=viewNr=144;
45 }
else if(img->
sizez<5.0) {
46 scn->
dimx=binNr=281; scn->
dimy=viewNr=336;
50 scn->
dimx=binNr=192; scn->
dimy=viewNr=256;
58 if(verbose>1) printf(
"allocating memory for sinogram\n");
65 scn->
unit=CUNIT_COUNTS;
69 for(plane=0; plane<img->
dimz; plane++)
74 for(frame=0; frame<img->
dimt; frame++) {
76 scn->
mid[frame]=0.5*(scn->
start[frame]+scn->
end[frame]);
84 if(verbose>1) printf(
"allocating memory for matrix data\n");
85 scnData=(
float*)calloc(scn->
dimx*scn->
dimy,
sizeof(
float));
86 imgData=(
float*)calloc(img->
dimx*img->
dimy,
sizeof(
float));
87 if(scnData==NULL || imgData==NULL)
return(4);
89 sinB=(
float*)calloc((3*viewNr/2),
sizeof(
float));
90 if(sinB==NULL) {free((
char*)scnData); free((
char*)imgData);
return(4);}
93 bpZoom=img->
zoom*(float)img->
dimx/(
float)binNr; bpZoomInv=1.0/bpZoom;
94 if(verbose>1) printf(
"bpZoom=%g bpZoomInv=%g\n", bpZoom, bpZoomInv);
96 for(i=0; i<3*viewNr/2; i++) sinB[i]*=bpZoomInv;
102 if(verbose>1) {printf(
"reprojection of matrices\n"); fflush(stdout);}
103 for(plane=0; plane<img->
dimz; plane++)
for(frame=0; frame<img->
dimt; frame++) {
105 printf(
" plane %d frame %d\n", img->
planeNumber[plane], frame+1);
111 f=img->
end[frame]-img->
start[frame];
if(f<1.0) f=1.0;
116 for(i=0, fptr=imgData; i<img->
dimy; i++)
for(j=0; j<img->
dimx; j++)
117 *fptr++ = f*img->
m[plane][i][j][frame];
120 memset(scnData, 0, scn->
dimx*scn->
dimy*
sizeof(
float));
123 for(i=0; i<viewNr; i++) {
125 img->
dimx, viewNr, binNr, sinB, sinB, 0.0, 0.0, bpZoom);
135 f=bpZoomInv*bpZoomInv;
136 for(i=0, fptr=scnData; i<viewNr; i++)
for(j=0; j<binNr; j++)
137 scn->
m[plane][i][j][frame] = *fptr++ * f;
140 if(verbose>1) {printf(
" reprojection done.\n"); fflush(stdout);}
141 free(imgData); free(scnData); free(sinB);
172 printf(
"reprojection(%d, %d, %d, %g)\n", dim, rays, views, bpzoom);
175 if(image==NULL || rays<2 || views<2 || dim<2 || sinogram==NULL)
return(1);
177 if(bpzoom<0.1)
return(3);
182 for(i=0; i<rays*views; i++) sinogram[i]=0.0;
186 bpzoomInv=1.0/bpzoom;
189 float sinB[3*views/2];
191 for(i=0; i<3*views/2; i++) sinB[i]*=bpzoomInv;
194 for(i=0; i<views; i++) {
195 if(verbose>1) {printf(
" reprojecting angle %d\n", 1+i); fflush(stdout);}
197 dim, views, rays, sinB, sinB, 0.0, 0.0, bpzoom);
241 float *iOrigin, sir, cor, si, co, tpow2, t, *imgp, fract, rayCenter, toffs;
242 int x, y, yBottom, xRight, halfdim, ti;
245 fprintf(stderr,
"Error in viewReprojection(): view=%d >= %d\n", view, viewNr);
252 iOrigin= idata + dim*(halfdim-1) + halfdim;
255 co=sinB[viewNr/2+view]*offsX;
258 cor=sinBrot[viewNr/2+view];
261 rayCenter=(float)rayNr/2.0;
262 if((
float)y>rayCenter*bpZoom) {
263 y=(int)(rayCenter*bpZoom);
268 toffs=rayCenter-si+co;
269 tpow2=rayCenter*rayCenter*bpZoom*bpZoom;
270 for(; y>=yBottom; y--) {
271 xRight=(int)sqrt(tpow2-((
float)y+0.5)*((
float)y+0.5)) + 1;
272 if(xRight>=halfdim) {
279 t=toffs - (float)y*sir + ((
float)(x+1))*cor;
280 imgp=iOrigin-y*dim+x;
281 for(; x<=xRight; x++, t+=cor, imgp++) {
284 sdata[ti] += *imgp * (1.0-fract);
285 sdata[ti+1] += *imgp * fract;
300 float tmp, prev=0.0, w;
303 for(i=1; i<n-1; i++) {
304 tmp=(data[i-1] + data[i] + data[i+1])*w;
308 data[i-1]=prev; data[i]=0.0;
321 float tmp, prev2, prev, w;
323 prev=prev2=data[2]; w=0.2;
324 for(i=2; i<n-2; i++) {
325 tmp=(data[i-2] + data[i-1] + data[i] + data[i+1] + data[i+2])*w;
330 data[i-2]=prev2; data[i-1]=prev;
343 float me, prev=0.0, a, b, c;
345 for(i=1; i<n-1; i++) {
346 a=data[i-1]; b=data[i]; c=data[i+1];
347 if(a>=b && a<=c) me=a;
348 else if(b>=a && b<=c) me=b;
353 data[i-1]=prev; data[i]=0.0;
385 float *iOrigin=idata+dim*(halfdim-1)+halfdim;
386 float si, co, sir, cor;
389 co=sinB[viewNr/2+view]*offsX;
392 cor=sinBrot[viewNr/2+view];
395 float rayCenter, toffs, tpow2;
396 int x, y, yBottom, xRight;
397 rayCenter=(float)rayNr/2.0;
399 if((
float)y>rayCenter*bpZoom) {
400 y=(int)(rayCenter*bpZoom);
405 toffs=rayCenter-si+co;
407 float *iptr, fract, t;
409 tpow2=rayCenter*rayCenter*bpZoom*bpZoom;
410 for(; y>=yBottom; y--) {
411 xRight=(int)sqrt(tpow2-((
float)y+0.5)*((
float)y+0.5)) + 1;
412 if(xRight>=halfdim) {
419 t=toffs - (float)y*sir + ((
float)(x+1))*cor;
420 iptr=iOrigin-y*dim+x;
421 for(; x<=xRight; x++, t+=cor, iptr++) {
424 *iptr+= prj[ti] + (prj[ti+1] - prj[ti])*fract;
int imgAllocate(IMG *image, int planes, int rows, int columns, int frames)
void imgEmpty(IMG *image)
#define IMG_STATUS_OCCUPIED
Header file for libtpcrec.
void recSinTables(int views, float *sinB, float *sinBrot, float rotation)
void reprojectionMed3(float *data, int n)
void viewBackprojection(float *prj, float *idata, int dim, int view, int viewNr, int rayNr, float *sinB, float *sinBrot, float offsX, float offsY, float bpZoom)
void viewReprojection(float *idata, float *sdata, int view, int dim, int viewNr, int rayNr, float *sinB, float *sinBrot, float offsX, float offsY, float bpZoom)
void reprojectionAvg3(float *data, int n)
int reprojection(float *image, int dim, int rays, int views, float bpzoom, float *sinogram, int verbose)
int imgReprojection(IMG *img, IMG *scn, int verbose)
void reprojectionAvg5(float *data, int n)
char radiopharmaceutical[32]
char studyNr[MAX_STUDYNR_LEN+1]