217 RADON *radtra,
int set,
int setNr,
float *imgdata,
float *scndata
219 float *imgptr, *scnptr;
220 float *Y, *X, *Xptr, *Yptr;
221 double sinus, cosinus, tanus;
222 double shift_x, shift_y;
224 int xp, xn, yp, yn, z;
225 int x_left, x_right, y_top, y_bottom;
226 int col, row, view, bin;
227 int binNr, viewNr, imgDim, mode;
228 int half, center = -1;
230 float dx, dy , loi = 1;
233 printf(
"RADON: radonFwdTransform() started.\n");
238 if(radtra->
status != RADON_STATUS_INITIALIZED)
return -1;
250 X=(
float*)calloc(imgDim+1,
sizeof(
float));
252 Y=(
float*)calloc(imgDim+1,
sizeof(
float));
253 if(X==NULL || Y==NULL){
270 for(view=set; view<=viewNr/4; view=view+setNr){
281 for(bin=0; bin<half; bin++){
282 col = floor((
float)(bin+.5*sdist)*sdist);
287 for(row=0; row<imgDim; row++) {
289 scnptr[bin] += loi * imgptr[row*imgDim + col];
291 scnptr[binNr-bin-1] += loi * imgptr[row*imgDim + (imgDim - 1 - col)];
293 scnptr[binNr*(viewNr/2) + bin] +=
294 loi * imgptr[(imgDim - 1 - col)*imgDim + row];
296 scnptr[binNr*(viewNr/2) + (binNr-bin-1)] +=
297 loi * imgptr[col*imgDim + row];
306 cosinus = (double)
radonGetSin(radtra,viewNr/2 + view);
307 tanus = sinus/cosinus;
312 shift_y = -(imgDim/2 -.5*sdist)/sinus;
313 shift_x = -(imgDim/2 -.5*sdist)/cosinus;
319 for(col=0; col<imgDim+1; col++){
320 Yptr[col]=(float)(shift_y - z/tanus);
321 Xptr[col]=(float)(shift_x - z*tanus);
326 shift_y = (double)(sdist/sinus);
327 shift_x = (double)(sdist/cosinus);
330 scalef = sinus + cosinus;
338 for(bin=0; bin<half; bin++) {
345 x_left = floor((
float)(Xptr[imgDim] + bin*shift_x + imgDim/2));
346 if(x_left < 0) x_left = 0;
348 x_right = floor((
float)(Xptr[0] + bin*shift_x + imgDim/2));
349 if(x_right <= 0) x_right = 1;
350 if(x_right > imgDim) x_right = imgDim - 1;
354 for(z=x_left; z <= x_right; z++) {
357 xn = imgDim - 1 - xp;
360 yp = imgDim/2 - floor(Yptr[xp + 1] + bin*shift_y) - 1;
361 yn = imgDim - 1 - yp;
364 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
365 xp < imgDim && xn < imgDim && xn >= 0)
372 dx = fabs((
float)(xp + 1 - (imgDim/2 + Xptr[imgDim - yp] +
374 dy = fabs((
float)(floor(Yptr[xp + 1] + bin*shift_y) + 1 -
375 (Yptr[xp + 1] + bin*shift_y)));
376 if(dx > 1 || dx < 0) dx = 1;
377 if(dy > 1 || dy < 0) dy = 1;
378 loi = sqrt(dx*dx + dy*dy);
382 scnptr[view*binNr + bin] += loi * imgptr[yp*imgDim + xp];
385 scnptr[view*binNr + binNr - 1 - bin] +=
386 loi * imgptr[yn*imgDim + xn];
388 if(view != viewNr/4) {
392 scnptr[(viewNr - view)*binNr + bin] +=
393 loi * imgptr[yp*imgDim + xn];
396 scnptr[(viewNr-view)*binNr + binNr - 1 - bin] +=
397 loi * imgptr[yn*imgDim + xp];
402 scnptr[(viewNr/2 - view)*binNr + bin] +=
403 loi * imgptr[xn*imgDim + yn];
406 scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin] +=
407 loi * imgptr[xp*imgDim + yp];
413 scnptr[(viewNr/2 + view)*binNr + bin] +=
414 loi * imgptr[xn*imgDim + yp];
417 scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin] +=
418 loi * imgptr[xp*imgDim + yn];
424 y_bottom = floor((
float)(Yptr[imgDim] + bin*shift_y + imgDim/2));
425 if(y_bottom < 0) y_bottom = 0;
426 if(y_bottom > imgDim) y_bottom = 0;
428 y_top = floor((
float)(Yptr[0] + bin*shift_y + imgDim/2));
429 if(y_top > imgDim) y_top = imgDim-1;
430 if(y_top <= 0) y_top = 1;
434 for(z=y_top; z >= y_bottom; z--) {
437 xp = floor(Xptr[z] + bin*shift_x) + imgDim/2;
438 xn = imgDim - 1 - xp;
441 yn = imgDim - yp - 1;
444 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
445 xp < imgDim && xn < imgDim && xn >= 0)
451 dx = (float)(Xptr[z] + bin*shift_x + imgDim/2 - xp);
452 dy = (float)(Yptr[xp] + bin*shift_y - z + imgDim/2);
453 if(dy > 1 || dy < 0){
454 dx = dx - (float)(Xptr[z+1] + bin*shift_x + imgDim/2 - xp);
457 loi = sqrt(dx*dx + dy*dy);
462 scnptr[view*binNr + bin] += loi * imgptr[yp*imgDim + xp];
465 scnptr[view*binNr + binNr - 1 - bin] +=
466 loi * imgptr[yn*imgDim + xn];
468 if(view != viewNr/4) {
472 scnptr[(viewNr - view)*binNr + bin] += loi * imgptr[yp*imgDim + xn];
475 scnptr[(viewNr-view)*binNr + binNr - 1 - bin] +=
476 loi * imgptr[yn*imgDim + xp];
481 scnptr[(viewNr/2 - view)*binNr + bin] +=
482 loi * imgptr[xn*imgDim + yn];
485 scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin] +=
486 loi * imgptr[xp*imgDim + yp];
492 scnptr[(viewNr/2 + view)*binNr + bin] += loi * imgptr[xn*imgDim + yp];
495 scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin] +=
496 loi * imgptr[xp*imgDim + yn];
503 scnptr[view*binNr + bin] /= scalef;
505 scnptr[view*binNr + binNr - 1 - bin] /= scalef;
507 if(view != viewNr/4){
510 scnptr[(viewNr - view)*binNr + bin] /= scalef;
512 scnptr[(viewNr-view)*binNr + binNr - 1 - bin] /= scalef;
516 scnptr[(viewNr/2 - view)*binNr + bin] /= scalef;
518 scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin] /= scalef;
523 scnptr[(viewNr/2 + view)*binNr + bin] /= scalef;
525 scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin] /= scalef;
534 printf(
"RADON: radonFwdTransform() finished.\n");
550 RADON *radtra,
int set,
int setNr,
float *imgdata,
float *scndata)
552 float *imgptr, *scnptr;
553 float *Y, *X, *Xptr, *Yptr;
554 double sinus, cosinus, tanus;
555 double shift_x, shift_y;
556 int xp, xn, yp, yn, z, xp2;
557 int x_left, x_right, y_top, y_bottom;
558 int col, col1, col2, row, view, bin;
559 int binNr, viewNr, imgDim, errors=0;
560 int half, center = -1;
562 float a=0,b=0, c=0, d=0, g=0, h=0, A;
563 float dx, dy , eps1 = 0, eps2 = 0, eps3 = 0;
566 printf(
"RADON: radonFwdTransformEA() started.\n");
571 if(radtra->
status != RADON_STATUS_INITIALIZED)
return -1;
583 X=(
float*)calloc(imgDim+1,
sizeof(
float));
585 Y=(
float*)calloc(imgDim+1,
sizeof(
float));
586 if(X==NULL || Y==NULL){
603 for(view=set; view<=viewNr/4; view=view+setNr){
612 for(bin = 0; bin < half; bin++){
615 col2 = floor((
float)(bin + 1)*sdist);
623 if((col2-col1) == 1){
624 eps1 = (float)(col2 - (bin)*sdist);
626 eps3 = (float)((bin+1)*sdist - col2);
631 eps1 = (float)(col1 + 1 - (bin)*sdist);
633 eps3 = (float)((bin+1)*sdist - col2);
640 for(row=0; row<imgDim; row++) {
643 scnptr[bin] += eps1 * imgptr[row*imgDim + col1];
645 scnptr[binNr-bin-1] +=
646 eps1 * imgptr[row*imgDim + (imgDim - 1 - col1)];
648 scnptr[binNr*(viewNr/2) + bin] +=
649 eps1 * imgptr[(imgDim - 1 - col1)*imgDim + row];
651 scnptr[binNr*(viewNr/2) + (binNr-bin-1)] +=
652 eps1 * imgptr[col1*imgDim + row];
656 scnptr[bin] += eps1 * imgptr[row*imgDim + col1] +
657 eps3 * imgptr[row*imgDim + col2];
659 scnptr[binNr-bin-1] +=
660 eps1 * imgptr[row*imgDim + (imgDim - 1 - col1)] +
661 eps3*imgptr[row*imgDim+(imgDim-1-col2)];
663 scnptr[binNr*(viewNr/2) + bin] +=
664 eps1*imgptr[(imgDim-1-col1)*imgDim+row] +
665 eps3*imgptr[(imgDim-1-col2)*imgDim+row];
667 scnptr[binNr*(viewNr/2) + (binNr-bin-1)] +=
668 eps1 * imgptr[col1*imgDim + row] +
669 eps3 * imgptr[col2*imgDim + row] ;
673 for(col = col1; col<=col2; col++) {
675 scnptr[bin] += eps1 * imgptr[row*imgDim + col1];
677 scnptr[binNr-bin-1] += eps1 * imgptr[row*imgDim +
678 (imgDim - 1 - col1)];
679 scnptr[binNr*(viewNr/2) + bin] +=
680 eps1 * imgptr[(imgDim - 1 - col1)*imgDim + row];
682 scnptr[binNr*(viewNr/2) + (binNr-bin-1)] +=
683 eps1 * imgptr[col1*imgDim + row];
686 scnptr[bin] += eps3 * imgptr[row*imgDim + col2];
688 scnptr[binNr-bin-1] += eps3 * imgptr[row*imgDim +
689 (imgDim - 1 - col2)];
690 scnptr[binNr*(viewNr/2) + bin] +=
691 eps3 * imgptr[(imgDim - 1 - col2)*imgDim + row];
693 scnptr[binNr*(viewNr/2) + (binNr-bin-1)] +=
694 eps3 * imgptr[col2*imgDim + row];
696 if(col != col1 && col != col2) {
697 scnptr[bin] += eps2 * imgptr[row*imgDim + col];
699 scnptr[binNr-bin-1] +=
700 eps2 * imgptr[row*imgDim + (imgDim - 1 - col)];
701 scnptr[binNr*(viewNr/2) + bin] +=
702 eps2 * imgptr[(imgDim - 1 - col)*imgDim + row];
704 scnptr[binNr*(viewNr/2) + (binNr-bin-1)] +=
705 eps2 * imgptr[col*imgDim + row];
716 cosinus = (double)
radonGetSin(radtra,viewNr/2 + view);
717 tanus = sinus/cosinus;
722 shift_y = -(imgDim/2)/sinus;
723 shift_x = -(imgDim/2)/cosinus;
729 for(col=0; col<imgDim+1; col++){
730 Yptr[col]=(float)(-z/tanus + shift_y);
731 Xptr[col]=(float)(-z*tanus + shift_x);
736 shift_y = (double)(sdist/sinus);
737 shift_x = (double)(sdist/cosinus);
744 for(bin=0; bin<half; bin++){
749 x_left = floor((
float)(Xptr[imgDim] + bin*shift_x + imgDim/2));
750 if(x_left < 0) x_left = 0;
752 x_right = floor((
float)(Xptr[0] + bin*shift_x + imgDim/2));
753 if(x_right <= 0) x_right = 1;
754 if(x_right > imgDim) x_right = imgDim - 1;
758 for(z=x_left; z <= x_right; z++) {
761 xn = imgDim - 1 - xp;
764 yp = imgDim/2 - floor(Yptr[xp + 1] + bin*shift_y) - 1;
765 yn = imgDim - 1 - yp;
768 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
769 xp < imgDim && xn < imgDim && xn >= 0)
774 a = (float)(xp + 1 - (imgDim/2 + Xptr[imgDim - yp] + bin*shift_x));
775 b = (float)(floor(Yptr[xp + 1] + bin*shift_y) + 1 - (Yptr[xp + 1] +
781 c = (float)(xp + 1 - (imgDim/2 + Xptr[imgDim - yp] +
785 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
786 (Yptr[xp + 1] + (bin+1)*shift_y));
793 printf(
"RADON: Error in factor: eps1=%.5f \n",eps1);
799 scnptr[view*binNr + bin] += eps1 * imgptr[yp*imgDim + xp];
802 scnptr[view*binNr + binNr - 1 - bin] +=
803 eps1 * imgptr[yn*imgDim + xn];
805 if(view != viewNr/4){
809 scnptr[(viewNr - view)*binNr + bin] +=
810 eps1 * imgptr[yp*imgDim + xn];
813 scnptr[(viewNr-view)*binNr + binNr - 1 - bin] +=
814 eps1 * imgptr[yn*imgDim + xp];
819 scnptr[(viewNr/2 - view)*binNr + bin] +=
820 eps1 * imgptr[xn*imgDim + yn];
823 scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin] +=
824 eps1 * imgptr[xp*imgDim + yp];
830 scnptr[(viewNr/2 + view)*binNr + bin] +=
831 eps1 * imgptr[xn*imgDim + yp];
834 scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin] +=
835 eps1 * imgptr[xp*imgDim + yn];
841 y_bottom = floor((
float)(Yptr[imgDim] + bin*shift_y + imgDim/2));
842 if(y_bottom < 0) y_bottom = 0;
843 if(y_bottom > imgDim) y_bottom = 0;
845 y_top = floor((
float)(Yptr[0] + bin*shift_y + imgDim/2));
846 if(y_top > imgDim) y_top = imgDim;
847 if(y_top <= 0) y_top = 1;
851 for(z=y_top; z >= y_bottom; z--) {
854 xp = floor(Xptr[z] + bin*shift_x) + imgDim/2;
855 xn = imgDim - 1 - xp;
858 yn = imgDim - yp - 1;
861 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
862 xp < imgDim && xn < imgDim && xn >= 0)
865 dx = (float)(Xptr[z] + bin*shift_x + imgDim/2 - xp);
866 dy = (float)(Yptr[xp] + bin*shift_y - z + imgDim/2);
880 xp2 =floor(Xptr[z+1] + (bin+1)*shift_x) + imgDim/2;
883 c = (float)(xp + 1 - (imgDim/2 + Xptr[z+1] +
886 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
887 (Yptr[xp + 1] + (bin+1)*shift_y));
888 eps1 = 1 - (a*b + c*d)/2;
891 eps3 = (1 - d)*(b + shift_x - 1)/2;
892 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
894 "4: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
895 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
901 dy = (float)(Yptr[xp+1] + (bin+1)*shift_y - (z + 1) +
907 d = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
911 dx = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
917 c = dx - (float)(xp + 2 - (imgDim/2 + Xptr[z+2] +
923 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+2] +
926 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) + 2 -
927 (Yptr[xp + 2] + (bin+1)*shift_y));
934 dx = (float)(xp + 2 - (imgDim/2 + Xptr[z] + (bin+1)*shift_x));
939 c = dx - (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
945 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
948 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) + 1 -
949 (Yptr[xp + 2] + (bin+1)*shift_y));
953 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
955 "3/v%i: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
956 view,xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
960 c = g - (imgDim/2 + Xptr[z+1] + (bin+1)*shift_x - xp);
963 eps1 = g*h - (a*b + c*d)/2;
966 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
968 "5: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
969 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
976 eps1 = (g*h - a*b)/2;
979 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1) &&
981 "6: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
982 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
989 b = dx - (float)(Xptr[z+1] + bin*shift_x + imgDim/2 - xp);
995 g = 1 - (float)(Xptr[z+1] + bin*shift_x + imgDim/2 - xp);
997 xp2 = floor(Xptr[z+1] + (bin+1)*shift_x) + imgDim/2;
1000 c = (float)(xp + 1 - (imgDim/2 + Xptr[z+1] +
1003 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
1004 (Yptr[xp + 1] + (bin+1)*shift_y));
1005 eps1 = g*h - (a*b + c*d)/2;
1008 eps3 = (1 - d)*((Xptr[z] + (bin+1)*shift_x + imgDim/2) -
1010 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
1012 "8: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
1013 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
1021 dx = (float)((imgDim/2 + Xptr[z] + (bin+1)*shift_x) - (xp+1));
1026 c = (float)((imgDim/2 + Xptr[z+1] + (bin+1)*shift_x) -
1030 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 ||
1032 "2/10: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
1033 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
1036 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
1039 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) + 1 -
1040 (Yptr[xp + 2] + (bin+1)*shift_y));
1043 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 ||
1045 "2/9: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
1046 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
1051 eps1 = sdist/cosinus;
1054 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
1056 "7: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
1057 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
1063 scnptr[view*binNr + bin] += eps1 * imgptr[yp*imgDim + xp];
1066 scnptr[view*binNr + binNr - 1 - bin] +=
1067 eps1 * imgptr[yn*imgDim + xn];
1068 if(view != viewNr/4){
1072 scnptr[(viewNr - view)*binNr + bin] +=
1073 eps1 * imgptr[yp*imgDim + xn];
1076 scnptr[(viewNr-view)*binNr + binNr - 1 - bin] +=
1077 eps1 * imgptr[yn*imgDim + xp];
1082 scnptr[(viewNr/2 - view)*binNr + bin] +=
1083 eps1 * imgptr[xn*imgDim + yn];
1086 scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin] +=
1087 eps1 * imgptr[xp*imgDim + yp];
1093 scnptr[(viewNr/2 + view)*binNr + bin] +=
1094 eps1 * imgptr[xn*imgDim + yp];
1097 scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin] +=
1098 eps1 * imgptr[xp*imgDim + yn];
1101 if(xp + 1 < imgDim && xn - 1 >= 0){
1104 scnptr[view*binNr + bin] +=
1105 eps1 * imgptr[yp*imgDim + xp] +
1106 eps3 * imgptr[yp*imgDim + xp+1];
1109 scnptr[view*binNr + binNr - 1 - bin] +=
1110 eps1 * imgptr[yn*imgDim + xn] +
1111 eps3 * imgptr[yn*imgDim + xn-1];
1112 if(view != viewNr/4) {
1116 scnptr[(viewNr - view)*binNr + bin] +=
1117 eps1 * imgptr[yp*imgDim + xn] +
1118 eps3 * imgptr[yp*imgDim + xn-1];
1121 scnptr[(viewNr-view)*binNr + binNr - 1 - bin] +=
1122 eps1 * imgptr[yn*imgDim + xp] +
1123 eps3 * imgptr[yn*imgDim + xp+1];
1128 scnptr[(viewNr/2 - view)*binNr + bin] +=
1129 eps1 * imgptr[xn*imgDim + yn] +
1130 eps3 * imgptr[(xn-1)*imgDim + yn];
1134 scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin] +=
1135 eps1 * imgptr[xp*imgDim + yp] +
1136 eps3*imgptr[(xp+1)*imgDim+yp];
1141 scnptr[(viewNr/2 + view)*binNr + bin] +=
1142 eps1 * imgptr[xn*imgDim + yp] +
1143 eps3 * imgptr[(xn-1)*imgDim + yp];
1146 scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin] +=
1147 eps1 * imgptr[xp*imgDim + yn] +
1148 eps3*imgptr[(xp+1)*imgDim+yn];
1151 if(xp + 1 < imgDim && xn - 1 >= 0 && yp-1 >= 0 && yn+1 < imgDim) {
1154 scnptr[view*binNr + bin] +=
1155 eps1 * imgptr[yp*imgDim + xp] +
1156 eps3 * imgptr[yp*imgDim + xp+1] +
1157 eps2 * imgptr[(yp-1)*imgDim + xp+1];
1160 scnptr[view*binNr + binNr - 1 - bin] +=
1161 eps1 * imgptr[yn*imgDim + xn] +
1162 eps3 * imgptr[yn*imgDim + xn-1] +
1163 eps2 * imgptr[(yn+1)*imgDim + xn-1];
1165 if(view != viewNr/4){
1169 scnptr[(viewNr - view)*binNr + bin] +=
1170 eps1 * imgptr[yp*imgDim + xn] +
1171 eps3 * imgptr[yp*imgDim + xn-1] +
1172 eps2 * imgptr[(yp-1)*imgDim + xn-1];
1175 scnptr[(viewNr-view)*binNr + binNr - 1 - bin] +=
1176 eps1 * imgptr[yn*imgDim + xp] +
1177 eps3 * imgptr[yn*imgDim + xp+1] +
1178 eps2 * imgptr[(yn+1)*imgDim + xp+1];
1183 scnptr[(viewNr/2 - view)*binNr + bin] +=
1184 eps1 * imgptr[xn*imgDim + yn] +
1185 eps3 * imgptr[xn*imgDim + yn-1] +
1186 eps2 * imgptr[(xn-1)*imgDim + (yn+1)];
1189 scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin] +=
1190 eps1 * imgptr[xp*imgDim + yp] +
1191 eps3*imgptr[(xp+1)*imgDim+yp] +
1192 eps2*imgptr[(xp+1)*imgDim+(yp-1)];
1198 scnptr[(viewNr/2 + view)*binNr + bin] +=
1199 eps1 * imgptr[xn*imgDim + yp] +
1200 eps3 * imgptr[(xn-1)*imgDim + yp] +
1201 eps2 * imgptr[(xn-1)*imgDim + (yp-1)];
1204 scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin] +=
1205 eps1 * imgptr[xp*imgDim + yn] +
1206 eps3*imgptr[(xp+1)*imgDim+yn] +
1207 eps2*imgptr[(xp+1)*imgDim+yn+1];
1219 printf(
"RADON: radonFwdTransformEA() finished with %d errors.\n", errors);
1429 RADON *radtra,
int set,
int setNr,
float *scndata,
float *imgdata
1431 float *imgptr, *scnptr;
1432 float *Y, *X, *Xptr, *Yptr;
1433 double sinus, cosinus, tanus;
1434 double shift_x, shift_y;
1435 int xp, xn, yp, yn, z;
1436 int x_left, x_right, y_top, y_bottom;
1437 int col, row, view, bin;
1438 int binNr, viewNr, imgDim;
1439 int half, center = -1, mode = 0;
1441 float dx, dy , loi = 1;
1444 if(radtra->
status != RADON_STATUS_INITIALIZED)
return -1;
1463 X=(
float*)calloc(imgDim+1,
sizeof(
float));
1464 Y=(
float*)calloc(imgDim+1,
sizeof(
float));
1465 if(X==NULL || Y==NULL){
1472 for(view=set; view<viewNr/4; view+=setNr){
1483 for(bin=0; bin<binNr; bin++){
1484 col=floor((
float)(bin+.5*sdist)*sdist);
1485 if(col==imgDim) col=imgDim-1;
1489 for(row=0; row<imgDim; row++){
1490 imgptr[row*imgDim + col] += loi*scnptr[bin];
1491 imgptr[(imgDim - 1 - col)*imgDim + row] +=
1492 loi*scnptr[binNr*(viewNr/2) + bin];
1499 cosinus=(double)
radonGetSin(radtra,viewNr/2 + view);
1500 tanus=sinus/cosinus;
1506 shift_y = -(imgDim/2 -.5*sdist)/sinus;
1507 shift_x = -(imgDim/2 -.5*sdist)/cosinus;
1513 for(col=0; col<imgDim+1; col++){
1514 Yptr[col]=(float)(shift_y - z/tanus);
1515 Xptr[col]=(float)(shift_x - z*tanus);
1520 shift_y = (double)(sdist/sinus);
1521 shift_x = (double)(sdist/cosinus);
1529 for(bin=0; bin<half; bin++){
1534 x_left = floor((
float)((Xptr[imgDim] + bin*shift_x) + imgDim/2));
1535 if(x_left < 0) x_left = 0;
1536 x_right = floor((
float)((Xptr[0] + bin*shift_x) + imgDim/2));
1537 if(x_right <= 0) x_right = 1;
1538 if(x_right > imgDim) x_right = imgDim - 1;
1542 for(z=x_left; z <= x_right; z++){
1545 xn = imgDim - 1 - xp;
1548 yp = imgDim/2 - floor(Yptr[xp + 1] + bin*shift_y) - 1;
1549 yn = imgDim - 1 - yp;
1552 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
1553 xp < imgDim && xn < imgDim && xn >= 0)
1559 dx = 1 - (float)((Xptr[imgDim - yp] + bin*shift_x) + imgDim/2 - xp);
1560 dy = 1 - (float)(yp - (imgDim/2 - (Yptr[xp + 1] + bin*shift_y) - 1));
1562 if(dx > 1 || dx < 0) dx = 1;
1563 if(dy > 1 || dy < 0) dy = 1;
1564 loi = sqrt(dx*dx + dy*dy);
1569 imgptr[yp*imgDim + xp] += loi*scnptr[view*binNr + bin];
1572 imgptr[yn*imgDim + xn] +=
1573 loi*scnptr[view*binNr + binNr - 1 - bin];
1575 if(view != viewNr/4){
1579 imgptr[yp*imgDim + xn] += loi*scnptr[(viewNr - view)*binNr + bin];
1582 imgptr[yn*imgDim + xp] +=
1583 loi*scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
1588 imgptr[xn*imgDim + yn] += loi*scnptr[(viewNr/2 - view)*binNr + bin];
1591 imgptr[xp*imgDim + yp] +=
1592 loi*scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
1598 imgptr[xn*imgDim + yp] += loi*scnptr[(viewNr/2 + view)*binNr + bin];
1601 imgptr[xp*imgDim + yn] +=
1602 loi*scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
1609 y_bottom = floor((
float)(Yptr[imgDim] + bin*shift_y + imgDim/2));
1610 if(y_bottom < 0) y_bottom = 0;
1611 if(y_bottom > imgDim) y_bottom = 0;
1613 y_top = floor((
float)(Yptr[0] + bin*shift_y + imgDim/2));
1614 if(y_top > imgDim) y_top = imgDim;
1615 if(y_top <= 0) y_top = 1;
1619 for(z=y_top; z >= y_bottom; z--) {
1622 xp = floor(Xptr[z] + bin*shift_x) + imgDim/2;
1623 xn = imgDim - 1 - xp;
1625 yp = imgDim - z - 1;
1626 yn = imgDim - yp - 1;
1629 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
1630 xp < imgDim && xn < imgDim && xn >= 0)
1635 dx = (float)((Xptr[z] + bin*shift_x) + imgDim/2 - xp);
1636 dy = (float)(yp - (imgDim/2 - (Yptr[xp] + bin*shift_y) - 1));
1637 if(dy > 1 || dy < 0) dy = 1;
1638 loi = sqrt(dx*dx + dy*dy);
1642 imgptr[yp*imgDim + xp] += loi*scnptr[view*binNr + bin];
1645 imgptr[yn*imgDim + xn] +=
1646 loi*scnptr[view*binNr + binNr - 1 - bin];
1648 if(view != viewNr/4){
1652 imgptr[yp*imgDim + xn] += loi*scnptr[(viewNr - view)*binNr + bin];
1655 imgptr[yn*imgDim + xp] +=
1656 loi*scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
1661 imgptr[xn*imgDim + yn] += loi*scnptr[(viewNr/2 - view)*binNr + bin];
1664 imgptr[xp*imgDim + yp] +=
1665 loi*scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
1671 imgptr[xn*imgDim + yp] += loi*scnptr[(viewNr/2 + view)*binNr + bin];
1674 imgptr[xp*imgDim + yn] +=
1675 loi*scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
1696 RADON *radtra,
int set,
int setNr,
float *scndata,
float *imgdata
1698 float *imgptr, *scnptr;
1699 float *Y, *X, *Xptr, *Yptr;
1700 double sinus, cosinus, tanus;
1701 double shift_x, shift_y;
1702 int xp, xn, yp, yn, z, xp2;
1703 int x_left, x_right, y_top, y_bottom;
1704 int col, col1, col2, row, view, bin;
1705 int binNr, viewNr, imgDim, errors=0;
1706 int half, center = -1;
1708 float a=0,b=0, c=0, d=0, g=0, h=0, A;
1709 float dx, dy , eps1 = 0, eps2 = 0, eps3 = 0;
1712 if(radtra->
status != RADON_STATUS_INITIALIZED)
return -1;
1724 X=(
float*)calloc(imgDim+1,
sizeof(
float));
1726 Y=(
float*)calloc(imgDim+1,
sizeof(
float));
1727 if(X==NULL || Y==NULL){
1744 for(view=set; view<=viewNr/4; view+=setNr){
1751 for(bin = 0; bin < half; bin++){
1754 col2 = floor((
float)(bin + 1)*sdist);
1762 if((col2-col1) == 1){
1763 eps1 = (float)(col2 - (bin)*sdist);
1765 eps3 = (float)((bin+1)*sdist - col2);
1769 if((col2-col1) > 1){
1770 eps1 = (float)(col1 + 1 - (bin)*sdist);
1772 eps3 = (float)((bin+1)*sdist - col2);
1779 for(row=0; row<imgDim; row++){
1781 imgptr[row*imgDim + col1] += eps1 * scnptr[bin];
1783 imgptr[row*imgDim + (imgDim - 1 - col1)]+=
1784 eps1 * scnptr[binNr-bin-1] ;
1785 imgptr[(imgDim - 1 - col1)*imgDim + row] +=
1786 eps1 * scnptr[binNr*(viewNr/2) + bin];
1788 imgptr[col1*imgDim + row]+=
1789 eps1 * scnptr[binNr*(viewNr/2) + (binNr-bin-1)];
1792 imgptr[row*imgDim + col1] += eps1 * scnptr[bin];
1793 imgptr[row*imgDim + col2] += eps3 *scnptr[bin];
1795 imgptr[row*imgDim + (imgDim - 1 - col1)] +=
1796 eps1 * scnptr[binNr-bin-1];
1797 imgptr[row*imgDim+(imgDim-1-col2)] +=
1798 eps3*scnptr[binNr-bin-1];
1801 imgptr[(imgDim-1-col1)*imgDim+row] +=
1802 eps1* scnptr[binNr*(viewNr/2) + bin];
1803 imgptr[(imgDim-1-col2)*imgDim+row] +=
1804 eps3*scnptr[binNr*(viewNr/2) + bin];
1806 imgptr[col1*imgDim + row] +=
1807 eps1 * scnptr[binNr*(viewNr/2) + (binNr-bin-1)];
1808 imgptr[col2*imgDim + row] +=
1809 eps3 *scnptr[binNr*(viewNr/2) + (binNr-bin-1)];
1813 for(col = col1; col<=col2; col++){
1815 imgptr[row*imgDim + col1]+= eps1 * scnptr[bin];
1817 imgptr[row*imgDim + (imgDim - 1 - col1)]+=
1818 eps1 * scnptr[binNr-bin-1] ;
1819 imgptr[(imgDim - 1 - col1)*imgDim + row]+=
1820 eps1 * scnptr[binNr*(viewNr/2) + bin];
1822 imgptr[col1*imgDim + row]+=
1823 eps1 * scnptr[binNr*(viewNr/2) + (binNr-bin-1)];
1826 imgptr[row*imgDim + col2]+= eps3 * scnptr[bin];
1828 imgptr[row*imgDim + (imgDim - 1 - col2)]+=
1829 eps3 * scnptr[binNr-bin-1];
1830 imgptr[(imgDim - 1 - col2)*imgDim + row]+=
1831 eps3 * scnptr[binNr*(viewNr/2) + bin];
1833 imgptr[col2*imgDim + row]+=
1834 eps3 * scnptr[binNr*(viewNr/2) + (binNr-bin-1)];
1836 if(col != col1 && col != col2){
1837 imgptr[row*imgDim + col]+= eps2 * scnptr[bin] ;
1839 imgptr[row*imgDim + (imgDim - 1 - col)]+=
1840 eps2 * scnptr[binNr-bin-1];
1841 imgptr[(imgDim - 1 - col)*imgDim + row]+=
1842 eps2 * scnptr[binNr*(viewNr/2) + bin];
1844 imgptr[col*imgDim + row]+=
1845 eps2 * scnptr[binNr*(viewNr/2) + (binNr-bin-1)];
1856 cosinus = (double)
radonGetSin(radtra,viewNr/2 + view);
1857 tanus = sinus/cosinus;
1862 shift_y = -(imgDim/2)/sinus;
1863 shift_x = -(imgDim/2)/cosinus;
1869 for(col=0; col<imgDim+1; col++){
1870 Yptr[col]=(float)(-z/tanus + shift_y);
1871 Xptr[col]=(float)(-z*tanus + shift_x);
1876 shift_y = (double)(sdist/sinus);
1877 shift_x = (double)(sdist/cosinus);
1885 for(bin=0; bin<half; bin++){
1890 x_left = floor((
float)(Xptr[imgDim] + bin*shift_x + imgDim/2));
1891 if(x_left < 0) x_left = 0;
1893 x_right = floor((
float)(Xptr[0] + bin*shift_x + imgDim/2));
1894 if(x_right <= 0) x_right = 1;
1895 if(x_right > imgDim) x_right = imgDim - 1;
1899 for(z=x_left; z <= x_right; z++) {
1902 xn = imgDim - 1 - xp;
1905 yp = imgDim/2 - floor(Yptr[xp + 1] + bin*shift_y) - 1;
1906 yn = imgDim - 1 - yp;
1909 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
1910 xp < imgDim && xn < imgDim && xn >= 0)
1915 a = (float)(xp + 1 - (imgDim/2 + Xptr[imgDim - yp] + bin*shift_x));
1916 b = (float)(floor(Yptr[xp + 1] + bin*shift_y) + 1 - (Yptr[xp + 1] +
1923 c = (float)(xp + 1 - (imgDim/2 + Xptr[imgDim - yp] +
1928 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
1929 (Yptr[xp + 1] + (bin+1)*shift_y));
1936 printf(
"RADON: Error in factor: eps1=%.5f \n",eps1);
1942 imgptr[yp*imgDim + xp]+= eps1 * scnptr[view*binNr + bin];
1945 imgptr[yn*imgDim + xn]+=
1946 eps1 * scnptr[view*binNr + binNr - 1 - bin];
1948 if(view != viewNr/4){
1952 imgptr[yp*imgDim + xn]+=
1953 eps1 * scnptr[(viewNr - view)*binNr + bin];
1956 imgptr[yn*imgDim + xp]+=
1957 eps1 * scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
1962 imgptr[xn*imgDim + yn]+=
1963 eps1 * scnptr[(viewNr/2 - view)*binNr + bin];
1966 imgptr[xp*imgDim + yp]+=
1967 eps1 * scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
1973 imgptr[xn*imgDim + yp]+= eps1 * scnptr[(viewNr/2 + view)*binNr + bin];
1976 imgptr[xp*imgDim + yn]+=
1977 eps1 * scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
1983 y_bottom = floor((
float)(Yptr[imgDim] + bin*shift_y + imgDim/2));
1984 if(y_bottom < 0) y_bottom = 0;
1985 if(y_bottom > imgDim) y_bottom = 0;
1987 y_top = floor((
float)(Yptr[0] + bin*shift_y + imgDim/2));
1988 if(y_top > imgDim) y_top = imgDim;
1989 if(y_top <= 0) y_top = 1;
1992 for(z=y_top; z >= y_bottom; z--) {
1995 xp = floor(Xptr[z] + bin*shift_x) + imgDim/2;
1996 xn = imgDim - 1 - xp;
1998 yp = imgDim - z - 1;
1999 yn = imgDim - yp - 1;
2002 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0
2003 && xp < imgDim && xn < imgDim && xn >= 0)
2007 dx = (float)(Xptr[z] + bin*shift_x + imgDim/2 - xp);
2008 dy = (float)(Yptr[xp] + bin*shift_y - z + imgDim/2);
2023 xp2 =floor(Xptr[z+1] + (bin+1)*shift_x) + imgDim/2;
2026 c = (float)(xp + 1 - (imgDim/2 + Xptr[z+1] + (bin+1)*shift_x));
2028 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
2029 (Yptr[xp + 1] + (bin+1)*shift_y));
2030 eps1 = 1 - (a*b + c*d)/2;
2033 eps3 = (1 - d)*(b + shift_x - 1)/2;
2034 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
2036 "4: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
2037 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
2042 dy = (float)(Yptr[xp+1] + (bin+1)*shift_y - (z + 1) +
2048 d = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
2053 dx = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
2059 c = dx - (float)(xp + 2 - (imgDim/2 + Xptr[z+2] +
2065 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+2] +
2068 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) + 2 -
2069 (Yptr[xp + 2] + (bin+1)*shift_y));
2075 dx = (float)(xp + 2 - (imgDim/2 + Xptr[z] + (bin+1)*shift_x));
2080 c = dx - (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
2086 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
2089 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) + 1 -
2090 (Yptr[xp + 2] + (bin+1)*shift_y));
2094 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
2096 "3/v%i: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
2097 view,xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
2101 c = g - (imgDim/2 + Xptr[z+1] + (bin+1)*shift_x - xp);
2104 eps1 = g*h - (a*b + c*d)/2;
2107 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
2109 "5: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
2110 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
2117 eps1 = (g*h - a*b)/2;
2120 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1) &&
2122 "6: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
2123 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
2130 b = dx - (float)(Xptr[z+1] + bin*shift_x + imgDim/2 - xp);
2136 g = 1 - (float)(Xptr[z+1] + bin*shift_x + imgDim/2 - xp);
2138 xp2 = floor(Xptr[z+1] + (bin+1)*shift_x) + imgDim/2;
2141 c = (float)(xp + 1 - (imgDim/2 + Xptr[z+1] + (bin+1)*shift_x));
2143 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
2144 (Yptr[xp + 1] + (bin+1)*shift_y));
2146 eps1 = g*h - (a*b + c*d)/2;
2149 eps3 = (1 - d)*((Xptr[z] + (bin+1)*shift_x + imgDim/2) -
2151 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
2153 "8: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
2154 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
2165 dx = (float)((imgDim/2 + Xptr[z] + (bin+1)*shift_x) - (xp+1));
2170 c = (float)((imgDim/2 + Xptr[z+1] + (bin+1)*shift_x) -
2174 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 ||
2176 "2/10: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
2177 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
2180 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
2183 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) + 1 -
2184 (Yptr[xp + 2] + (bin+1)*shift_y));
2187 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 ||
2189 "2/9: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
2190 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
2196 eps1 = sdist/cosinus;
2199 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1) &&
2201 "7: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
2202 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
2205 if(!eps2 && !eps3) {
2208 imgptr[yp*imgDim + xp]+= eps1 * scnptr[view*binNr + bin];
2211 imgptr[yn*imgDim + xn]+=
2212 eps1 * scnptr[view*binNr + binNr - 1 - bin];
2214 if(view != viewNr/4) {
2218 imgptr[yp*imgDim + xn]+=
2219 eps1 * scnptr[(viewNr - view)*binNr + bin];
2222 imgptr[yn*imgDim + xp]+=
2223 eps1 * scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
2228 imgptr[xn*imgDim + yn]+=
2229 eps1 * scnptr[(viewNr/2 - view)*binNr + bin];
2232 imgptr[xp*imgDim + yp]+=
2233 eps1 * scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
2239 imgptr[xn*imgDim + yp]+=
2240 eps1 * scnptr[(viewNr/2 + view)*binNr + bin];
2243 imgptr[xp*imgDim + yn]+=
2244 eps1 * scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
2248 if(xp + 1 < imgDim && xn - 1 >= 0) {
2251 imgptr[yp*imgDim + xp] += eps1 * scnptr[view*binNr + bin];
2252 imgptr[yp*imgDim + xp+1] += eps3 *scnptr[view*binNr + bin];
2255 imgptr[yn*imgDim + xn] +=
2256 eps1 * scnptr[view*binNr + binNr - 1 - bin];
2257 imgptr[yn*imgDim + xn-1] +=
2258 eps3 * scnptr[view*binNr + binNr - 1 - bin];
2261 if(view != viewNr/4) {
2265 imgptr[yp*imgDim + xn]+=
2266 eps1 * scnptr[(viewNr - view)*binNr + bin];
2267 imgptr[yp*imgDim + xn-1] +=
2268 eps3 * scnptr[(viewNr - view)*binNr + bin];
2272 imgptr[yn*imgDim + xp] +=
2273 eps1 * scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
2274 imgptr[yn*imgDim + xp+1] +=
2275 eps3 *scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
2280 imgptr[xn*imgDim + yn]+=
2281 eps1 * scnptr[(viewNr/2 - view)*binNr + bin];
2282 imgptr[(xn-1)*imgDim + yn] +=
2283 eps3 *scnptr[(viewNr/2 - view)*binNr + bin];
2287 imgptr[xp*imgDim + yp]+=
2288 eps1 * scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
2289 imgptr[(xp+1)*imgDim+yp]+=
2290 eps3 * scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
2297 imgptr[xn*imgDim + yp]+=
2298 eps1 * scnptr[(viewNr/2 + view)*binNr + bin];
2299 imgptr[(xn-1)*imgDim + yp] +=
2300 eps3 * scnptr[(viewNr/2 + view)*binNr + bin];
2303 imgptr[xp*imgDim + yn]+=
2304 eps1 * scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
2305 imgptr[(xp+1)*imgDim+yn] +=
2306 eps3*scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
2310 if(xp+1 < imgDim && xn-1 >= 0 && yp-1 >= 0 && yn+1 < imgDim) {
2314 imgptr[yp*imgDim + xp] += eps1 * scnptr[view*binNr + bin];
2315 imgptr[yp*imgDim + xp+1] += eps3 *scnptr[view*binNr + bin];
2316 imgptr[(yp-1)*imgDim + xp+1] +=
2317 eps2 * scnptr[view*binNr + bin];
2320 imgptr[yn*imgDim + xn] +=
2321 eps1 * scnptr[view*binNr + binNr - 1 - bin];
2322 imgptr[yn*imgDim + xn-1] +=
2323 eps3 * scnptr[view*binNr + binNr - 1 - bin];
2324 imgptr[(yn+1)*imgDim + xn-1] +=
2325 eps2 * scnptr[view*binNr + binNr - 1 - bin];
2327 if(view != viewNr/4) {
2331 imgptr[yp*imgDim + xn] +=
2332 eps1 * scnptr[(viewNr - view)*binNr + bin];
2333 imgptr[yp*imgDim + xn-1] +=
2334 eps3 *scnptr[(viewNr - view)*binNr + bin];
2335 imgptr[(yp-1)*imgDim + xn-1]+=
2336 eps2 * scnptr[(viewNr - view)*binNr + bin];
2340 imgptr[yn*imgDim + xp] +=
2341 eps1 * scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
2342 imgptr[yn*imgDim + xp+1] +=
2343 eps3 * scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
2344 imgptr[(yn+1)*imgDim + xp+1] +=
2345 eps2 * scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
2351 imgptr[xn*imgDim + yn]+=
2352 eps1 * scnptr[(viewNr/2 - view)*binNr + bin];
2353 imgptr[xn*imgDim + yn-1] +=
2354 eps3 *scnptr[(viewNr/2 - view)*binNr + bin];
2355 imgptr[(xn-1)*imgDim + (yn+1)] +=
2356 eps2 * scnptr[(viewNr/2 - view)*binNr + bin];
2360 imgptr[xp*imgDim + yp]+=
2361 eps1 * scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
2362 imgptr[(xp+1)*imgDim+yp] +=
2363 eps3*scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
2364 imgptr[(xp+1)*imgDim+(yp-1)] +=
2365 eps2*scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
2372 imgptr[xn*imgDim + yp] +=
2373 eps1 * scnptr[(viewNr/2 + view)*binNr + bin];
2374 imgptr[(xn-1)*imgDim + yp] +=
2375 eps3 * scnptr[(viewNr/2 + view)*binNr + bin];
2376 imgptr[(xn-1)*imgDim + (yp-1)] +=
2377 eps2 *scnptr[(viewNr/2 + view)*binNr + bin];
2380 imgptr[xp*imgDim + yn]+=
2381 eps1 * scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
2382 imgptr[(xp+1)*imgDim+yn] +=
2383 eps3 * scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
2384 imgptr[(xp+1)*imgDim+yn+1] +=
2385 eps2*scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
2399 printf(
"RADON: radonBackTransformEA() finished with %d errors.\n", errors);
2610 unsigned short int **coords, *factors, **coptr, *facptr;
2612 float *Y, *X, *Xptr, *Yptr;
2613 double sinus, cosinus, tanus;
2614 double shift_x, shift_y;
2615 int xp, xn, yp, yn, z;
2616 int x_left, x_right, y_top, y_bottom;
2617 int col, row, view, bin, pix;
2618 int binNr, viewNr, imgDim, views, rows, mode, half;
2620 float scale, sum=0, sqr_sum=0, min=0, max=0;
2621 float dx, dy , loi = 1;
2624 if(radtra->
status != RADON_STATUS_INITIALIZED)
return -1;
2636 mat->
type=PRMAT_TYPE_ECAT931;
2637 }
else if(binNr == 281){
2638 mat->
type=PRMAT_TYPE_GE;
2640 mat->
type=PRMAT_TYPE_NA;
2648 mat->
prmatfov = (
int*)calloc(2,
sizeof(
int));
2653 views = viewNr/4 + 1;
2659 mat->
dime=calloc(rows,
sizeof(
int));
2660 mat->
_factdata=(
unsigned short int***)calloc(rows,
sizeof(
unsigned short int**));
2671 coords = (
unsigned short int**)calloc(2*imgDim,
sizeof(
unsigned short int*));
2672 factors = (
unsigned short int*)calloc(2*imgDim,
sizeof(
unsigned short int));
2673 if(!coords || !factors)
return 5;
2675 for(col=0; col<2*imgDim; col++){
2676 coords[col] = (
unsigned short int*)calloc(2,
sizeof(
unsigned short int));
2677 if(!coords[col])
return -1;
2688 X=(
float*)calloc(imgDim+1,
sizeof(
float));
2690 Y=(
float*)calloc(imgDim+1,
sizeof(
float));
2691 if(X==NULL || Y==NULL){
2705 for(view=0; view<views; view++){
2717 for(bin=0; bin<half; bin++){
2718 col = floor((
float)(bin+.5*sdist)*sdist);
2725 for(row=0; row<imgDim; row++){
2733 coptr[pix][0] = (
unsigned short int)col;
2734 coptr[pix][1] = (
unsigned short int)row;
2736 facptr[pix] = (
unsigned short int)(scale*loi);
2738 if(min>loi) min=loi;
2739 if(max<loi) max=loi;
2751 (
unsigned short int**)calloc(pix,
sizeof(
unsigned short int*));
2756 for(col=0; col<pix; col++) {
2758 (
unsigned short int*)calloc(3,
sizeof(
unsigned short int));
2759 if(!mat->
_factdata[bin][col])
return -1;
2764 for(col=0; col<pix; col++) {
2765 mat->
fact[bin][col][0] = coptr[col][0];
2766 mat->
fact[bin][col][1] = coptr[col][1];
2767 mat->
fact[bin][col][2] = facptr[col];
2780 cosinus = (double)
radonGetSin(radtra,viewNr/2 + view);
2781 tanus = sinus/cosinus;
2786 shift_y = -(imgDim/2 -.5*sdist)/sinus;
2787 shift_x = -(imgDim/2 -.5*sdist)/cosinus;
2793 for(col=0; col<imgDim+1; col++){
2794 Yptr[col]=(float)(shift_y - z/tanus);
2795 Xptr[col]=(float)(shift_x - z*tanus);
2800 shift_y = (double)(sdist/sinus);
2801 shift_x = (double)(sdist/cosinus);
2809 for(bin=0; bin<half; bin++){
2819 x_left = floor((
float)(Xptr[imgDim] + bin*shift_x + imgDim/2));
2820 if(x_left < 0) x_left = 0;
2822 x_right = floor((
float)(Xptr[0] + bin*shift_x + imgDim/2));
2823 if(x_right <= 0) x_right = 1;
2824 if(x_right > imgDim) x_right = imgDim - 1;
2828 for(z=x_left; z <= x_right; z++) {
2831 xn = imgDim - 1 - xp;
2834 yp = imgDim/2 - floor(Yptr[xp + 1] + bin*shift_y) - 1;
2835 yn = imgDim - 1 - yp;
2838 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
2839 xp < imgDim && xn < imgDim && xn >= 0) {
2845 dx = (float)(xp + 1 - (imgDim/2 + Xptr[imgDim - yp] + bin*shift_x));
2846 dy = (float)(floor(Yptr[xp + 1] + bin*shift_y) + 1 -
2847 (Yptr[xp + 1] + bin*shift_y));
2848 if(dx > 1 || dx < 0) dx = 1;
2849 if(dy > 1 || dy < 0) dy = 1;
2850 loi = sqrt(dx*dx + dy*dy);
2864 facptr[pix] = (
unsigned short int)(scale*loi);
2867 if(min>loi) min=loi;
2868 if(max<loi) max=loi;
2878 y_bottom = floor((
float)(Yptr[imgDim] + bin*shift_y + imgDim/2));
2879 if(y_bottom < 0) y_bottom = 0;
2880 if(y_bottom > imgDim) y_bottom = 0;
2882 y_top = floor((
float)(Yptr[0] + bin*shift_y + imgDim/2));
2883 if(y_top > imgDim) y_top = imgDim-1;
2884 if(y_top <= 0) y_top = 1;
2888 for(z=y_top; z >= y_bottom; z--) {
2891 xp = floor(Xptr[z] + bin*shift_x) + imgDim/2;
2892 xn = imgDim - 1 - xp;
2894 yp = imgDim - z - 1;
2895 yn = imgDim - yp - 1;
2898 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
2899 xp < imgDim && xn < imgDim && xn >= 0) {
2904 dx = (float)(Xptr[z] + bin*shift_x + imgDim/2 - xp);
2905 dy = (float)(Yptr[xp] + bin*shift_y - z + imgDim/2);
2906 if(dy > 1 || dy < 0) {
2907 dx = dx - (float)(Xptr[z+1] + bin*shift_x + imgDim/2 - xp);
2910 loi = sqrt(dx*dx + dy*dy)/diam;
2923 facptr[pix] = (
unsigned short int)(scale*loi);
2926 if(min>loi) min=loi;
2927 if(max<loi) max=loi;
2937 (
unsigned short int**)calloc(pix,
sizeof(
unsigned short int*));
2938 if(!mat->
_factdata[view*half + bin])
return -1;
2942 for(col=0; col<pix; col++){
2944 (
unsigned short int*)calloc(3,
sizeof(
unsigned short int));
2945 if(!mat->
_factdata[view*half + bin][col])
return -1;
2950 for(col=0; col<pix; col++){
2951 mat->
fact[view*half + bin][col][0] = coptr[col][0];
2952 mat->
fact[view*half + bin][col][1] = coptr[col][1];
2953 mat->
fact[view*half + bin][col][2] = facptr[col];
2957 mat->
dime[view*half + bin]=pix;
2975 mat->
status = PRMAT_STATUS_BS_OCCUPIED;
2991 unsigned short int **coords, *factors, **coptr, *facptr;
2993 float *Y, *X, *Xptr, *Yptr;
2994 double sinus, cosinus, tanus;
2995 double shift_x, shift_y;
2996 int xp, xn, yp, yn, z, xp2;
2997 int x_left, x_right, y_top, y_bottom;
2998 int col, col1, col2, row, view, bin, pix, errors=0;
2999 int binNr, viewNr, imgDim, mode, views, rows, half;
3001 float a=0,b=0, c=0, d=0, g=0, h=0, A;
3003 float dx, dy , eps1 = 0, eps2 = 0, eps3 = 0;
3004 float min=0, max=0, sum=0, scale, sqr_sum=0;
3007 if(radtra->
status != RADON_STATUS_INITIALIZED)
return -1;
3022 mat->
type=PRMAT_TYPE_ECAT931;
3023 }
else if(binNr == 281) {
3024 mat->
type=PRMAT_TYPE_GE;
3026 mat->
type=PRMAT_TYPE_NA;
3034 mat->
prmatfov = (
int*)calloc(2,
sizeof(
int));
3039 views = viewNr/4 + 1;
3045 mat->
dime=calloc(rows,
sizeof(
int));
3046 mat->
_factdata=(
unsigned short int***)calloc(rows,
sizeof(
unsigned short int**));
3057 coords = (
unsigned short int**)calloc(4*imgDim,
sizeof(
unsigned short int*));
3058 factors = (
unsigned short int*)calloc(4*imgDim,
sizeof(
unsigned short int));
3059 if(!coords || !factors)
return 5;
3061 for(col=0; col<4*imgDim; col++){
3062 coords[col] = (
unsigned short int*)calloc(2,
sizeof(
unsigned short int));
3063 if(!coords[col])
return -1;
3070 X=(
float*)calloc(imgDim+1,
sizeof(
float));
3072 Y=(
float*)calloc(imgDim+1,
sizeof(
float));
3073 if(X==NULL || Y==NULL){
3086 for(view=0; view<views; view++){
3093 for(bin = 0; bin < half; bin++){
3099 col2 = floor((
float)(bin + 1)*sdist);
3107 if((col2-col1) == 1){
3108 eps1 = (float)(col2 - (bin)*sdist);
3110 eps3 = (float)((bin+1)*sdist - col2);
3113 if((col2-col1) > 1){
3114 eps1 = (float)(col1 + 1 - (bin)*sdist);
3116 eps3 = (float)((bin+1)*sdist - col2);
3120 for(row=0; row<imgDim; row++){
3130 coptr[pix][0] = (
unsigned short int)col1;
3131 coptr[pix][1] = (
unsigned short int)row;
3133 facptr[pix] = (
unsigned short int)(scale*eps1);
3135 if(min>eps1) min=eps1;
3136 if(max<eps1) max=eps1;
3138 sqr_sum += eps1*eps1;
3144 coptr[pix][0] = (
unsigned short int)col1;
3145 coptr[pix][1] = (
unsigned short int)row;
3147 facptr[pix] = (
unsigned short int)(scale*eps1);
3149 if(min>eps1) min=eps1;
3150 if(max<eps1) max=eps1;
3152 sqr_sum += eps1*eps1;
3156 coptr[pix][0] = (
unsigned short int)col2;
3157 coptr[pix][1] = (
unsigned short int)row;
3159 facptr[pix] = (
unsigned short int)(scale*eps3);
3161 if(min>eps3) min=eps3;
3162 if(max<eps3) max=eps3;
3164 sqr_sum += eps3*eps3;
3170 for(col = col1; col<=col2; col++){
3173 coptr[pix][0] = (
unsigned short int)col1;
3174 coptr[pix][1] = (
unsigned short int)row;
3176 facptr[pix] = (
unsigned short int)(scale*eps1);
3178 if(min>eps1) min=eps1;
3179 if(max<eps1) max=eps1;
3181 sqr_sum += eps1*eps1;
3187 coptr[pix][0] = (
unsigned short int)col2;
3188 coptr[pix][1] = (
unsigned short int)row;
3190 facptr[pix] = (
unsigned short int)(scale*eps3);
3192 if(min>eps3) min=eps3;
3193 if(max<eps3) max=eps3;
3195 sqr_sum += eps3*eps3;
3200 if(col != col1 && col != col2){
3201 coptr[pix][0] = (
unsigned short int)col;
3202 coptr[pix][1] = (
unsigned short int)row;
3204 facptr[pix] = (
unsigned short int)(scale*eps2);
3206 if(min>eps2) min=eps2;
3207 if(max<eps2) max=eps2;
3209 sqr_sum += eps2*eps2;
3222 (
unsigned short int**)calloc(pix,
sizeof(
unsigned short int*));
3226 for(col=0; col<pix; col++){
3228 (
unsigned short int*)calloc(3,
sizeof(
unsigned short int));
3229 if(!mat->
_factdata[bin][col])
return -1;
3234 for(col=0; col<pix; col++){
3235 mat->
fact[bin][col][0] = coptr[col][0];
3236 mat->
fact[bin][col][1] = coptr[col][1];
3237 mat->
fact[bin][col][2] = facptr[col];
3250 cosinus = (double)
radonGetSin(radtra,viewNr/2 + view);
3251 tanus = sinus/cosinus;
3256 shift_y = -(imgDim/2)/sinus;
3257 shift_x = -(imgDim/2)/cosinus;
3263 for(col=0; col<imgDim+1; col++){
3264 Yptr[col]=(float)(-z/tanus + shift_y);
3265 Xptr[col]=(float)(-z*tanus + shift_x);
3270 shift_y = (double)(sdist/sinus);
3271 shift_x = (double)(sdist/cosinus);
3279 for(bin=0; bin<half; bin++){
3287 x_left = floor((
float)(Xptr[imgDim] + bin*shift_x + imgDim/2));
3288 if(x_left < 0) x_left = 0;
3290 x_right = floor((
float)(Xptr[0] + bin*shift_x + imgDim/2));
3291 if(x_right <= 0) x_right = 1;
3292 if(x_right > imgDim) x_right = imgDim - 1;
3296 for(z=x_left; z <= x_right; z++) {
3299 xn = imgDim - 1 - xp;
3302 yp = imgDim/2 - floor(Yptr[xp + 1] + bin*shift_y) - 1;
3303 yn = imgDim - 1 - yp;
3306 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
3307 xp < imgDim && xn < imgDim && xn >= 0) {
3319 a = (float)(xp + 1 - (imgDim/2 + Xptr[imgDim - yp] + bin*shift_x));
3320 b = (float)(floor(Yptr[xp + 1] + bin*shift_y) + 1 -
3321 (Yptr[xp + 1] + bin*shift_y));
3327 c = (float)(xp + 1 - (imgDim/2 + Xptr[imgDim - yp] +
3333 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
3334 (Yptr[xp + 1] + (bin+1)*shift_y));
3342 if(eps1 < 0 || eps1 > 1) errors++;
3347 facptr[pix] = (
unsigned short int)(scale*eps1);
3350 if(min>eps1) min=eps1;
3351 if(max<eps1) max=eps1;
3352 sqr_sum += eps1*eps1;
3361 y_bottom = floor((
float)(Yptr[imgDim] + bin*shift_y + imgDim/2));
3362 if(y_bottom < 0) y_bottom = 0;
3363 if(y_bottom > imgDim) y_bottom = 0;
3365 y_top = floor((
float)(Yptr[0] + bin*shift_y + imgDim/2));
3366 if(y_top > imgDim) y_top = imgDim;
3367 if(y_top <= 0) y_top = 1;
3371 for(z=y_top; z >= y_bottom; z--) {
3374 xp = floor(Xptr[z] + bin*shift_x) + imgDim/2;
3375 xn = imgDim - 1 - xp;
3377 yp = imgDim - z - 1;
3378 yn = imgDim - yp - 1;
3381 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
3382 xp < imgDim && xn < imgDim && xn >= 0) {
3393 dx = (float)(Xptr[z] + bin*shift_x + imgDim/2 - xp);
3394 dy = (float)(Yptr[xp] + bin*shift_y - z + imgDim/2);
3413 xp2 =floor(Xptr[z+1] + (bin+1)*shift_x) + imgDim/2;
3417 c = (float)(xp + 1 - (imgDim/2 + Xptr[z+1] +
3420 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
3421 (Yptr[xp + 1] + (bin+1)*shift_y));
3422 eps1 = 1 - (a*b + c*d)/2;
3425 eps3 = (1 - d)*(b + shift_x - 1)/2;
3430 dy = (float)(Yptr[xp+1] + (bin+1)*shift_y - (z + 1) +
3436 d = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
3440 dx = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
3446 c = dx - (float)(xp + 2 - (imgDim/2 + Xptr[z+2] +
3452 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+2] +
3455 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) +
3456 2 - (Yptr[xp + 2] + (bin+1)*shift_y));
3463 dx = (float)(xp + 2 - (imgDim/2 + Xptr[z] +
3469 c = dx - (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
3475 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
3478 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) +
3479 1 - (Yptr[xp + 2] + (bin+1)*shift_y));
3486 c = g - (imgDim/2 + Xptr[z+1] + (bin+1)*shift_x - xp);
3490 eps1 = g*h - (a*b + c*d)/2;
3500 eps1 = (g*h - a*b)/2;
3510 b = dx - (float)(Xptr[z+1] + bin*shift_x + imgDim/2 - xp);
3519 g = 1 - (float)(Xptr[z+1] + bin*shift_x + imgDim/2 - xp);
3520 xp2 = floor(Xptr[z+1] + (bin+1)*shift_x) + imgDim/2;
3523 c = (float)(xp + 1 - (imgDim/2 + Xptr[z+1] +
3526 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
3527 (Yptr[xp + 1] + (bin+1)*shift_y));
3528 eps1 = g*h - (a*b + c*d)/2;
3531 eps3 = (1 - d)*((Xptr[z] + (bin+1)*shift_x + imgDim/2)
3541 dx = (float)((imgDim/2 + Xptr[z] + (bin+1)*shift_x) - (xp+1));
3546 c = (float)((imgDim/2 + Xptr[z+1] + (bin+1)*shift_x) -
3552 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
3555 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) + 1 -
3556 (Yptr[xp + 2] + (bin+1)*shift_y));
3563 eps1 = sdist/cosinus;
3568 if(eps1 <= 0 || eps1 > 1) {
3570 printf(
"Error: eps1 = %f \n",eps1);
3573 if(eps2 < 0 || eps2 > 1){
3577 if(eps3 < 0 || eps3 > 1){
3585 facptr[pix] = (
unsigned short int)(scale*eps1);
3588 if(min>eps1) min=eps1;
3589 if(max<eps1) max=eps1;
3590 sqr_sum += eps1*eps1;
3594 if(xp + 1 < imgDim && xn - 1 >= 0){
3598 facptr[pix] = (
unsigned short int)(scale*eps1);
3601 if(min>eps1) min=eps1;
3602 if(max<eps1) max=eps1;
3603 sqr_sum += eps1*eps1;
3608 coptr[pix][0] = xp+1;
3610 facptr[pix] = (
unsigned short int)(scale*eps3);
3613 if(min>eps3) min=eps3;
3614 if(max<eps3) max=eps3;
3615 sqr_sum += eps3*eps3;
3620 if(xp+1 < imgDim && xn-1 >= 0 && yp-1 >= 0 && yn+1 < imgDim) {
3624 facptr[pix] = (
unsigned short int)(scale*eps1);
3627 if(min>eps1) min=eps1;
3628 if(max<eps1) max=eps1;
3629 sqr_sum += eps1*eps1;
3634 coptr[pix][0] = xp+1;
3636 facptr[pix] = (
unsigned short int)(scale*eps3);
3639 if(min>eps3) min=eps3;
3640 if(max<eps3) max=eps3;
3641 sqr_sum += eps3*eps3;
3646 coptr[pix][0] = xp+1;
3647 coptr[pix][1] = yp-1;
3648 facptr[pix] = (
unsigned short int)(scale*eps2);
3651 if(min>eps2) min=eps2;
3652 if(max<eps2) max=eps2;
3653 sqr_sum += eps2*eps2;
3667 (
unsigned short int**)calloc(pix,
sizeof(
unsigned short int*));
3668 if(!mat->
_factdata[half*view + bin])
return -1;
3672 for(col=0; col<pix; col++){
3674 (
unsigned short int*)calloc(3,
sizeof(
unsigned short int));
3675 if(!mat->
_factdata[half*view + bin][col])
return -1;
3680 for(col=0; col<pix; col++){
3681 mat->
fact[half*view + bin][col][0] = coptr[col][0];
3682 mat->
fact[half*view + bin][col][1] = coptr[col][1];
3683 mat->
fact[half*view + bin][col][2] = facptr[col];
3687 mat->
dime[half*view + bin]=pix;
3704 mat->
status = PRMAT_STATUS_BS_OCCUPIED;
3707 printf(
"RADON: radonSetBasesEA() finished with %d errors.\n", errors);
3730 unsigned int **tmpData, **tmpptr;
3731 unsigned int *coords, *iptr;
3732 unsigned int col, row, pix=0, p=0, lors=0, view, bin;
3733 unsigned int binNr, viewNr, imgDim, views, half, center;
3736 float diam, sampledist;
3739 if(mat->
status < PRMAT_STATUS_BS_OCCUPIED)
return -1;
3753 lors = ceil(diam/sampledist) + 1;
3754 tmpData = (
unsigned int**)calloc(imgDim*imgDim,
sizeof(
unsigned int*));
3755 for(p=0; p<imgDim*imgDim; p++){
3756 tmpData[p]=(
unsigned int*)calloc(lors*viewNr,
sizeof(
unsigned int));
3758 fprintf(stderr,
"Error: not enough memory.\n");
3766 for(p=0; p<imgDim*imgDim; p++) tmpptr[p][0]=0;
3769 for(view=0; view<views + 1; view++){
3770 for(bin=0; bin<half; bin++){
3771 row = view*half + bin;
3775 xn = imgDim - 1 - xp;
3777 yn = imgDim - 1 - yp;
3779 if(xp != 0 || yp != 0){
3783 tmpptr[yp*imgDim + xp][++tmpptr[yp*imgDim + xp][0]] = bin;
3785 tmpptr[yp*imgDim+(imgDim-1-xp)][++tmpptr[yp*imgDim+(imgDim-1-xp)][0]]=
3787 tmpptr[(imgDim-1-xp)*imgDim+yp][++tmpptr[(imgDim-1-xp)*imgDim+yp][0]]=
3788 binNr*(viewNr/2) + bin;
3790 tmpptr[xp*imgDim+yp][++tmpptr[xp*imgDim+yp][0]] =
3791 binNr*(viewNr/2) + (binNr-bin-1);
3794 if(view == viewNr/4) {
3797 tmpptr[yp*imgDim + xp][++tmpptr[yp*imgDim + xp][0]] =
3798 (viewNr/4)*binNr + bin;
3801 tmpptr[yn*imgDim + xn][++tmpptr[yn*imgDim + xn][0]] =
3802 (viewNr/4)*binNr + binNr - 1 - bin;
3807 tmpptr[xn*imgDim + yp][++tmpptr[xn*imgDim + yp][0]] =
3808 (viewNr/2 + viewNr/4)*binNr + bin;
3811 tmpptr[xp*imgDim + yn][++tmpptr[xp*imgDim + yn][0]] =
3812 (viewNr/2 + viewNr/4)*binNr + binNr - 1 - bin;
3815 if(view != 0 && view != viewNr/4) {
3818 tmpptr[yp*imgDim + xp][++tmpptr[yp*imgDim + xp][0]] =
3822 tmpptr[yn*imgDim + xn][++tmpptr[yn*imgDim + xn][0]] =
3823 view*binNr + binNr - 1 - bin;
3828 tmpptr[xn*imgDim + yp][++tmpptr[xn*imgDim + yp][0]] =
3829 (viewNr/2 + view)*binNr + bin;
3832 tmpptr[xp*imgDim + yn][++tmpptr[xp*imgDim + yn][0]] =
3833 (viewNr/2 + view)*binNr + binNr - 1 - bin;
3838 tmpptr[yp*imgDim + xn][++tmpptr[yp*imgDim + xn][0]] =
3839 (viewNr - view)*binNr + bin;
3842 tmpptr[yn*imgDim + xp][++tmpptr[yn*imgDim + xp][0]] =
3843 (viewNr-view)*binNr + binNr - 1 - bin;
3848 tmpptr[xn*imgDim + yn][++tmpptr[xn*imgDim + yn][0]] =
3849 (viewNr/2 - view)*binNr + bin;
3852 tmpptr[xp*imgDim + yp][++tmpptr[xp*imgDim + yp][0]] =
3853 (viewNr/2 - view)*binNr + binNr - 1 - bin;
3862 for(row = 0; row < imgDim; row++){
3863 for(col = 0; col < imgDim; col++){
3871 coords = (
unsigned int*)calloc(pix,
sizeof(
int));
3873 for(row = 0; row < imgDim; row++){
3874 for(col = 0; col < imgDim; col++){
3877 iptr[p] = tmpptr[row*imgDim + col][0];
3886 free((
unsigned int**)tmpData);
3896 for(row = 0; row < imgDim; row++) {
3897 for(col = 0; col < imgDim; col++) {
3900 mat -> lines[p][0] = row*imgDim + col;
3902 mat -> lines[p][1] = iptr[p];
3904 for(lors = 0; lors < iptr[p]; lors++)
3905 mat -> lines[p][lors + 2] = tmpptr[row*imgDim + col][lors+1];
3913 mat->
status = PRMAT_STATUS_LU_OCCUPIED;
3915 free((
unsigned int**)tmpData);
3936 unsigned int *coords, *iptr;
3937 unsigned int imgDim=128, binNr=256, viewNr=192, view, bin, pixNr=0;
3938 unsigned int row, col, rows, half, centerbin, p;
3941 float fact, sqr_sum;
3946 printf(
"radonSetLors() started. \n");
3955 half = (binNr - 1)/2 + 1;
3956 centerbin = half - 1;
3968 rows = viewNr*binNr;
3969 coords = (
unsigned int*)calloc(rows,
sizeof(
int));
3974 for(view=0; view<p + 1; view++){
3975 for(bin=0; bin<half; bin++){
3976 row = view*half + bin;
3979 iptr[view*binNr + bin] = pixNr;
3981 if(bin != centerbin)
3982 iptr[view*binNr + binNr - 1 - bin] = pixNr;
3984 if(view != 0 && view != viewNr/4){
3987 iptr[(viewNr - view)*binNr + bin] = pixNr;
3988 if(bin != centerbin)
3989 iptr[(viewNr-view)*binNr + binNr - 1 - bin] = pixNr;
3993 iptr[(viewNr/2 - view)*binNr + bin] = pixNr;
3994 if(bin != centerbin)
3995 iptr[(viewNr/2 - view)*binNr + binNr - 1 - bin] = pixNr;
4000 iptr[(viewNr/2 + view)*binNr + bin] = pixNr;
4001 if(bin != centerbin)
4002 iptr[(viewNr/2 + view)*binNr + binNr - 1 - bin] = pixNr;
4013 printf(
"Allocation done \n");
4016 for(view=0; view<p + 1; view++){
4017 for(bin=0; bin<half; bin++){
4018 row = view*half + bin;
4023 fact = mat->
fact[row][col][2];
4025 xn = imgDim - 1 - xp;
4027 yn = imgDim - 1 - yp;
4030 ext_mat.
fact[view*binNr + bin][col][0] = xp;
4031 ext_mat.
fact[view*binNr + bin][col][1] = yp;
4032 ext_mat.
fact[view*binNr + bin][col][2] = fact;
4036 if(bin != centerbin){
4037 ext_mat.
fact[view*binNr + binNr - 1 - bin][col][0] = xn;
4038 ext_mat.
fact[view*binNr + binNr - 1 - bin][col][1] = yn;
4039 ext_mat.
fact[view*binNr + binNr - 1 - bin][col][2] = fact;
4043 if(view != 0 && view != viewNr/4){
4046 ext_mat.
fact[(viewNr - view)*binNr + bin][col][0] = xn;
4047 ext_mat.
fact[(viewNr - view)*binNr + bin][col][1] = yp;
4048 ext_mat.
fact[(viewNr - view)*binNr + bin][col][2] = fact;
4051 if(bin != centerbin){
4053 ext_mat.
fact[(viewNr - view)*binNr +binNr - 1 - bin][col][0] = xp;
4054 ext_mat.
fact[(viewNr - view)*binNr +binNr - 1 - bin][col][1] = yn;
4055 ext_mat.
fact[(viewNr - view)*binNr +binNr - 1 - bin][col][2] = fact;
4062 ext_mat.
fact[(viewNr/2 - view)*binNr + bin][col][0] = yn;
4063 ext_mat.
fact[(viewNr/2 - view)*binNr + bin][col][1] = xn;
4064 ext_mat.
fact[(viewNr/2 - view)*binNr + bin][col][2] = fact;
4067 if(bin != centerbin){
4068 ext_mat.
fact[(viewNr/2 - view)*binNr +binNr-1-bin][col][0] = yp;
4069 ext_mat.
fact[(viewNr/2 - view)*binNr +binNr-1-bin][col][1] = xp;
4070 ext_mat.
fact[(viewNr/2 - view)*binNr +binNr-1-bin][col][2] = fact;
4071 ext_mat.
factor_sqr_sum[(viewNr/2-view)*binNr+binNr-1-bin] = sqr_sum;
4077 ext_mat.
fact[(viewNr/2 + view)*binNr + bin][col][0] = yp;
4078 ext_mat.
fact[(viewNr/2 + view)*binNr + bin][col][1] = xn;
4079 ext_mat.
fact[(viewNr/2 + view)*binNr + bin][col][2] = fact;
4083 if(bin != centerbin){
4084 ext_mat.
fact[(viewNr/2 + view)*binNr + binNr-1-bin][col][0] = yn;
4085 ext_mat.
fact[(viewNr/2 + view)*binNr + binNr-1-bin][col][1] = xp;
4086 ext_mat.
fact[(viewNr/2 + view)*binNr + binNr-1-bin][col][2] = fact;
4087 ext_mat.
factor_sqr_sum[(viewNr/2 +view)*binNr +binNr-1-bin] = sqr_sum;
4097 for(row=0; row<mat->
dimr; row++){
4098 for(col=0; col<mat->
dime[row]; col++){
4099 free((
unsigned short int*)mat->
_factdata[row][col]);
4103 free((
int*)mat->
dime);
4115 printf(
"Allocation done \n");
4125 mat->
fact[row][col][2] = ext_mat.
fact[row][col][2];