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");
551 RADON *radtra,
int set,
int setNr,
float *imgdata,
float *scndata)
553 float *imgptr, *scnptr;
554 float *Y, *X, *Xptr, *Yptr;
555 double sinus, cosinus, tanus;
556 double shift_x, shift_y;
557 int xp, xn, yp, yn, z, xp2;
558 int x_left, x_right, y_top, y_bottom;
559 int col, col1, col2, row, view, bin;
560 int binNr, viewNr, imgDim, errors=0;
561 int half, center = -1;
563 float a=0,b=0, c=0, d=0, g=0, h=0, A;
564 float dx, dy , eps1 = 0, eps2 = 0, eps3 = 0;
567 printf(
"RADON: radonFwdTransformEA() started.\n");
572 if(radtra->
status != RADON_STATUS_INITIALIZED)
return -1;
584 X=(
float*)calloc(imgDim+1,
sizeof(
float));
586 Y=(
float*)calloc(imgDim+1,
sizeof(
float));
587 if(X==NULL || Y==NULL){
604 for(view=set; view<=viewNr/4; view=view+setNr){
613 for(bin = 0; bin < half; bin++){
616 col2 = floor((
float)(bin + 1)*sdist);
624 if((col2-col1) == 1){
625 eps1 = (float)(col2 - (bin)*sdist);
627 eps3 = (float)((bin+1)*sdist - col2);
632 eps1 = (float)(col1 + 1 - (bin)*sdist);
634 eps3 = (float)((bin+1)*sdist - col2);
641 for(row=0; row<imgDim; row++) {
644 scnptr[bin] += eps1 * imgptr[row*imgDim + col1];
646 scnptr[binNr-bin-1] +=
647 eps1 * imgptr[row*imgDim + (imgDim - 1 - col1)];
649 scnptr[binNr*(viewNr/2) + bin] +=
650 eps1 * imgptr[(imgDim - 1 - col1)*imgDim + row];
652 scnptr[binNr*(viewNr/2) + (binNr-bin-1)] +=
653 eps1 * imgptr[col1*imgDim + row];
657 scnptr[bin] += eps1 * imgptr[row*imgDim + col1] +
658 eps3 * imgptr[row*imgDim + col2];
660 scnptr[binNr-bin-1] +=
661 eps1 * imgptr[row*imgDim + (imgDim - 1 - col1)] +
662 eps3*imgptr[row*imgDim+(imgDim-1-col2)];
664 scnptr[binNr*(viewNr/2) + bin] +=
665 eps1*imgptr[(imgDim-1-col1)*imgDim+row] +
666 eps3*imgptr[(imgDim-1-col2)*imgDim+row];
668 scnptr[binNr*(viewNr/2) + (binNr-bin-1)] +=
669 eps1 * imgptr[col1*imgDim + row] +
670 eps3 * imgptr[col2*imgDim + row] ;
674 for(col = col1; col<=col2; col++) {
676 scnptr[bin] += eps1 * imgptr[row*imgDim + col1];
678 scnptr[binNr-bin-1] += eps1 * imgptr[row*imgDim +
679 (imgDim - 1 - col1)];
680 scnptr[binNr*(viewNr/2) + bin] +=
681 eps1 * imgptr[(imgDim - 1 - col1)*imgDim + row];
683 scnptr[binNr*(viewNr/2) + (binNr-bin-1)] +=
684 eps1 * imgptr[col1*imgDim + row];
687 scnptr[bin] += eps3 * imgptr[row*imgDim + col2];
689 scnptr[binNr-bin-1] += eps3 * imgptr[row*imgDim +
690 (imgDim - 1 - col2)];
691 scnptr[binNr*(viewNr/2) + bin] +=
692 eps3 * imgptr[(imgDim - 1 - col2)*imgDim + row];
694 scnptr[binNr*(viewNr/2) + (binNr-bin-1)] +=
695 eps3 * imgptr[col2*imgDim + row];
697 if(col != col1 && col != col2) {
698 scnptr[bin] += eps2 * imgptr[row*imgDim + col];
700 scnptr[binNr-bin-1] +=
701 eps2 * imgptr[row*imgDim + (imgDim - 1 - col)];
702 scnptr[binNr*(viewNr/2) + bin] +=
703 eps2 * imgptr[(imgDim - 1 - col)*imgDim + row];
705 scnptr[binNr*(viewNr/2) + (binNr-bin-1)] +=
706 eps2 * imgptr[col*imgDim + row];
717 cosinus = (double)
radonGetSin(radtra,viewNr/2 + view);
718 tanus = sinus/cosinus;
723 shift_y = -(imgDim/2)/sinus;
724 shift_x = -(imgDim/2)/cosinus;
730 for(col=0; col<imgDim+1; col++){
731 Yptr[col]=(float)(-z/tanus + shift_y);
732 Xptr[col]=(float)(-z*tanus + shift_x);
737 shift_y = (double)(sdist/sinus);
738 shift_x = (double)(sdist/cosinus);
745 for(bin=0; bin<half; bin++){
750 x_left = floor((
float)(Xptr[imgDim] + bin*shift_x + imgDim/2));
751 if(x_left < 0) x_left = 0;
753 x_right = floor((
float)(Xptr[0] + bin*shift_x + imgDim/2));
754 if(x_right <= 0) x_right = 1;
755 if(x_right > imgDim) x_right = imgDim - 1;
759 for(z=x_left; z <= x_right; z++) {
762 xn = imgDim - 1 - xp;
765 yp = imgDim/2 - floor(Yptr[xp + 1] + bin*shift_y) - 1;
766 yn = imgDim - 1 - yp;
769 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
770 xp < imgDim && xn < imgDim && xn >= 0)
775 a = (float)(xp + 1 - (imgDim/2 + Xptr[imgDim - yp] + bin*shift_x));
776 b = (float)(floor(Yptr[xp + 1] + bin*shift_y) + 1 - (Yptr[xp + 1] +
782 c = (float)(xp + 1 - (imgDim/2 + Xptr[imgDim - yp] +
786 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
787 (Yptr[xp + 1] + (bin+1)*shift_y));
794 printf(
"RADON: Error in factor: eps1=%.5f \n",eps1);
800 scnptr[view*binNr + bin] += eps1 * imgptr[yp*imgDim + xp];
803 scnptr[view*binNr + binNr - 1 - bin] +=
804 eps1 * imgptr[yn*imgDim + xn];
806 if(view != viewNr/4){
810 scnptr[(viewNr - view)*binNr + bin] +=
811 eps1 * imgptr[yp*imgDim + xn];
814 scnptr[(viewNr-view)*binNr + binNr - 1 - bin] +=
815 eps1 * imgptr[yn*imgDim + xp];
820 scnptr[(viewNr/2 - view)*binNr + bin] +=
821 eps1 * imgptr[xn*imgDim + yn];
824 scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin] +=
825 eps1 * imgptr[xp*imgDim + yp];
831 scnptr[(viewNr/2 + view)*binNr + bin] +=
832 eps1 * imgptr[xn*imgDim + yp];
835 scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin] +=
836 eps1 * imgptr[xp*imgDim + yn];
842 y_bottom = floor((
float)(Yptr[imgDim] + bin*shift_y + imgDim/2));
843 if(y_bottom < 0) y_bottom = 0;
844 if(y_bottom > imgDim) y_bottom = 0;
846 y_top = floor((
float)(Yptr[0] + bin*shift_y + imgDim/2));
847 if(y_top > imgDim) y_top = imgDim;
848 if(y_top <= 0) y_top = 1;
852 for(z=y_top; z >= y_bottom; z--) {
855 xp = floor(Xptr[z] + bin*shift_x) + imgDim/2;
856 xn = imgDim - 1 - xp;
859 yn = imgDim - yp - 1;
862 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
863 xp < imgDim && xn < imgDim && xn >= 0)
866 dx = (float)(Xptr[z] + bin*shift_x + imgDim/2 - xp);
867 dy = (float)(Yptr[xp] + bin*shift_y - z + imgDim/2);
881 xp2 =floor(Xptr[z+1] + (bin+1)*shift_x) + imgDim/2;
884 c = (float)(xp + 1 - (imgDim/2 + Xptr[z+1] +
887 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
888 (Yptr[xp + 1] + (bin+1)*shift_y));
889 eps1 = 1 - (a*b + c*d)/2;
892 eps3 = (1 - d)*(b + shift_x - 1)/2;
893 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
895 "4: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
896 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
902 dy = (float)(Yptr[xp+1] + (bin+1)*shift_y - (z + 1) +
908 d = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
912 dx = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
918 c = dx - (float)(xp + 2 - (imgDim/2 + Xptr[z+2] +
924 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+2] +
927 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) + 2 -
928 (Yptr[xp + 2] + (bin+1)*shift_y));
935 dx = (float)(xp + 2 - (imgDim/2 + Xptr[z] + (bin+1)*shift_x));
940 c = dx - (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
946 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
949 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) + 1 -
950 (Yptr[xp + 2] + (bin+1)*shift_y));
954 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
956 "3/v%i: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
957 view,xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
961 c = g - (imgDim/2 + Xptr[z+1] + (bin+1)*shift_x - xp);
964 eps1 = g*h - (a*b + c*d)/2;
967 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
969 "5: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
970 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
977 eps1 = (g*h - a*b)/2;
980 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1) &&
982 "6: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
983 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
990 b = dx - (float)(Xptr[z+1] + bin*shift_x + imgDim/2 - xp);
996 g = 1 - (float)(Xptr[z+1] + bin*shift_x + imgDim/2 - xp);
998 xp2 = floor(Xptr[z+1] + (bin+1)*shift_x) + imgDim/2;
1001 c = (float)(xp + 1 - (imgDim/2 + Xptr[z+1] +
1004 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
1005 (Yptr[xp + 1] + (bin+1)*shift_y));
1006 eps1 = g*h - (a*b + c*d)/2;
1009 eps3 = (1 - d)*((Xptr[z] + (bin+1)*shift_x + imgDim/2) -
1011 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
1013 "8: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
1014 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
1022 dx = (float)((imgDim/2 + Xptr[z] + (bin+1)*shift_x) - (xp+1));
1027 c = (float)((imgDim/2 + Xptr[z+1] + (bin+1)*shift_x) -
1031 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 ||
1033 "2/10: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
1034 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
1037 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
1040 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) + 1 -
1041 (Yptr[xp + 2] + (bin+1)*shift_y));
1044 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 ||
1046 "2/9: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
1047 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
1052 eps1 = sdist/cosinus;
1055 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
1057 "7: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
1058 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
1064 scnptr[view*binNr + bin] += eps1 * imgptr[yp*imgDim + xp];
1067 scnptr[view*binNr + binNr - 1 - bin] +=
1068 eps1 * imgptr[yn*imgDim + xn];
1069 if(view != viewNr/4){
1073 scnptr[(viewNr - view)*binNr + bin] +=
1074 eps1 * imgptr[yp*imgDim + xn];
1077 scnptr[(viewNr-view)*binNr + binNr - 1 - bin] +=
1078 eps1 * imgptr[yn*imgDim + xp];
1083 scnptr[(viewNr/2 - view)*binNr + bin] +=
1084 eps1 * imgptr[xn*imgDim + yn];
1087 scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin] +=
1088 eps1 * imgptr[xp*imgDim + yp];
1094 scnptr[(viewNr/2 + view)*binNr + bin] +=
1095 eps1 * imgptr[xn*imgDim + yp];
1098 scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin] +=
1099 eps1 * imgptr[xp*imgDim + yn];
1102 if(xp + 1 < imgDim && xn - 1 >= 0){
1105 scnptr[view*binNr + bin] +=
1106 eps1 * imgptr[yp*imgDim + xp] +
1107 eps3 * imgptr[yp*imgDim + xp+1];
1110 scnptr[view*binNr + binNr - 1 - bin] +=
1111 eps1 * imgptr[yn*imgDim + xn] +
1112 eps3 * imgptr[yn*imgDim + xn-1];
1113 if(view != viewNr/4) {
1117 scnptr[(viewNr - view)*binNr + bin] +=
1118 eps1 * imgptr[yp*imgDim + xn] +
1119 eps3 * imgptr[yp*imgDim + xn-1];
1122 scnptr[(viewNr-view)*binNr + binNr - 1 - bin] +=
1123 eps1 * imgptr[yn*imgDim + xp] +
1124 eps3 * imgptr[yn*imgDim + xp+1];
1129 scnptr[(viewNr/2 - view)*binNr + bin] +=
1130 eps1 * imgptr[xn*imgDim + yn] +
1131 eps3 * imgptr[(xn-1)*imgDim + yn];
1135 scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin] +=
1136 eps1 * imgptr[xp*imgDim + yp] +
1137 eps3*imgptr[(xp+1)*imgDim+yp];
1142 scnptr[(viewNr/2 + view)*binNr + bin] +=
1143 eps1 * imgptr[xn*imgDim + yp] +
1144 eps3 * imgptr[(xn-1)*imgDim + yp];
1147 scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin] +=
1148 eps1 * imgptr[xp*imgDim + yn] +
1149 eps3*imgptr[(xp+1)*imgDim+yn];
1152 if(xp + 1 < imgDim && xn - 1 >= 0 && yp-1 >= 0 && yn+1 < imgDim) {
1155 scnptr[view*binNr + bin] +=
1156 eps1 * imgptr[yp*imgDim + xp] +
1157 eps3 * imgptr[yp*imgDim + xp+1] +
1158 eps2 * imgptr[(yp-1)*imgDim + xp+1];
1161 scnptr[view*binNr + binNr - 1 - bin] +=
1162 eps1 * imgptr[yn*imgDim + xn] +
1163 eps3 * imgptr[yn*imgDim + xn-1] +
1164 eps2 * imgptr[(yn+1)*imgDim + xn-1];
1166 if(view != viewNr/4){
1170 scnptr[(viewNr - view)*binNr + bin] +=
1171 eps1 * imgptr[yp*imgDim + xn] +
1172 eps3 * imgptr[yp*imgDim + xn-1] +
1173 eps2 * imgptr[(yp-1)*imgDim + xn-1];
1176 scnptr[(viewNr-view)*binNr + binNr - 1 - bin] +=
1177 eps1 * imgptr[yn*imgDim + xp] +
1178 eps3 * imgptr[yn*imgDim + xp+1] +
1179 eps2 * imgptr[(yn+1)*imgDim + xp+1];
1184 scnptr[(viewNr/2 - view)*binNr + bin] +=
1185 eps1 * imgptr[xn*imgDim + yn] +
1186 eps3 * imgptr[xn*imgDim + yn-1] +
1187 eps2 * imgptr[(xn-1)*imgDim + (yn+1)];
1190 scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin] +=
1191 eps1 * imgptr[xp*imgDim + yp] +
1192 eps3*imgptr[(xp+1)*imgDim+yp] +
1193 eps2*imgptr[(xp+1)*imgDim+(yp-1)];
1199 scnptr[(viewNr/2 + view)*binNr + bin] +=
1200 eps1 * imgptr[xn*imgDim + yp] +
1201 eps3 * imgptr[(xn-1)*imgDim + yp] +
1202 eps2 * imgptr[(xn-1)*imgDim + (yp-1)];
1205 scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin] +=
1206 eps1 * imgptr[xp*imgDim + yn] +
1207 eps3*imgptr[(xp+1)*imgDim+yn] +
1208 eps2*imgptr[(xp+1)*imgDim+yn+1];
1220 printf(
"RADON: radonFwdTransformEA() finished.\n");
1430 RADON *radtra,
int set,
int setNr,
float *scndata,
float *imgdata
1432 float *imgptr, *scnptr;
1433 float *Y, *X, *Xptr, *Yptr;
1434 double sinus, cosinus, tanus;
1435 double shift_x, shift_y;
1436 int xp, xn, yp, yn, z;
1437 int x_left, x_right, y_top, y_bottom;
1438 int col, row, view, bin;
1439 int binNr, viewNr, imgDim;
1440 int half, center = -1, mode = 0;
1442 float dx, dy , loi = 1;
1445 if(radtra->
status != RADON_STATUS_INITIALIZED)
return -1;
1464 X=(
float*)calloc(imgDim+1,
sizeof(
float));
1465 Y=(
float*)calloc(imgDim+1,
sizeof(
float));
1466 if(X==NULL || Y==NULL){
1473 for(view=set; view<viewNr/4; view+=setNr){
1484 for(bin=0; bin<binNr; bin++){
1485 col=floor((
float)(bin+.5*sdist)*sdist);
1486 if(col==imgDim) col=imgDim-1;
1490 for(row=0; row<imgDim; row++){
1491 imgptr[row*imgDim + col] += loi*scnptr[bin];
1492 imgptr[(imgDim - 1 - col)*imgDim + row] +=
1493 loi*scnptr[binNr*(viewNr/2) + bin];
1500 cosinus=(double)
radonGetSin(radtra,viewNr/2 + view);
1501 tanus=sinus/cosinus;
1507 shift_y = -(imgDim/2 -.5*sdist)/sinus;
1508 shift_x = -(imgDim/2 -.5*sdist)/cosinus;
1514 for(col=0; col<imgDim+1; col++){
1515 Yptr[col]=(float)(shift_y - z/tanus);
1516 Xptr[col]=(float)(shift_x - z*tanus);
1521 shift_y = (double)(sdist/sinus);
1522 shift_x = (double)(sdist/cosinus);
1530 for(bin=0; bin<half; bin++){
1535 x_left = floor((
float)((Xptr[imgDim] + bin*shift_x) + imgDim/2));
1536 if(x_left < 0) x_left = 0;
1537 x_right = floor((
float)((Xptr[0] + bin*shift_x) + imgDim/2));
1538 if(x_right <= 0) x_right = 1;
1539 if(x_right > imgDim) x_right = imgDim - 1;
1543 for(z=x_left; z <= x_right; z++){
1546 xn = imgDim - 1 - xp;
1549 yp = imgDim/2 - floor(Yptr[xp + 1] + bin*shift_y) - 1;
1550 yn = imgDim - 1 - yp;
1553 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
1554 xp < imgDim && xn < imgDim && xn >= 0)
1560 dx = 1 - (float)((Xptr[imgDim - yp] + bin*shift_x) + imgDim/2 - xp);
1561 dy = 1 - (float)(yp - (imgDim/2 - (Yptr[xp + 1] + bin*shift_y) - 1));
1563 if(dx > 1 || dx < 0) dx = 1;
1564 if(dy > 1 || dy < 0) dy = 1;
1565 loi = sqrt(dx*dx + dy*dy);
1570 imgptr[yp*imgDim + xp] += loi*scnptr[view*binNr + bin];
1573 imgptr[yn*imgDim + xn] +=
1574 loi*scnptr[view*binNr + binNr - 1 - bin];
1576 if(view != viewNr/4){
1580 imgptr[yp*imgDim + xn] += loi*scnptr[(viewNr - view)*binNr + bin];
1583 imgptr[yn*imgDim + xp] +=
1584 loi*scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
1589 imgptr[xn*imgDim + yn] += loi*scnptr[(viewNr/2 - view)*binNr + bin];
1592 imgptr[xp*imgDim + yp] +=
1593 loi*scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
1599 imgptr[xn*imgDim + yp] += loi*scnptr[(viewNr/2 + view)*binNr + bin];
1602 imgptr[xp*imgDim + yn] +=
1603 loi*scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
1610 y_bottom = floor((
float)(Yptr[imgDim] + bin*shift_y + imgDim/2));
1611 if(y_bottom < 0) y_bottom = 0;
1612 if(y_bottom > imgDim) y_bottom = 0;
1614 y_top = floor((
float)(Yptr[0] + bin*shift_y + imgDim/2));
1615 if(y_top > imgDim) y_top = imgDim;
1616 if(y_top <= 0) y_top = 1;
1620 for(z=y_top; z >= y_bottom; z--) {
1623 xp = floor(Xptr[z] + bin*shift_x) + imgDim/2;
1624 xn = imgDim - 1 - xp;
1626 yp = imgDim - z - 1;
1627 yn = imgDim - yp - 1;
1630 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
1631 xp < imgDim && xn < imgDim && xn >= 0)
1636 dx = (float)((Xptr[z] + bin*shift_x) + imgDim/2 - xp);
1637 dy = (float)(yp - (imgDim/2 - (Yptr[xp] + bin*shift_y) - 1));
1638 if(dy > 1 || dy < 0) dy = 1;
1639 loi = sqrt(dx*dx + dy*dy);
1643 imgptr[yp*imgDim + xp] += loi*scnptr[view*binNr + bin];
1646 imgptr[yn*imgDim + xn] +=
1647 loi*scnptr[view*binNr + binNr - 1 - bin];
1649 if(view != viewNr/4){
1653 imgptr[yp*imgDim + xn] += loi*scnptr[(viewNr - view)*binNr + bin];
1656 imgptr[yn*imgDim + xp] +=
1657 loi*scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
1662 imgptr[xn*imgDim + yn] += loi*scnptr[(viewNr/2 - view)*binNr + bin];
1665 imgptr[xp*imgDim + yp] +=
1666 loi*scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
1672 imgptr[xn*imgDim + yp] += loi*scnptr[(viewNr/2 + view)*binNr + bin];
1675 imgptr[xp*imgDim + yn] +=
1676 loi*scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
1697 RADON *radtra,
int set,
int setNr,
float *scndata,
float *imgdata
1699 float *imgptr, *scnptr;
1700 float *Y, *X, *Xptr, *Yptr;
1701 double sinus, cosinus, tanus;
1702 double shift_x, shift_y;
1703 int xp, xn, yp, yn, z, xp2;
1704 int x_left, x_right, y_top, y_bottom;
1705 int col, col1, col2, row, view, bin;
1706 int binNr, viewNr, imgDim, errors=0;
1707 int half, center = -1;
1709 float a=0,b=0, c=0, d=0, g=0, h=0, A;
1710 float dx, dy , eps1 = 0, eps2 = 0, eps3 = 0;
1713 if(radtra->
status != RADON_STATUS_INITIALIZED)
return -1;
1725 X=(
float*)calloc(imgDim+1,
sizeof(
float));
1727 Y=(
float*)calloc(imgDim+1,
sizeof(
float));
1728 if(X==NULL || Y==NULL){
1745 for(view=set; view<=viewNr/4; view+=setNr){
1752 for(bin = 0; bin < half; bin++){
1755 col2 = floor((
float)(bin + 1)*sdist);
1763 if((col2-col1) == 1){
1764 eps1 = (float)(col2 - (bin)*sdist);
1766 eps3 = (float)((bin+1)*sdist - col2);
1770 if((col2-col1) > 1){
1771 eps1 = (float)(col1 + 1 - (bin)*sdist);
1773 eps3 = (float)((bin+1)*sdist - col2);
1780 for(row=0; row<imgDim; row++){
1782 imgptr[row*imgDim + col1] += eps1 * scnptr[bin];
1784 imgptr[row*imgDim + (imgDim - 1 - col1)]+=
1785 eps1 * scnptr[binNr-bin-1] ;
1786 imgptr[(imgDim - 1 - col1)*imgDim + row] +=
1787 eps1 * scnptr[binNr*(viewNr/2) + bin];
1789 imgptr[col1*imgDim + row]+=
1790 eps1 * scnptr[binNr*(viewNr/2) + (binNr-bin-1)];
1793 imgptr[row*imgDim + col1] += eps1 * scnptr[bin];
1794 imgptr[row*imgDim + col2] += eps3 *scnptr[bin];
1796 imgptr[row*imgDim + (imgDim - 1 - col1)] +=
1797 eps1 * scnptr[binNr-bin-1];
1798 imgptr[row*imgDim+(imgDim-1-col2)] +=
1799 eps3*scnptr[binNr-bin-1];
1802 imgptr[(imgDim-1-col1)*imgDim+row] +=
1803 eps1* scnptr[binNr*(viewNr/2) + bin];
1804 imgptr[(imgDim-1-col2)*imgDim+row] +=
1805 eps3*scnptr[binNr*(viewNr/2) + bin];
1807 imgptr[col1*imgDim + row] +=
1808 eps1 * scnptr[binNr*(viewNr/2) + (binNr-bin-1)];
1809 imgptr[col2*imgDim + row] +=
1810 eps3 *scnptr[binNr*(viewNr/2) + (binNr-bin-1)];
1814 for(col = col1; col<=col2; col++){
1816 imgptr[row*imgDim + col1]+= eps1 * scnptr[bin];
1818 imgptr[row*imgDim + (imgDim - 1 - col1)]+=
1819 eps1 * scnptr[binNr-bin-1] ;
1820 imgptr[(imgDim - 1 - col1)*imgDim + row]+=
1821 eps1 * scnptr[binNr*(viewNr/2) + bin];
1823 imgptr[col1*imgDim + row]+=
1824 eps1 * scnptr[binNr*(viewNr/2) + (binNr-bin-1)];
1827 imgptr[row*imgDim + col2]+= eps3 * scnptr[bin];
1829 imgptr[row*imgDim + (imgDim - 1 - col2)]+=
1830 eps3 * scnptr[binNr-bin-1];
1831 imgptr[(imgDim - 1 - col2)*imgDim + row]+=
1832 eps3 * scnptr[binNr*(viewNr/2) + bin];
1834 imgptr[col2*imgDim + row]+=
1835 eps3 * scnptr[binNr*(viewNr/2) + (binNr-bin-1)];
1837 if(col != col1 && col != col2){
1838 imgptr[row*imgDim + col]+= eps2 * scnptr[bin] ;
1840 imgptr[row*imgDim + (imgDim - 1 - col)]+=
1841 eps2 * scnptr[binNr-bin-1];
1842 imgptr[(imgDim - 1 - col)*imgDim + row]+=
1843 eps2 * scnptr[binNr*(viewNr/2) + bin];
1845 imgptr[col*imgDim + row]+=
1846 eps2 * scnptr[binNr*(viewNr/2) + (binNr-bin-1)];
1857 cosinus = (double)
radonGetSin(radtra,viewNr/2 + view);
1858 tanus = sinus/cosinus;
1863 shift_y = -(imgDim/2)/sinus;
1864 shift_x = -(imgDim/2)/cosinus;
1870 for(col=0; col<imgDim+1; col++){
1871 Yptr[col]=(float)(-z/tanus + shift_y);
1872 Xptr[col]=(float)(-z*tanus + shift_x);
1877 shift_y = (double)(sdist/sinus);
1878 shift_x = (double)(sdist/cosinus);
1886 for(bin=0; bin<half; bin++){
1891 x_left = floor((
float)(Xptr[imgDim] + bin*shift_x + imgDim/2));
1892 if(x_left < 0) x_left = 0;
1894 x_right = floor((
float)(Xptr[0] + bin*shift_x + imgDim/2));
1895 if(x_right <= 0) x_right = 1;
1896 if(x_right > imgDim) x_right = imgDim - 1;
1900 for(z=x_left; z <= x_right; z++) {
1903 xn = imgDim - 1 - xp;
1906 yp = imgDim/2 - floor(Yptr[xp + 1] + bin*shift_y) - 1;
1907 yn = imgDim - 1 - yp;
1910 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
1911 xp < imgDim && xn < imgDim && xn >= 0)
1916 a = (float)(xp + 1 - (imgDim/2 + Xptr[imgDim - yp] + bin*shift_x));
1917 b = (float)(floor(Yptr[xp + 1] + bin*shift_y) + 1 - (Yptr[xp + 1] +
1924 c = (float)(xp + 1 - (imgDim/2 + Xptr[imgDim - yp] +
1929 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
1930 (Yptr[xp + 1] + (bin+1)*shift_y));
1937 printf(
"RADON: Error in factor: eps1=%.5f \n",eps1);
1943 imgptr[yp*imgDim + xp]+= eps1 * scnptr[view*binNr + bin];
1946 imgptr[yn*imgDim + xn]+=
1947 eps1 * scnptr[view*binNr + binNr - 1 - bin];
1949 if(view != viewNr/4){
1953 imgptr[yp*imgDim + xn]+=
1954 eps1 * scnptr[(viewNr - view)*binNr + bin];
1957 imgptr[yn*imgDim + xp]+=
1958 eps1 * scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
1963 imgptr[xn*imgDim + yn]+=
1964 eps1 * scnptr[(viewNr/2 - view)*binNr + bin];
1967 imgptr[xp*imgDim + yp]+=
1968 eps1 * scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
1974 imgptr[xn*imgDim + yp]+= eps1 * scnptr[(viewNr/2 + view)*binNr + bin];
1977 imgptr[xp*imgDim + yn]+=
1978 eps1 * scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
1984 y_bottom = floor((
float)(Yptr[imgDim] + bin*shift_y + imgDim/2));
1985 if(y_bottom < 0) y_bottom = 0;
1986 if(y_bottom > imgDim) y_bottom = 0;
1988 y_top = floor((
float)(Yptr[0] + bin*shift_y + imgDim/2));
1989 if(y_top > imgDim) y_top = imgDim;
1990 if(y_top <= 0) y_top = 1;
1993 for(z=y_top; z >= y_bottom; z--) {
1996 xp = floor(Xptr[z] + bin*shift_x) + imgDim/2;
1997 xn = imgDim - 1 - xp;
1999 yp = imgDim - z - 1;
2000 yn = imgDim - yp - 1;
2003 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0
2004 && xp < imgDim && xn < imgDim && xn >= 0)
2008 dx = (float)(Xptr[z] + bin*shift_x + imgDim/2 - xp);
2009 dy = (float)(Yptr[xp] + bin*shift_y - z + imgDim/2);
2024 xp2 =floor(Xptr[z+1] + (bin+1)*shift_x) + imgDim/2;
2027 c = (float)(xp + 1 - (imgDim/2 + Xptr[z+1] + (bin+1)*shift_x));
2029 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
2030 (Yptr[xp + 1] + (bin+1)*shift_y));
2031 eps1 = 1 - (a*b + c*d)/2;
2034 eps3 = (1 - d)*(b + shift_x - 1)/2;
2035 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
2037 "4: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
2038 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
2043 dy = (float)(Yptr[xp+1] + (bin+1)*shift_y - (z + 1) +
2049 d = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
2054 dx = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
2060 c = dx - (float)(xp + 2 - (imgDim/2 + Xptr[z+2] +
2066 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+2] +
2069 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) + 2 -
2070 (Yptr[xp + 2] + (bin+1)*shift_y));
2076 dx = (float)(xp + 2 - (imgDim/2 + Xptr[z] + (bin+1)*shift_x));
2081 c = dx - (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
2087 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
2090 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) + 1 -
2091 (Yptr[xp + 2] + (bin+1)*shift_y));
2095 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
2097 "3/v%i: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
2098 view,xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
2102 c = g - (imgDim/2 + Xptr[z+1] + (bin+1)*shift_x - xp);
2105 eps1 = g*h - (a*b + c*d)/2;
2108 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
2110 "5: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
2111 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
2118 eps1 = (g*h - a*b)/2;
2121 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1) &&
2123 "6: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
2124 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
2131 b = dx - (float)(Xptr[z+1] + bin*shift_x + imgDim/2 - xp);
2137 g = 1 - (float)(Xptr[z+1] + bin*shift_x + imgDim/2 - xp);
2139 xp2 = floor(Xptr[z+1] + (bin+1)*shift_x) + imgDim/2;
2142 c = (float)(xp + 1 - (imgDim/2 + Xptr[z+1] + (bin+1)*shift_x));
2144 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
2145 (Yptr[xp + 1] + (bin+1)*shift_y));
2147 eps1 = g*h - (a*b + c*d)/2;
2150 eps3 = (1 - d)*((Xptr[z] + (bin+1)*shift_x + imgDim/2) -
2152 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1)
2154 "8: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
2155 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
2166 dx = (float)((imgDim/2 + Xptr[z] + (bin+1)*shift_x) - (xp+1));
2171 c = (float)((imgDim/2 + Xptr[z+1] + (bin+1)*shift_x) -
2175 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 ||
2177 "2/10: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
2178 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
2181 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
2184 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) + 1 -
2185 (Yptr[xp + 2] + (bin+1)*shift_y));
2188 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 ||
2190 "2/9: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
2191 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
2197 eps1 = sdist/cosinus;
2200 if((eps1<0 || eps1>1 || eps2<0 || eps2>1 || eps3<0 || eps3>1) &&
2202 "7: (%i,%i) eps1=%f | (%i,%i) eps2=%f | (%i,%i) eps3=%f\n",
2203 xp,yp,eps1,xp+1,yp-1,eps2,xp+1,yp,eps3);
2206 if(!eps2 && !eps3) {
2209 imgptr[yp*imgDim + xp]+= eps1 * scnptr[view*binNr + bin];
2212 imgptr[yn*imgDim + xn]+=
2213 eps1 * scnptr[view*binNr + binNr - 1 - bin];
2215 if(view != viewNr/4) {
2219 imgptr[yp*imgDim + xn]+=
2220 eps1 * scnptr[(viewNr - view)*binNr + bin];
2223 imgptr[yn*imgDim + xp]+=
2224 eps1 * scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
2229 imgptr[xn*imgDim + yn]+=
2230 eps1 * scnptr[(viewNr/2 - view)*binNr + bin];
2233 imgptr[xp*imgDim + yp]+=
2234 eps1 * scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
2240 imgptr[xn*imgDim + yp]+=
2241 eps1 * scnptr[(viewNr/2 + view)*binNr + bin];
2244 imgptr[xp*imgDim + yn]+=
2245 eps1 * scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
2249 if(xp + 1 < imgDim && xn - 1 >= 0) {
2252 imgptr[yp*imgDim + xp] += eps1 * scnptr[view*binNr + bin];
2253 imgptr[yp*imgDim + xp+1] += eps3 *scnptr[view*binNr + bin];
2256 imgptr[yn*imgDim + xn] +=
2257 eps1 * scnptr[view*binNr + binNr - 1 - bin];
2258 imgptr[yn*imgDim + xn-1] +=
2259 eps3 * scnptr[view*binNr + binNr - 1 - bin];
2262 if(view != viewNr/4) {
2266 imgptr[yp*imgDim + xn]+=
2267 eps1 * scnptr[(viewNr - view)*binNr + bin];
2268 imgptr[yp*imgDim + xn-1] +=
2269 eps3 * scnptr[(viewNr - view)*binNr + bin];
2273 imgptr[yn*imgDim + xp] +=
2274 eps1 * scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
2275 imgptr[yn*imgDim + xp+1] +=
2276 eps3 *scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
2281 imgptr[xn*imgDim + yn]+=
2282 eps1 * scnptr[(viewNr/2 - view)*binNr + bin];
2283 imgptr[(xn-1)*imgDim + yn] +=
2284 eps3 *scnptr[(viewNr/2 - view)*binNr + bin];
2288 imgptr[xp*imgDim + yp]+=
2289 eps1 * scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
2290 imgptr[(xp+1)*imgDim+yp]+=
2291 eps3 * scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
2298 imgptr[xn*imgDim + yp]+=
2299 eps1 * scnptr[(viewNr/2 + view)*binNr + bin];
2300 imgptr[(xn-1)*imgDim + yp] +=
2301 eps3 * scnptr[(viewNr/2 + view)*binNr + bin];
2304 imgptr[xp*imgDim + yn]+=
2305 eps1 * scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
2306 imgptr[(xp+1)*imgDim+yn] +=
2307 eps3*scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
2311 if(xp+1 < imgDim && xn-1 >= 0 && yp-1 >= 0 && yn+1 < imgDim) {
2315 imgptr[yp*imgDim + xp] += eps1 * scnptr[view*binNr + bin];
2316 imgptr[yp*imgDim + xp+1] += eps3 *scnptr[view*binNr + bin];
2317 imgptr[(yp-1)*imgDim + xp+1] +=
2318 eps2 * scnptr[view*binNr + bin];
2321 imgptr[yn*imgDim + xn] +=
2322 eps1 * scnptr[view*binNr + binNr - 1 - bin];
2323 imgptr[yn*imgDim + xn-1] +=
2324 eps3 * scnptr[view*binNr + binNr - 1 - bin];
2325 imgptr[(yn+1)*imgDim + xn-1] +=
2326 eps2 * scnptr[view*binNr + binNr - 1 - bin];
2328 if(view != viewNr/4) {
2332 imgptr[yp*imgDim + xn] +=
2333 eps1 * scnptr[(viewNr - view)*binNr + bin];
2334 imgptr[yp*imgDim + xn-1] +=
2335 eps3 *scnptr[(viewNr - view)*binNr + bin];
2336 imgptr[(yp-1)*imgDim + xn-1]+=
2337 eps2 * scnptr[(viewNr - view)*binNr + bin];
2341 imgptr[yn*imgDim + xp] +=
2342 eps1 * scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
2343 imgptr[yn*imgDim + xp+1] +=
2344 eps3 * scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
2345 imgptr[(yn+1)*imgDim + xp+1] +=
2346 eps2 * scnptr[(viewNr-view)*binNr + binNr - 1 - bin];
2352 imgptr[xn*imgDim + yn]+=
2353 eps1 * scnptr[(viewNr/2 - view)*binNr + bin];
2354 imgptr[xn*imgDim + yn-1] +=
2355 eps3 *scnptr[(viewNr/2 - view)*binNr + bin];
2356 imgptr[(xn-1)*imgDim + (yn+1)] +=
2357 eps2 * scnptr[(viewNr/2 - view)*binNr + bin];
2361 imgptr[xp*imgDim + yp]+=
2362 eps1 * scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
2363 imgptr[(xp+1)*imgDim+yp] +=
2364 eps3*scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
2365 imgptr[(xp+1)*imgDim+(yp-1)] +=
2366 eps2*scnptr[(viewNr/2 - view)*binNr + binNr - 1 - bin];
2373 imgptr[xn*imgDim + yp] +=
2374 eps1 * scnptr[(viewNr/2 + view)*binNr + bin];
2375 imgptr[(xn-1)*imgDim + yp] +=
2376 eps3 * scnptr[(viewNr/2 + view)*binNr + bin];
2377 imgptr[(xn-1)*imgDim + (yp-1)] +=
2378 eps2 *scnptr[(viewNr/2 + view)*binNr + bin];
2381 imgptr[xp*imgDim + yn]+=
2382 eps1 * scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
2383 imgptr[(xp+1)*imgDim+yn] +=
2384 eps3 * scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
2385 imgptr[(xp+1)*imgDim+yn+1] +=
2386 eps2*scnptr[(viewNr/2 + view)*binNr + binNr - 1 - bin];
2606 unsigned short int **coords, *factors, **coptr, *facptr;
2608 float *Y, *X, *Xptr, *Yptr;
2609 double sinus, cosinus, tanus;
2610 double shift_x, shift_y;
2611 int xp, xn, yp, yn, z;
2612 int x_left, x_right, y_top, y_bottom;
2613 int col, row, view, bin, pix;
2614 int binNr, viewNr, imgDim, views, rows, mode, half;
2616 float scale, sum=0, sqr_sum=0, min=0, max=0;
2617 float dx, dy , loi = 1;
2620 if(radtra->
status != RADON_STATUS_INITIALIZED)
return -1;
2632 mat->
type=PRMAT_TYPE_ECAT931;
2633 }
else if(binNr == 281){
2634 mat->
type=PRMAT_TYPE_GE;
2636 mat->
type=PRMAT_TYPE_NA;
2644 mat->
prmatfov = (
int*)calloc(2,
sizeof(
int));
2649 views = viewNr/4 + 1;
2655 mat->
dime=calloc(rows,
sizeof(
int));
2656 mat->
_factdata=(
unsigned short int***)calloc(rows,
sizeof(
unsigned short int**));
2667 coords = (
unsigned short int**)calloc(2*imgDim,
sizeof(
unsigned short int*));
2668 factors = (
unsigned short int*)calloc(2*imgDim,
sizeof(
unsigned short int));
2669 if(!coords || !factors)
return 5;
2671 for(col=0; col<2*imgDim; col++){
2672 coords[col] = (
unsigned short int*)calloc(2,
sizeof(
unsigned short int));
2673 if(!coords[col])
return -1;
2684 X=(
float*)calloc(imgDim+1,
sizeof(
float));
2686 Y=(
float*)calloc(imgDim+1,
sizeof(
float));
2687 if(X==NULL || Y==NULL){
2701 for(view=0; view<views; view++){
2713 for(bin=0; bin<half; bin++){
2714 col = floor((
float)(bin+.5*sdist)*sdist);
2721 for(row=0; row<imgDim; row++){
2729 coptr[pix][0] = (
unsigned short int)col;
2730 coptr[pix][1] = (
unsigned short int)row;
2732 facptr[pix] = (
unsigned short int)(scale*loi);
2734 if(min>loi) min=loi;
2735 if(max<loi) max=loi;
2747 (
unsigned short int**)calloc(pix,
sizeof(
unsigned short int*));
2752 for(col=0; col<pix; col++) {
2754 (
unsigned short int*)calloc(3,
sizeof(
unsigned short int));
2755 if(!mat->
_factdata[bin][col])
return -1;
2760 for(col=0; col<pix; col++) {
2761 mat->
fact[bin][col][0] = coptr[col][0];
2762 mat->
fact[bin][col][1] = coptr[col][1];
2763 mat->
fact[bin][col][2] = facptr[col];
2776 cosinus = (double)
radonGetSin(radtra,viewNr/2 + view);
2777 tanus = sinus/cosinus;
2782 shift_y = -(imgDim/2 -.5*sdist)/sinus;
2783 shift_x = -(imgDim/2 -.5*sdist)/cosinus;
2789 for(col=0; col<imgDim+1; col++){
2790 Yptr[col]=(float)(shift_y - z/tanus);
2791 Xptr[col]=(float)(shift_x - z*tanus);
2796 shift_y = (double)(sdist/sinus);
2797 shift_x = (double)(sdist/cosinus);
2805 for(bin=0; bin<half; bin++){
2815 x_left = floor((
float)(Xptr[imgDim] + bin*shift_x + imgDim/2));
2816 if(x_left < 0) x_left = 0;
2818 x_right = floor((
float)(Xptr[0] + bin*shift_x + imgDim/2));
2819 if(x_right <= 0) x_right = 1;
2820 if(x_right > imgDim) x_right = imgDim - 1;
2824 for(z=x_left; z <= x_right; z++) {
2827 xn = imgDim - 1 - xp;
2830 yp = imgDim/2 - floor(Yptr[xp + 1] + bin*shift_y) - 1;
2831 yn = imgDim - 1 - yp;
2834 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
2835 xp < imgDim && xn < imgDim && xn >= 0) {
2841 dx = (float)(xp + 1 - (imgDim/2 + Xptr[imgDim - yp] + bin*shift_x));
2842 dy = (float)(floor(Yptr[xp + 1] + bin*shift_y) + 1 -
2843 (Yptr[xp + 1] + bin*shift_y));
2844 if(dx > 1 || dx < 0) dx = 1;
2845 if(dy > 1 || dy < 0) dy = 1;
2846 loi = sqrt(dx*dx + dy*dy);
2860 facptr[pix] = (
unsigned short int)(scale*loi);
2863 if(min>loi) min=loi;
2864 if(max<loi) max=loi;
2874 y_bottom = floor((
float)(Yptr[imgDim] + bin*shift_y + imgDim/2));
2875 if(y_bottom < 0) y_bottom = 0;
2876 if(y_bottom > imgDim) y_bottom = 0;
2878 y_top = floor((
float)(Yptr[0] + bin*shift_y + imgDim/2));
2879 if(y_top > imgDim) y_top = imgDim-1;
2880 if(y_top <= 0) y_top = 1;
2884 for(z=y_top; z >= y_bottom; z--) {
2887 xp = floor(Xptr[z] + bin*shift_x) + imgDim/2;
2888 xn = imgDim - 1 - xp;
2890 yp = imgDim - z - 1;
2891 yn = imgDim - yp - 1;
2894 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
2895 xp < imgDim && xn < imgDim && xn >= 0) {
2900 dx = (float)(Xptr[z] + bin*shift_x + imgDim/2 - xp);
2901 dy = (float)(Yptr[xp] + bin*shift_y - z + imgDim/2);
2902 if(dy > 1 || dy < 0) {
2903 dx = dx - (float)(Xptr[z+1] + bin*shift_x + imgDim/2 - xp);
2906 loi = sqrt(dx*dx + dy*dy)/diam;
2919 facptr[pix] = (
unsigned short int)(scale*loi);
2922 if(min>loi) min=loi;
2923 if(max<loi) max=loi;
2933 (
unsigned short int**)calloc(pix,
sizeof(
unsigned short int*));
2934 if(!mat->
_factdata[view*half + bin])
return -1;
2938 for(col=0; col<pix; col++){
2940 (
unsigned short int*)calloc(3,
sizeof(
unsigned short int));
2941 if(!mat->
_factdata[view*half + bin][col])
return -1;
2946 for(col=0; col<pix; col++){
2947 mat->
fact[view*half + bin][col][0] = coptr[col][0];
2948 mat->
fact[view*half + bin][col][1] = coptr[col][1];
2949 mat->
fact[view*half + bin][col][2] = facptr[col];
2953 mat->
dime[view*half + bin]=pix;
2971 mat->
status = PRMAT_STATUS_BS_OCCUPIED;
2987 unsigned short int **coords, *factors, **coptr, *facptr;
2989 float *Y, *X, *Xptr, *Yptr;
2990 double sinus, cosinus, tanus;
2991 double shift_x, shift_y;
2992 int xp, xn, yp, yn, z, xp2;
2993 int x_left, x_right, y_top, y_bottom;
2994 int col, col1, col2, row, view, bin, pix, errors=0;
2995 int binNr, viewNr, imgDim, mode, views, rows, half;
2997 float a=0,b=0, c=0, d=0, g=0, h=0, A;
2999 float dx, dy , eps1 = 0, eps2 = 0, eps3 = 0;
3000 float min=0, max=0, sum=0, scale, sqr_sum=0;
3003 if(radtra->
status != RADON_STATUS_INITIALIZED)
return -1;
3018 mat->
type=PRMAT_TYPE_ECAT931;
3019 }
else if(binNr == 281) {
3020 mat->
type=PRMAT_TYPE_GE;
3022 mat->
type=PRMAT_TYPE_NA;
3030 mat->
prmatfov = (
int*)calloc(2,
sizeof(
int));
3035 views = viewNr/4 + 1;
3041 mat->
dime=calloc(rows,
sizeof(
int));
3042 mat->
_factdata=(
unsigned short int***)calloc(rows,
sizeof(
unsigned short int**));
3053 coords = (
unsigned short int**)calloc(4*imgDim,
sizeof(
unsigned short int*));
3054 factors = (
unsigned short int*)calloc(4*imgDim,
sizeof(
unsigned short int));
3055 if(!coords || !factors)
return 5;
3057 for(col=0; col<4*imgDim; col++){
3058 coords[col] = (
unsigned short int*)calloc(2,
sizeof(
unsigned short int));
3059 if(!coords[col])
return -1;
3066 X=(
float*)calloc(imgDim+1,
sizeof(
float));
3068 Y=(
float*)calloc(imgDim+1,
sizeof(
float));
3069 if(X==NULL || Y==NULL){
3082 for(view=0; view<views; view++){
3089 for(bin = 0; bin < half; bin++){
3095 col2 = floor((
float)(bin + 1)*sdist);
3103 if((col2-col1) == 1){
3104 eps1 = (float)(col2 - (bin)*sdist);
3106 eps3 = (float)((bin+1)*sdist - col2);
3109 if((col2-col1) > 1){
3110 eps1 = (float)(col1 + 1 - (bin)*sdist);
3112 eps3 = (float)((bin+1)*sdist - col2);
3116 for(row=0; row<imgDim; row++){
3126 coptr[pix][0] = (
unsigned short int)col1;
3127 coptr[pix][1] = (
unsigned short int)row;
3129 facptr[pix] = (
unsigned short int)(scale*eps1);
3131 if(min>eps1) min=eps1;
3132 if(max<eps1) max=eps1;
3134 sqr_sum += eps1*eps1;
3140 coptr[pix][0] = (
unsigned short int)col1;
3141 coptr[pix][1] = (
unsigned short int)row;
3143 facptr[pix] = (
unsigned short int)(scale*eps1);
3145 if(min>eps1) min=eps1;
3146 if(max<eps1) max=eps1;
3148 sqr_sum += eps1*eps1;
3152 coptr[pix][0] = (
unsigned short int)col2;
3153 coptr[pix][1] = (
unsigned short int)row;
3155 facptr[pix] = (
unsigned short int)(scale*eps3);
3157 if(min>eps3) min=eps3;
3158 if(max<eps3) max=eps3;
3160 sqr_sum += eps3*eps3;
3166 for(col = col1; col<=col2; col++){
3169 coptr[pix][0] = (
unsigned short int)col1;
3170 coptr[pix][1] = (
unsigned short int)row;
3172 facptr[pix] = (
unsigned short int)(scale*eps1);
3174 if(min>eps1) min=eps1;
3175 if(max<eps1) max=eps1;
3177 sqr_sum += eps1*eps1;
3183 coptr[pix][0] = (
unsigned short int)col2;
3184 coptr[pix][1] = (
unsigned short int)row;
3186 facptr[pix] = (
unsigned short int)(scale*eps3);
3188 if(min>eps3) min=eps3;
3189 if(max<eps3) max=eps3;
3191 sqr_sum += eps3*eps3;
3196 if(col != col1 && col != col2){
3197 coptr[pix][0] = (
unsigned short int)col;
3198 coptr[pix][1] = (
unsigned short int)row;
3200 facptr[pix] = (
unsigned short int)(scale*eps2);
3202 if(min>eps2) min=eps2;
3203 if(max<eps2) max=eps2;
3205 sqr_sum += eps2*eps2;
3218 (
unsigned short int**)calloc(pix,
sizeof(
unsigned short int*));
3222 for(col=0; col<pix; col++){
3224 (
unsigned short int*)calloc(3,
sizeof(
unsigned short int));
3225 if(!mat->
_factdata[bin][col])
return -1;
3230 for(col=0; col<pix; col++){
3231 mat->
fact[bin][col][0] = coptr[col][0];
3232 mat->
fact[bin][col][1] = coptr[col][1];
3233 mat->
fact[bin][col][2] = facptr[col];
3246 cosinus = (double)
radonGetSin(radtra,viewNr/2 + view);
3247 tanus = sinus/cosinus;
3252 shift_y = -(imgDim/2)/sinus;
3253 shift_x = -(imgDim/2)/cosinus;
3259 for(col=0; col<imgDim+1; col++){
3260 Yptr[col]=(float)(-z/tanus + shift_y);
3261 Xptr[col]=(float)(-z*tanus + shift_x);
3266 shift_y = (double)(sdist/sinus);
3267 shift_x = (double)(sdist/cosinus);
3275 for(bin=0; bin<half; bin++){
3283 x_left = floor((
float)(Xptr[imgDim] + bin*shift_x + imgDim/2));
3284 if(x_left < 0) x_left = 0;
3286 x_right = floor((
float)(Xptr[0] + bin*shift_x + imgDim/2));
3287 if(x_right <= 0) x_right = 1;
3288 if(x_right > imgDim) x_right = imgDim - 1;
3292 for(z=x_left; z <= x_right; z++) {
3295 xn = imgDim - 1 - xp;
3298 yp = imgDim/2 - floor(Yptr[xp + 1] + bin*shift_y) - 1;
3299 yn = imgDim - 1 - yp;
3302 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
3303 xp < imgDim && xn < imgDim && xn >= 0) {
3315 a = (float)(xp + 1 - (imgDim/2 + Xptr[imgDim - yp] + bin*shift_x));
3316 b = (float)(floor(Yptr[xp + 1] + bin*shift_y) + 1 -
3317 (Yptr[xp + 1] + bin*shift_y));
3323 c = (float)(xp + 1 - (imgDim/2 + Xptr[imgDim - yp] +
3329 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
3330 (Yptr[xp + 1] + (bin+1)*shift_y));
3338 if(eps1 < 0 || eps1 > 1) errors++;
3343 facptr[pix] = (
unsigned short int)(scale*eps1);
3346 if(min>eps1) min=eps1;
3347 if(max<eps1) max=eps1;
3348 sqr_sum += eps1*eps1;
3357 y_bottom = floor((
float)(Yptr[imgDim] + bin*shift_y + imgDim/2));
3358 if(y_bottom < 0) y_bottom = 0;
3359 if(y_bottom > imgDim) y_bottom = 0;
3361 y_top = floor((
float)(Yptr[0] + bin*shift_y + imgDim/2));
3362 if(y_top > imgDim) y_top = imgDim;
3363 if(y_top <= 0) y_top = 1;
3367 for(z=y_top; z >= y_bottom; z--) {
3370 xp = floor(Xptr[z] + bin*shift_x) + imgDim/2;
3371 xn = imgDim - 1 - xp;
3373 yp = imgDim - z - 1;
3374 yn = imgDim - yp - 1;
3377 if(yp < imgDim && yp >= 0 && yn < imgDim && yn >= 0 && xp >= 0 &&
3378 xp < imgDim && xn < imgDim && xn >= 0) {
3389 dx = (float)(Xptr[z] + bin*shift_x + imgDim/2 - xp);
3390 dy = (float)(Yptr[xp] + bin*shift_y - z + imgDim/2);
3409 xp2 =floor(Xptr[z+1] + (bin+1)*shift_x) + imgDim/2;
3413 c = (float)(xp + 1 - (imgDim/2 + Xptr[z+1] +
3416 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
3417 (Yptr[xp + 1] + (bin+1)*shift_y));
3418 eps1 = 1 - (a*b + c*d)/2;
3421 eps3 = (1 - d)*(b + shift_x - 1)/2;
3426 dy = (float)(Yptr[xp+1] + (bin+1)*shift_y - (z + 1) +
3432 d = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
3436 dx = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
3442 c = dx - (float)(xp + 2 - (imgDim/2 + Xptr[z+2] +
3448 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+2] +
3451 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) +
3452 2 - (Yptr[xp + 2] + (bin+1)*shift_y));
3459 dx = (float)(xp + 2 - (imgDim/2 + Xptr[z] +
3465 c = dx - (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
3471 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
3474 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) +
3475 1 - (Yptr[xp + 2] + (bin+1)*shift_y));
3482 c = g - (imgDim/2 + Xptr[z+1] + (bin+1)*shift_x - xp);
3486 eps1 = g*h - (a*b + c*d)/2;
3496 eps1 = (g*h - a*b)/2;
3506 b = dx - (float)(Xptr[z+1] + bin*shift_x + imgDim/2 - xp);
3515 g = 1 - (float)(Xptr[z+1] + bin*shift_x + imgDim/2 - xp);
3516 xp2 = floor(Xptr[z+1] + (bin+1)*shift_x) + imgDim/2;
3519 c = (float)(xp + 1 - (imgDim/2 + Xptr[z+1] +
3522 d = (float)(floor(Yptr[xp + 1] + (bin+1)*shift_y) + 1 -
3523 (Yptr[xp + 1] + (bin+1)*shift_y));
3524 eps1 = g*h - (a*b + c*d)/2;
3527 eps3 = (1 - d)*((Xptr[z] + (bin+1)*shift_x + imgDim/2)
3537 dx = (float)((imgDim/2 + Xptr[z] + (bin+1)*shift_x) - (xp+1));
3542 c = (float)((imgDim/2 + Xptr[z+1] + (bin+1)*shift_x) -
3548 c = (float)(xp + 2 - (imgDim/2 + Xptr[z+1] +
3551 d = (float)(floor(Yptr[xp + 2] + (bin+1)*shift_y) + 1 -
3552 (Yptr[xp + 2] + (bin+1)*shift_y));
3559 eps1 = sdist/cosinus;
3564 if(eps1 <= 0 || eps1 > 1) {
3566 printf(
"Error: eps1 = %f \n",eps1);
3569 if(eps2 < 0 || eps2 > 1){
3573 if(eps3 < 0 || eps3 > 1){
3581 facptr[pix] = (
unsigned short int)(scale*eps1);
3584 if(min>eps1) min=eps1;
3585 if(max<eps1) max=eps1;
3586 sqr_sum += eps1*eps1;
3590 if(xp + 1 < imgDim && xn - 1 >= 0){
3594 facptr[pix] = (
unsigned short int)(scale*eps1);
3597 if(min>eps1) min=eps1;
3598 if(max<eps1) max=eps1;
3599 sqr_sum += eps1*eps1;
3604 coptr[pix][0] = xp+1;
3606 facptr[pix] = (
unsigned short int)(scale*eps3);
3609 if(min>eps3) min=eps3;
3610 if(max<eps3) max=eps3;
3611 sqr_sum += eps3*eps3;
3616 if(xp+1 < imgDim && xn-1 >= 0 && yp-1 >= 0 && yn+1 < imgDim) {
3620 facptr[pix] = (
unsigned short int)(scale*eps1);
3623 if(min>eps1) min=eps1;
3624 if(max<eps1) max=eps1;
3625 sqr_sum += eps1*eps1;
3630 coptr[pix][0] = xp+1;
3632 facptr[pix] = (
unsigned short int)(scale*eps3);
3635 if(min>eps3) min=eps3;
3636 if(max<eps3) max=eps3;
3637 sqr_sum += eps3*eps3;
3642 coptr[pix][0] = xp+1;
3643 coptr[pix][1] = yp-1;
3644 facptr[pix] = (
unsigned short int)(scale*eps2);
3647 if(min>eps2) min=eps2;
3648 if(max<eps2) max=eps2;
3649 sqr_sum += eps2*eps2;
3663 (
unsigned short int**)calloc(pix,
sizeof(
unsigned short int*));
3664 if(!mat->
_factdata[half*view + bin])
return -1;
3668 for(col=0; col<pix; col++){
3670 (
unsigned short int*)calloc(3,
sizeof(
unsigned short int));
3671 if(!mat->
_factdata[half*view + bin][col])
return -1;
3676 for(col=0; col<pix; col++){
3677 mat->
fact[half*view + bin][col][0] = coptr[col][0];
3678 mat->
fact[half*view + bin][col][1] = coptr[col][1];
3679 mat->
fact[half*view + bin][col][2] = facptr[col];
3683 mat->
dime[half*view + bin]=pix;
3700 mat->
status = PRMAT_STATUS_BS_OCCUPIED;
3721 unsigned int **tmpData, **tmpptr;
3722 unsigned int *coords, *iptr;
3723 unsigned int col, row, pix=0, p=0, lors=0, view, bin;
3724 unsigned int binNr, viewNr, imgDim, views, half, center;
3727 float diam, sampledist;
3730 if(mat->
status < PRMAT_STATUS_BS_OCCUPIED)
return -1;
3744 lors = ceil(diam/sampledist) + 1;
3745 tmpData = (
unsigned int**)calloc(imgDim*imgDim,
sizeof(
unsigned int*));
3746 for(p=0; p<imgDim*imgDim; p++){
3747 tmpData[p]=(
unsigned int*)calloc(lors*viewNr,
sizeof(
unsigned int));
3749 fprintf(stderr,
"Error: not enough memory.\n");
3757 for(p=0; p<imgDim*imgDim; p++) tmpptr[p][0]=0;
3760 for(view=0; view<views + 1; view++){
3761 for(bin=0; bin<half; bin++){
3762 row = view*half + bin;
3766 xn = imgDim - 1 - xp;
3768 yn = imgDim - 1 - yp;
3770 if(xp != 0 || yp != 0){
3774 tmpptr[yp*imgDim + xp][++tmpptr[yp*imgDim + xp][0]] = bin;
3776 tmpptr[yp*imgDim+(imgDim-1-xp)][++tmpptr[yp*imgDim+(imgDim-1-xp)][0]]=
3778 tmpptr[(imgDim-1-xp)*imgDim+yp][++tmpptr[(imgDim-1-xp)*imgDim+yp][0]]=
3779 binNr*(viewNr/2) + bin;
3781 tmpptr[xp*imgDim+yp][++tmpptr[xp*imgDim+yp][0]] =
3782 binNr*(viewNr/2) + (binNr-bin-1);
3785 if(view == viewNr/4) {
3788 tmpptr[yp*imgDim + xp][++tmpptr[yp*imgDim + xp][0]] =
3789 (viewNr/4)*binNr + bin;
3792 tmpptr[yn*imgDim + xn][++tmpptr[yn*imgDim + xn][0]] =
3793 (viewNr/4)*binNr + binNr - 1 - bin;
3798 tmpptr[xn*imgDim + yp][++tmpptr[xn*imgDim + yp][0]] =
3799 (viewNr/2 + viewNr/4)*binNr + bin;
3802 tmpptr[xp*imgDim + yn][++tmpptr[xp*imgDim + yn][0]] =
3803 (viewNr/2 + viewNr/4)*binNr + binNr - 1 - bin;
3806 if(view != 0 && view != viewNr/4) {
3809 tmpptr[yp*imgDim + xp][++tmpptr[yp*imgDim + xp][0]] =
3813 tmpptr[yn*imgDim + xn][++tmpptr[yn*imgDim + xn][0]] =
3814 view*binNr + binNr - 1 - bin;
3819 tmpptr[xn*imgDim + yp][++tmpptr[xn*imgDim + yp][0]] =
3820 (viewNr/2 + view)*binNr + bin;
3823 tmpptr[xp*imgDim + yn][++tmpptr[xp*imgDim + yn][0]] =
3824 (viewNr/2 + view)*binNr + binNr - 1 - bin;
3829 tmpptr[yp*imgDim + xn][++tmpptr[yp*imgDim + xn][0]] =
3830 (viewNr - view)*binNr + bin;
3833 tmpptr[yn*imgDim + xp][++tmpptr[yn*imgDim + xp][0]] =
3834 (viewNr-view)*binNr + binNr - 1 - bin;
3839 tmpptr[xn*imgDim + yn][++tmpptr[xn*imgDim + yn][0]] =
3840 (viewNr/2 - view)*binNr + bin;
3843 tmpptr[xp*imgDim + yp][++tmpptr[xp*imgDim + yp][0]] =
3844 (viewNr/2 - view)*binNr + binNr - 1 - bin;
3853 for(row = 0; row < imgDim; row++){
3854 for(col = 0; col < imgDim; col++){
3862 coords = (
unsigned int*)calloc(pix,
sizeof(
int));
3864 for(row = 0; row < imgDim; row++){
3865 for(col = 0; col < imgDim; col++){
3868 iptr[p] = tmpptr[row*imgDim + col][0];
3877 free((
unsigned int**)tmpData);
3887 for(row = 0; row < imgDim; row++) {
3888 for(col = 0; col < imgDim; col++) {
3891 mat -> lines[p][0] = row*imgDim + col;
3893 mat -> lines[p][1] = iptr[p];
3895 for(lors = 0; lors < iptr[p]; lors++)
3896 mat -> lines[p][lors + 2] = tmpptr[row*imgDim + col][lors+1];
3904 mat->
status = PRMAT_STATUS_LU_OCCUPIED;
3906 free((
unsigned int**)tmpData);
3927 unsigned int *coords, *iptr;
3928 unsigned int imgDim=128, binNr=256, viewNr=192, view, bin, pixNr=0;
3929 unsigned int row, col, rows, half, centerbin, p;
3932 float fact, sqr_sum;
3937 printf(
"radonSetLors() started. \n");
3946 half = (binNr - 1)/2 + 1;
3947 centerbin = half - 1;
3959 rows = viewNr*binNr;
3960 coords = (
unsigned int*)calloc(rows,
sizeof(
int));
3965 for(view=0; view<p + 1; view++){
3966 for(bin=0; bin<half; bin++){
3967 row = view*half + bin;
3970 iptr[view*binNr + bin] = pixNr;
3972 if(bin != centerbin)
3973 iptr[view*binNr + binNr - 1 - bin] = pixNr;
3975 if(view != 0 && view != viewNr/4){
3978 iptr[(viewNr - view)*binNr + bin] = pixNr;
3979 if(bin != centerbin)
3980 iptr[(viewNr-view)*binNr + binNr - 1 - bin] = pixNr;
3984 iptr[(viewNr/2 - view)*binNr + bin] = pixNr;
3985 if(bin != centerbin)
3986 iptr[(viewNr/2 - view)*binNr + binNr - 1 - bin] = pixNr;
3991 iptr[(viewNr/2 + view)*binNr + bin] = pixNr;
3992 if(bin != centerbin)
3993 iptr[(viewNr/2 + view)*binNr + binNr - 1 - bin] = pixNr;
4004 printf(
"Allocation done \n");
4007 for(view=0; view<p + 1; view++){
4008 for(bin=0; bin<half; bin++){
4009 row = view*half + bin;
4014 fact = mat->
fact[row][col][2];
4016 xn = imgDim - 1 - xp;
4018 yn = imgDim - 1 - yp;
4021 ext_mat.
fact[view*binNr + bin][col][0] = xp;
4022 ext_mat.
fact[view*binNr + bin][col][1] = yp;
4023 ext_mat.
fact[view*binNr + bin][col][2] = fact;
4027 if(bin != centerbin){
4028 ext_mat.
fact[view*binNr + binNr - 1 - bin][col][0] = xn;
4029 ext_mat.
fact[view*binNr + binNr - 1 - bin][col][1] = yn;
4030 ext_mat.
fact[view*binNr + binNr - 1 - bin][col][2] = fact;
4034 if(view != 0 && view != viewNr/4){
4037 ext_mat.
fact[(viewNr - view)*binNr + bin][col][0] = xn;
4038 ext_mat.
fact[(viewNr - view)*binNr + bin][col][1] = yp;
4039 ext_mat.
fact[(viewNr - view)*binNr + bin][col][2] = fact;
4042 if(bin != centerbin){
4044 ext_mat.
fact[(viewNr - view)*binNr +binNr - 1 - bin][col][0] = xp;
4045 ext_mat.
fact[(viewNr - view)*binNr +binNr - 1 - bin][col][1] = yn;
4046 ext_mat.
fact[(viewNr - view)*binNr +binNr - 1 - bin][col][2] = fact;
4053 ext_mat.
fact[(viewNr/2 - view)*binNr + bin][col][0] = yn;
4054 ext_mat.
fact[(viewNr/2 - view)*binNr + bin][col][1] = xn;
4055 ext_mat.
fact[(viewNr/2 - view)*binNr + bin][col][2] = fact;
4058 if(bin != centerbin){
4059 ext_mat.
fact[(viewNr/2 - view)*binNr +binNr-1-bin][col][0] = yp;
4060 ext_mat.
fact[(viewNr/2 - view)*binNr +binNr-1-bin][col][1] = xp;
4061 ext_mat.
fact[(viewNr/2 - view)*binNr +binNr-1-bin][col][2] = fact;
4062 ext_mat.
factor_sqr_sum[(viewNr/2-view)*binNr+binNr-1-bin] = sqr_sum;
4068 ext_mat.
fact[(viewNr/2 + view)*binNr + bin][col][0] = yp;
4069 ext_mat.
fact[(viewNr/2 + view)*binNr + bin][col][1] = xn;
4070 ext_mat.
fact[(viewNr/2 + view)*binNr + bin][col][2] = fact;
4074 if(bin != centerbin){
4075 ext_mat.
fact[(viewNr/2 + view)*binNr + binNr-1-bin][col][0] = yn;
4076 ext_mat.
fact[(viewNr/2 + view)*binNr + binNr-1-bin][col][1] = xp;
4077 ext_mat.
fact[(viewNr/2 + view)*binNr + binNr-1-bin][col][2] = fact;
4078 ext_mat.
factor_sqr_sum[(viewNr/2 +view)*binNr +binNr-1-bin] = sqr_sum;
4088 for(row=0; row<mat->
dimr; row++){
4089 for(col=0; col<mat->
dime[row]; col++){
4090 free((
unsigned short int*)mat->
_factdata[row][col]);
4094 free((
int*)mat->
dime);
4106 printf(
"Allocation done \n");
4116 mat->
fact[row][col][2] = ext_mat.
fact[row][col][2];