61 #define POSIX_SOURCE 1
62 #include "sinfo_vltPort.h"
72 #include "sinfo_new_bezier.h"
73 #include "sinfo_msg.h"
94 sinfo_im_xy(cpl_image* im,
int X,
int Y)
98 res = X + Y * cpl_image_get_size_x(im);
110 sinfo_im_xyz(cpl_image* im,
int X,
int Y,
int Z)
113 res = X + Y * cpl_image_get_size_x(im)
114 + Z * cpl_image_get_size_x(im) * cpl_image_get_size_y(im);
127 sinfo_cu_xy(cpl_imagelist* cu,
int X,
int Y)
131 res = X + Y * cpl_image_get_size_x(cpl_imagelist_get(cu, 0));
145 sinfo_cu_xyz(cpl_imagelist* cu,
int X,
int Y,
int Z)
148 res = X + Y * cpl_image_get_size_x(cpl_imagelist_get(cu, 0))
149 + Z * cpl_image_get_size_x(cpl_imagelist_get(cu, 0))
150 * cpl_image_get_size_y(
151 cpl_imagelist_get(cu, 0));
170 sinfo_new_c_bezier_interpolate_image(cpl_image *im, cpl_image *mask,
171 new_Lookup *look,
short rx,
short ry,
172 short rz,
int max_rad,
float ** slit_edges)
176 cpl_imagelist * sc_im, *drs_sc_mask;
180 short rx_loop, ry_loop, rz_loop;
188 float* pidata = NULL;
189 float* pmdata = NULL;
190 float* ptdata = NULL;
191 float* padata = NULL;
193 cpl_image* sc_img = NULL;
194 cpl_image* drs_img = NULL;
196 mlx = cpl_image_get_size_x(mask);
197 mly = cpl_image_get_size_y(mask);
198 ilx = cpl_image_get_size_x(im);
199 ily = cpl_image_get_size_y(im);
201 pmdata = cpl_image_get_data_float(mask);
202 pidata = cpl_image_get_data_float(im);
204 if (mlx != ilx || mly != ily) {
214 if (NULL == (sc_im = cpl_imagelist_new())) {
219 for (i = 0; i < szz; i++) {
220 sc_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
221 cpl_imagelist_set(sc_im, sc_img, i);
224 if (NULL == (drs_sc_mask = cpl_imagelist_new())) {
228 for (i = 0; i < szz; i++) {
229 drs_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
230 cpl_imagelist_set(drs_sc_mask, drs_img, i);
233 if (NULL == (tempMask = cpl_image_new(mlx, mly, CPL_TYPE_FLOAT))) {
235 "dead pixel mask\n");
238 ptdata = cpl_image_get_data_float(tempMask);
241 for (i = 0; i < mlx; i++) {
242 for (j = 0; j < mly; j++) {
243 if (pmdata[sinfo_im_xy(im, i, j)] == cubePT_BADPIXEL) {
247 pidata[sinfo_im_xy(im, i, j)] =
248 sinfo_new_c_bezier_correct_pixel(i, j, im, mask,
249 sc_im, drs_sc_mask, look,
250 rx_loop, ry_loop, rz_loop);
253 while (pidata[sinfo_im_xy(im, i, j)] == cubeNONEIGHBOR
254 && rx_loop < rx && ry_loop < ry && rz_loop < rz) {
261 pidata[sinfo_im_xy(im, i, j)] =
262 sinfo_new_c_bezier_correct_pixel(i, j, im,
263 mask, sc_im, drs_sc_mask,
264 look, rx_loop, ry_loop,
269 if (pidata[sinfo_im_xy(im, i, j)] == cubeNONEIGHBOR) {
270 pidata[sinfo_im_xy(im, i, j)] = ZERO;
274 if (pidata[sinfo_im_xy(im, i, j)] == ZERO) {
275 ptdata[sinfo_im_xy(tempMask, i, j)] = 0;
278 ptdata[sinfo_im_xy(tempMask, i, j)] = 1;
283 sinfo_msg(
"Replacing NaN\n");
284 auxImage = sinfo_interpol_source_image(im, tempMask, max_rad, slit_edges);
285 padata = cpl_image_get_data_float(auxImage);
286 for (i = 0; i < mlx; i++) {
287 for (j = 0; j < mly; j++) {
289 if (isnan(pidata[sinfo_im_xy(im,i,j)]))
293 pidata[sinfo_im_xy(im, i, j)] = padata[sinfo_im_xy(im, i, j)];
297 cpl_image_delete(auxImage);
298 cpl_imagelist_delete(sc_im);
299 cpl_imagelist_delete(drs_sc_mask);
301 sinfo_msg(
"bad pixels count: %d\n", count);
307 sinfo_new_c_bezier_find_bad(cpl_image *im, cpl_image *mask,
310 short ry,
short rz,
short lowerI,
short highI,
311 short lowerJ,
short highJ,
float factor)
315 cpl_imagelist * sc_im, *drs_sc_mask;
320 short rx_loop, ry_loop, rz_loop;
327 float* pidata = NULL;
330 cpl_image* sc_img = NULL;
331 cpl_image* drs_img = NULL;
333 mlx = cpl_image_get_size_x(mask);
334 mly = cpl_image_get_size_y(mask);
335 ilx = cpl_image_get_size_x(im);
336 ily = cpl_image_get_size_y(im);
339 pidata = cpl_image_get_data_float(im);
341 if (mlx != ilx || mly != ily) {
351 if (NULL == (sc_im = cpl_imagelist_new())) {
355 for (i = 0; i < szz; i++) {
356 sc_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
357 cpl_imagelist_set(sc_im, sc_img, i);
360 if (NULL == (drs_sc_mask = cpl_imagelist_new())) {
364 for (i = 0; i < szz; i++) {
365 drs_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
366 cpl_imagelist_set(drs_sc_mask, drs_img, i);
370 for (i = 0; i < mlx; i++) {
371 for (j = 0; j < mly; j++) {
372 if (i >= lowerI && i < highI && j >= lowerJ && j < highJ) {
377 newValue = sinfo_new_c_bezier_correct_pixel_2D(i, j, im, mask,
380 rx_loop, ry_loop, rz_loop, &med, &stdev,
384 while (newValue == ZERO && rx_loop < rx && ry_loop < ry
391 newValue = sinfo_new_c_bezier_correct_pixel_2D(i, j, im,
392 mask, sc_im, drs_sc_mask,
394 rx_loop, ry_loop, rz_loop, &med, &stdev,
400 old = pidata[sinfo_im_xy(im, i, j)];
401 if (newValue != old) {
402 pidata[sinfo_im_xy(im, i, j)] = newValue;
411 sinfo_msg(
"bad pixels count: %d\n", count);
413 cpl_imagelist_delete(sc_im);
414 cpl_imagelist_delete(drs_sc_mask);
419 sinfo_new_c_bezier_correct_pixel(
int ipos,
int jpos, cpl_image * im,
420 cpl_image * mask, cpl_imagelist * sc_im,
421 cpl_imagelist * drs_sc_mask, new_Lookup * look,
422 short rx,
short ry,
short rz)
424 short ic, jc, kc, ii, jj, kk, is, js, ks;
425 short i, j, k, indexJ, indexI, lx, ly, lz, szx, szy, szz;
427 cpl_image * X, *Y, *Z, *hX;
428 cpl_imagelist * id, *jd;
438 float* pXdata = NULL;
439 float* pYdata = NULL;
440 float* pZdata = NULL;
441 float* phXdata = NULL;
442 float* pidata = NULL;
443 float* pmdata = NULL;
444 float* piddata = NULL;
445 float* pjddata = NULL;
446 float* pscdata = NULL;
447 float* pdrsdata = NULL;
449 cpl_image* id_img = NULL;
450 cpl_image* jd_img = NULL;
451 cpl_image* sc_img = NULL;
452 cpl_image* drs_img = NULL;
471 pidata = cpl_image_get_data_float(im);
472 pmdata = cpl_image_get_data_float(mask);
474 phXdata = cpl_image_get_data_float(hX);
475 if (phXdata[sinfo_im_xy(hX, ipos, jpos)] < 1) {
480 pXdata = cpl_image_get_data_float(X);
481 pYdata = cpl_image_get_data_float(Y);
482 pZdata = cpl_image_get_data_float(Z);
484 ic = pXdata[sinfo_im_xy(X, ipos, jpos)];
485 jc = pYdata[sinfo_im_xy(Y, ipos, jpos)];
486 kc = pZdata[sinfo_im_xy(Z, ipos, jpos)];
490 "in Cube -> ic=%d, jc=%d, kc=%d\n",
491 ipos,jpos, ic, jc, kc );
505 sinfo_msg_debug(
"Start Point in Cube -> ii=%d,jj=%d,kk=%d\n", ii, jj, kk );
513 idlx = cpl_image_get_size_x(cpl_imagelist_get(
id, 0));
514 idly = cpl_image_get_size_y(cpl_imagelist_get(
id, 0));
515 idnp = cpl_imagelist_get_size(
id);
521 if ((ic + rx) >= idlx)
522 szx = szx - ((ic + rx) - (lx - 1));
524 if ((jc + ry) >= idly)
525 szy = szy - ((jc + ry) - (ly - 1));
527 if ((kc + rz) >= idnp)
528 szz = szz - ((kc + rz) - (lz - 1));
530 drslx = cpl_image_get_size_x(cpl_imagelist_get(drs_sc_mask, 0));
531 drsly = cpl_image_get_size_y(cpl_imagelist_get(drs_sc_mask, 0));
532 drsnp = cpl_imagelist_get_size(drs_sc_mask);
535 sinfo_msg_error(
"Size of subcube: szx=%d,szy=%d,szz=%d\n", szx, szy, szz );
538 drslx, drsly, drsnp);
540 for (i = 0; i < drslx; i++) {
541 for (j = 0; j < drsly; j++) {
542 for (k = 0; k < drsnp; k++) {
543 drs_img = cpl_imagelist_get(drs_sc_mask, k);
544 pdrsdata = cpl_image_get_data_float(drs_img);
545 pdrsdata[sinfo_cu_xy(drs_sc_mask, i, j)] = cubePT_NOINFO;
550 for (i = ii, is = 0; i < ii + szx; i++, is++) {
551 for (j = jj, js = 0; j < jj + szy; j++, js++) {
552 for (k = kk, ks = 0; k < kk + szz; k++, ks++) {
557 id_img = cpl_imagelist_get(
id, k);
558 jd_img = cpl_imagelist_get(jd, k);
559 piddata = cpl_image_get_data_float(id_img);
560 pjddata = cpl_image_get_data_float(jd_img);
562 drs_img = cpl_imagelist_get(drs_sc_mask, ks);
563 pdrsdata = cpl_image_get_data_float(drs_img);
564 sc_img = cpl_imagelist_get(sc_im, ks);
565 pscdata = cpl_image_get_data_float(sc_img);
567 indexI = sinfo_new_nint(piddata[sinfo_cu_xy(
id, i, j)]);
568 indexJ = sinfo_new_nint(pjddata[sinfo_cu_xy(jd, i, j)]);
569 if (indexJ <= -1 || indexJ >= 2048 || indexI == -1) {
570 pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] = cubePT_NOINFO;
573 pscdata[sinfo_cu_xy(sc_im, is, js)] = pidata[sinfo_im_xy(im,
575 pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] = pmdata[sinfo_im_xy(
576 mask, indexI, indexJ)];
592 drs_img = cpl_imagelist_get(drs_sc_mask, rz);
593 pdrsdata = cpl_image_get_data_float(drs_img);
594 pdrsdata[sinfo_cu_xy(drs_sc_mask, rx, ry)] = cubePT_FIND;
595 return (sinfo_new_c_bezier_interpol(sc_im, drs_sc_mask));
599 sinfo_new_c_bezier_correct_pixel_2D(
int ipos,
int jpos, cpl_image * im,
600 cpl_image * mask, cpl_imagelist * sc_im,
601 cpl_imagelist * drs_sc_mask,
604 short ry,
short rz,
double *med,
605 double *stdev,
float factor)
607 short ic, jc, kc, ii, jj, kk, is, js, ks;
608 short i, j, k, indexJ, indexI, lx, ly, lz, szx, szy, szz;
625 cpl_image* drs_img = NULL;
626 cpl_image* sc_img = NULL;
632 "in Cube -> ic=%d, jc=%d, kc=%d", ipos, jpos, ic, jc, kc);
644 sinfo_msg_debug(
"Start Point in Cube -> ii=%d,jj=%d,kk=%d", ii, jj, kk);
646 ilx = cpl_image_get_size_x(im);
647 ily = cpl_image_get_size_y(im);
656 if ((ic + rx) >= ilx)
657 szx = szx - ((ic + rx) - (lx - 1));
659 if ((jc + ry) >= ily)
660 szy = szy - ((jc + ry) - (ly - 1));
662 if ((kc + rz) >= ily)
663 szz = szz - ((kc + rz) - (lz - 1));
666 drslx=cpl_image_get_size_x(cpl_imagelist_get(drs_sc_mask,0));
667 drsly=cpl_image_get_size_y(cpl_imagelist_get(drs_sc_mask,0));
668 drsnp=cpl_imagelist_get_size(drs_sc_mask);
669 sinfo_msg_debug(
"Size of subcube : szx=%d,szy=%d,szz=%d", szx, szy, szz );
672 drslx, drsly, drsnp);
674 for (i = 0; i < drslx; i++) {
675 for (j = 0; j < drsly; j++) {
676 for (k = 0; k < drsnp; k++) {
677 drs_img = cpl_imagelist_get(drs_sc_mask, k);
678 pdrsdata = cpl_image_get_data_float(drs_img);
679 pdrsdata[sinfo_cu_xy(drs_sc_mask, i, j)] = cubePT_NOINFO;
685 memset(sumarr, 0x00,
sizeof(sumarr));
686 pidata = cpl_image_get_data(im);
687 pmdata = cpl_image_get_data(mask);
689 for (i = ii, is = 0; i < ii + szx; i++, is++) {
690 for (j = jj, js = 0; j < jj + szy; j++, js++) {
691 for (k = kk, ks = 0; k < kk + szz; k++, ks++) {
698 if (isnan(pidata[sinfo_im_xy(mask,indexI,indexJ)]))
699 pmdata[sinfo_im_xy(mask, indexI, indexJ)] = 0;
701 if (pmdata[sinfo_im_xy(mask, indexI, indexJ)] == 1
702 && (indexI != ipos || indexJ != jpos)) {
704 sum = sum + pidata[sinfo_im_xy(im, indexI, indexJ)];
707 sc_img = cpl_imagelist_get(sc_im, ks);
708 pscdata[sinfo_cu_xy(sc_im, is, js)] = pidata[sinfo_im_xy(im,
710 drs_img = cpl_imagelist_get(drs_sc_mask, ks);
711 pdrsdata = cpl_image_get_data_float(drs_img);
712 pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] = pmdata[sinfo_im_xy(
713 mask, indexI, indexJ)];
716 "Sub is=%d, js=%d, ks=%d ; "
717 " Plane I=%d,J=%d ; mask %f ; im %f",
718 i, j, k, is, js, ks, indexI, indexJ,
719 pmdata[sinfo_im_xy(mask,indexI,indexJ)],
720 pidata[sinfo_im_xy(im,indexI,indexJ)]);
728 drs_img = cpl_imagelist_get(drs_sc_mask, rz);
729 pdrsdata = cpl_image_get_data_float(drs_img);
730 pdrsdata[sinfo_cu_xy(drs_sc_mask, rx, ry)] = cubePT_FIND;
733 *med = sum / counter;
735 return (pidata[sinfo_im_xy(im, ipos, jpos)]);
742 for (i = ii, is = 0; i < ii + szx; i++, is++) {
743 for (j = jj, js = 0; j < jj + szy; j++, js++) {
744 for (k = kk, ks = 0; k < kk + szz; k++, ks++) {
745 drs_img = cpl_imagelist_get(drs_sc_mask, ks);
746 pdrsdata = cpl_image_get_data_float(drs_img);
749 if (pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] == 1
750 && (indexI != ipos || indexJ != jpos)) {
751 sc_img = cpl_imagelist_get(sc_im, ks);
752 pscdata = cpl_image_get_data_float(sc_img);
756 + ((pscdata[sinfo_cu_xy(
760 * (pscdata[sinfo_cu_xy(
774 sum = sum / (counter - 1);
777 if ((fabs(pidata[sinfo_im_xy(im, ipos, jpos)] - *med) > factor * *stdev)
778 || isnan(pidata[sinfo_im_xy(im,ipos,jpos)])) {
784 return (sinfo_new_c_bezier_interpol(sc_im, drs_sc_mask));
786 return (pidata[sinfo_im_xy(im, ipos, jpos)]);
790 sinfo_new_c_bezier_interpol(cpl_imagelist * im, cpl_imagelist * action)
793 unsigned short i, j, k;
794 new_XYZW indata[1000];
797 float step, cumstep, distance, selected_distance;
798 new_Dim *point = NULL;
803 float* padata = NULL;
804 float* pidata = NULL;
805 cpl_image* i_img = NULL;
806 cpl_image* a_img = NULL;
809 memset(indata, 0x00, 1000 *
sizeof(new_XYZW));
810 ilx = cpl_image_get_size_x(cpl_imagelist_get(im, 0));
811 ily = cpl_image_get_size_y(cpl_imagelist_get(im, 0));
812 inp = cpl_imagelist_get_size(im);
815 for (i = 0; i < ilx; i++) {
816 for (j = 0; j < ily; j++) {
821 for (k = 0; k < inp; k++) {
822 a_img = cpl_imagelist_get(action, k);
823 padata = cpl_image_get_data_float(a_img);
824 i_img = cpl_imagelist_get(action, k);
825 pidata = cpl_image_get_data_float(i_img);
826 if (padata[sinfo_cu_xy(action, i, j)] == cubePT_USE) {
834 indata[pos].w = pidata[sinfo_cu_xy(im, i, j)];
838 if (padata[sinfo_cu_xy(action, i, j)] == cubePT_FIND) {
845 padata[sinfo_cu_xy(action,i,j)]);
851 i,j,k,pidata[sinfo_im_xy(im,i,j)],
864 "to use in iterpolation");
869 return (cubeNONEIGHBOR);
875 selected_distance = 1000;
876 munk = pow(1.0 - cumstep, (
double) pos - 1);
877 for (i = 0; (i < 100) && (munk != 0.0); i++) {
878 memset(&res, 0x00,
sizeof(new_XYZW));
879 sinfo_new_bezier(indata, pos - 1, cumstep, munk, &res);
881 pow(((*point).x - res.x), 2)
882 + pow(((*point).y - res.y), 2)
883 + pow(((*point).z - res.z), 2));
886 if (distance < selected_distance) {
887 selected_distance = distance;
893 cumstep = cumstep + step;
894 munk = pow(1.0 - cumstep, (
double) pos - 1);
900 selected.x,selected.y,selected.z,
901 selected.w,selected_distance);
903 i_img = cpl_imagelist_get(im, (*point).z);
904 pidata = cpl_image_get_data_float(i_img);
905 pidata[sinfo_cu_xy(im, (*point).x, (*point).y)] = selected.w;
911 sinfo_new_bezier(new_XYZW *p,
int n,
double mu,
double munk, new_XYZW *res)
917 for (k = 0; k <= n; k++) {
925 blend *= (double) nn;
928 blend /= (double) kn;
932 blend /= (double) nkn;
936 res->x += p[k].x * blend;
937 res->y += p[k].y * blend;
938 res->z += p[k].z * blend;
939 res->w += p[k].w * blend;
945 sinfo_new_c_create_XYZ(new_Lookup *l)
947 cpl_image *imX, *imY, *imZ, *imcX;
948 short i, j, k, indexI, indexJ, x, y, z;
953 float* piddata = NULL;
954 float* pjddata = NULL;
955 float* pXdata = NULL;
956 float* pYdata = NULL;
957 float* pZdata = NULL;
958 float* phXdata = NULL;
960 cpl_image* i_img = NULL;
961 cpl_image* j_img = NULL;
963 idlx = cpl_image_get_size_x(cpl_imagelist_get(l->id, 0));
964 idly = cpl_image_get_size_y(cpl_imagelist_get(l->id, 0));
965 idnp = cpl_imagelist_get_size(l->id);
969 if (NULL == (imX = cpl_image_new(size, size, CPL_TYPE_FLOAT))) {
973 if (NULL == (imY = cpl_image_new(size, size, CPL_TYPE_FLOAT))) {
977 if (NULL == (imZ = cpl_image_new(size, size, CPL_TYPE_FLOAT))) {
981 if (NULL == (imcX = cpl_image_new(size, size, CPL_TYPE_FLOAT))) {
992 for (i = 0; i < idlx; i++) {
993 for (j = 0; j < idly; j++) {
994 for (k = 0; k < idnp; k++) {
995 i_img = cpl_imagelist_get(l->id, k);
996 piddata = cpl_image_get_data_float(i_img);
997 piddata[sinfo_cu_xy(l->id, i, j)] = (float) sinfo_new_nint(
998 piddata[sinfo_cu_xy(l->id, i, j)]);
1004 for (i = 0; i < idlx; i++) {
1005 for (j = 0; j < idly; j++) {
1006 for (k = 0; k < idnp; k++) {
1007 j_img = cpl_imagelist_get(l->jd, k);
1008 pjddata = cpl_image_get_data_float(j_img);
1009 pjddata[sinfo_cu_xy(l->jd, i, j)] = (float) sinfo_new_nint(
1010 pjddata[sinfo_cu_xy(l->jd, i, j)]);
1016 for (i = 0; i < cpl_image_get_size_x(l->X); i++) {
1017 for (j = 0; j < cpl_image_get_size_y(l->X); j++) {
1018 pXdata = cpl_image_get_data_float(l->X);
1019 pYdata = cpl_image_get_data_float(l->Y);
1020 pZdata = cpl_image_get_data_float(l->Z);
1022 pXdata[sinfo_im_xy(l->X, i, j)] = ZERO;
1023 pYdata[sinfo_im_xy(l->Y, i, j)] = ZERO;
1024 pZdata[sinfo_im_xy(l->Z, i, j)] = ZERO;
1029 for( x = idlx - 1;x>=0;x--)
1031 for( y = idly - 1;y>=0;y--)
1033 for( z = idnp - 1;z>=0;z--)
1036 for (x = 0; x < idlx; x++) {
1037 for (y = 0; y < idly; y++) {
1038 for (z = 0; z < idnp; z++)
1041 i_img = cpl_imagelist_get(l->id, z);
1042 piddata = cpl_image_get_data_float(i_img);
1043 j_img = cpl_imagelist_get(l->jd, z);
1044 pjddata = cpl_image_get_data_float(j_img);
1045 indexI = piddata[sinfo_cu_xy(l->id, x, y)];
1046 indexJ = pjddata[sinfo_cu_xy(l->jd, x, y)];
1047 if (indexI > 0.0 && indexI < size && indexJ > 0.0
1051 pXdata = cpl_image_get_data_float(l->X);
1052 pYdata = cpl_image_get_data_float(l->Y);
1053 pZdata = cpl_image_get_data_float(l->Z);
1054 phXdata = cpl_image_get_data_float(l->hX);
1056 pXdata[sinfo_im_xy(l->X, indexI, indexJ)] = x;
1057 phXdata[sinfo_im_xy(l->hX, indexI, indexJ)] =
1058 phXdata[sinfo_im_xy(l->hX, indexI, indexJ)]
1061 pYdata[sinfo_im_xy(l->Y, indexI, indexJ)] = y;
1065 pZdata[sinfo_im_xy(l->Z, indexI, indexJ)] = z;
1073 sinfo_msg(
"Filled X Y Z , cX cY cZ 2D frames\n");
1083 sinfo_new_lookup(
void)
1086 l = (new_Lookup*) cpl_calloc(1,
sizeof(new_Lookup));
1096 sinfo_new_destroy_lookup(new_Lookup *l)
1109 sinfo_new_change_mask(cpl_image * mask, cpl_image * im)
1116 float* pidata = NULL;
1117 float* pmdata = NULL;
1119 if (mask == NULL || im == NULL )
1121 ilx = cpl_image_get_size_x(im);
1122 ily = cpl_image_get_size_y(im);
1123 pidata = cpl_image_get_data_float(im);
1127 pmdata = cpl_image_get_data_float(mask);
1129 for (i = 0; i < (int) ilx * ily; i++) {
1130 if (isnan(pidata[i])) {
1154 sinfo_new_c_bezier_find_cosmic(cpl_image *im, cpl_image *mask, new_Lookup *look,
1155 short rx,
short ry,
short rz,
short lowerI,
1156 short highI,
short lowerJ,
short highJ,
1161 cpl_imagelist * sc_im, *drs_sc_mask;
1162 short szx, szy, szz;
1163 float newValue, old;
1166 short rx_loop, ry_loop, rz_loop;
1168 cpl_image* o_img = NULL;
1170 float* pidata = NULL;
1178 mlx = cpl_image_get_size_x(mask);
1179 mly = cpl_image_get_size_y(mask);
1182 ilx = cpl_image_get_size_x(im);
1183 ily = cpl_image_get_size_y(im);
1184 pidata = cpl_image_get_data_float(im);
1186 if (mlx != ilx || mly != ily) {
1196 if (NULL == (sc_im = cpl_imagelist_new())) {
1200 for (i = 0; i < szz; i++) {
1201 o_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
1202 cpl_imagelist_set(sc_im, o_img, i);
1205 if (NULL == (drs_sc_mask = cpl_imagelist_new())) {
1210 for (i = 0; i < szz; i++) {
1211 o_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
1212 cpl_imagelist_set(drs_sc_mask, o_img, i);
1216 for (i = 0; i < mlx; i++) {
1217 for (j = 0; j < mly; j++) {
1218 if (i >= lowerI && i < highI && j >= lowerJ && j < highJ) {
1223 newValue = sinfo_new_c_bezier_correct_cosmic(i, j, im, mask,
1224 sc_im, drs_sc_mask, look, rx_loop, ry_loop,
1225 rz_loop, &med, &stdev, factor);
1228 while (newValue == cubeNONEIGHBOR && rx_loop < rx
1229 && ry_loop < ry && rz_loop < rz) {
1235 newValue = sinfo_new_c_bezier_correct_cosmic(i, j, im, mask,
1236 sc_im, drs_sc_mask, look, rx_loop, ry_loop,
1237 rz_loop, &med, &stdev, factor);
1240 if (isnan(newValue) || newValue == cubeNONEIGHBOR)
1244 old = pidata[sinfo_im_xy(im, i, j)];
1245 if (newValue != old) {
1246 pidata[sinfo_im_xy(im, i, j)] = newValue;
1257 cpl_imagelist_delete(sc_im);
1258 cpl_imagelist_delete(drs_sc_mask);
1280 sinfo_new_c_bezier_correct_cosmic(
int ipos,
int jpos, cpl_image * im,
1281 cpl_image * mask, cpl_imagelist * sc_im,
1282 cpl_imagelist * drs_sc_mask,
1283 new_Lookup * look,
short rx,
short ry,
1284 short rz,
double *med,
double *stdev,
1287 short ic, jc, kc, ii, jj, kk, is, js, ks;
1288 short i, j, k, indexJ, indexI, lx, ly, lz, szx, szy, szz;
1290 cpl_image * X, *Y, *Z, *hX;
1291 cpl_imagelist * id, *jd;
1294 float* phXdata = NULL;
1295 float* pXdata = NULL;
1296 float* pYdata = NULL;
1297 float* pZdata = NULL;
1299 float* pimdata = NULL;
1300 float* pscdata = NULL;
1301 float* pdrsdata = NULL;
1302 float* piddata = NULL;
1303 float* pjddata = NULL;
1304 float* pmaskdata = NULL;
1321 phXdata = cpl_image_get_data_float(hX);
1328 if (phXdata[sinfo_im_xy(hX, ipos, jpos)] < 1) {
1334 pXdata = cpl_image_get_data_float(X);
1335 pYdata = cpl_image_get_data_float(Y);
1336 pZdata = cpl_image_get_data_float(Z);
1338 ic = pXdata[sinfo_im_xy(X, ipos, jpos)];
1339 jc = pYdata[sinfo_im_xy(Y, ipos, jpos)];
1340 kc = pZdata[sinfo_im_xy(Z, ipos, jpos)];
1344 "in Cube -> ic=%d, jc=%d, kc=%d", ipos,jpos, ic, jc, kc );
1358 sinfo_msg_debug(
"Start Point in Cube -> ii=%d,jj=%d,kk=%d", ii, jj, kk );
1366 idlx = cpl_image_get_size_x(cpl_imagelist_get(
id, 0));
1367 idly = cpl_image_get_size_y(cpl_imagelist_get(
id, 0));
1368 idnp = cpl_imagelist_get_size(
id);
1373 if ((ic + rx) >= idlx)
1374 szx = szx - ((ic + rx) - (lx - 1));
1376 if ((jc + ry) >= idly)
1377 szy = szy - ((jc + ry) - (ly - 1));
1379 if ((kc + rz) >= idnp)
1380 szz = szz - ((kc + rz) - (lz - 1));
1383 sinfo_msg_error(
"Size of subcube : szx=%d,szy=%d,szz=%d\n", szx, szy, szz );
1385 drsnp=cpl_imagelist_get_size(drs_sc_mask);
1386 drslx=cpl_image_get_size_x(cpl_imagelist_get(drs_sc_mask,0));
1387 drsly=cpl_image_get_size_y(cpl_imagelist_get(drs_sc_mask,0));
1390 drslx, drsly, drsnp);
1392 for (i = 0; i < drslx; i++) {
1393 for (j = 0; j < drsly; j++) {
1394 for (k = 0; k < drsnp; k++) {
1395 pdrsdata = cpl_image_get_data_float(
1396 cpl_imagelist_get(drs_sc_mask, k));
1397 pdrsdata[sinfo_cu_xy(drs_sc_mask, i, j)] = cubePT_NOINFO;
1401 pimdata = cpl_image_get_data_float(im);
1402 pmaskdata = cpl_image_get_data_float(mask);
1403 for (i = ii, is = 0; i < ii + szx; i++, is++) {
1404 for (j = jj, js = 0; j < jj + szy; j++, js++) {
1405 for (k = kk, ks = 0; k < kk + szz; k++, ks++) {
1410 piddata = cpl_image_get_data_float(cpl_imagelist_get(
id, k));
1411 pjddata = cpl_image_get_data_float(cpl_imagelist_get(
id, k));
1412 pdrsdata = cpl_image_get_data_float(
1413 cpl_imagelist_get(drs_sc_mask, ks));
1414 pscdata = cpl_image_get_data_float(
1415 cpl_imagelist_get(sc_im, ks));
1417 indexI = sinfo_new_nint(piddata[sinfo_cu_xy(
id, i, j)]);
1418 indexJ = sinfo_new_nint(pjddata[sinfo_cu_xy(jd, i, j)]);
1419 if (indexJ <= -1 || indexJ >= 2048 || indexI == -1) {
1420 pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] = cubePT_NOINFO;
1423 pscdata[sinfo_cu_xy(sc_im, is, js)] = pimdata[sinfo_im_xy(im,
1425 pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] =
1426 pmaskdata[sinfo_im_xy(mask, indexI, indexJ)];
1429 " Sub is=%d, js=%d, ks=%d ; "
1430 " Plane I=%d,J=%d ; mask %f ; im %f\n",
1431 i, j, k, is, js, ks, indexI, indexJ,
1432 pmaskdata[sinfo_im_xy(mask,indexI,indexJ)],
1433 pimdata[sinfo_im_xy(im,indexI,indexJ)]);
1442 for (i = 0; i < szx; i++) {
1443 for (k = 0; k < szz; k++) {
1444 pdrsdata = cpl_image_get_data_float(
1445 cpl_imagelist_get(drs_sc_mask, k));
1446 pdrsdata[sinfo_cu_xy(drs_sc_mask, i, ry)] = cubePT_NOINFO;
1453 for (i = 0; i < szx; i++) {
1454 for (j = 0; j < szy; j++) {
1455 for (k = 0; k < szz; k++) {
1456 pdrsdata = cpl_image_get_data_float(
1457 cpl_imagelist_get(drs_sc_mask, k));
1458 pscdata = cpl_image_get_data_float(cpl_imagelist_get(sc_im, k));
1459 if (pscdata[sinfo_cu_xy(sc_im, i, j)] != ZERO
1460 && pdrsdata[sinfo_cu_xy(drs_sc_mask, i, j)]
1462 sum = sum + pscdata[sinfo_cu_xy(sc_im, i, j)];
1469 *med = sum / counter;
1473 for (i = 0; i < szx; i++) {
1474 for (j = 0; j < szy; j++) {
1475 for (k = 0; k < szz; k++) {
1476 pscdata = cpl_image_get_data_float(cpl_imagelist_get(sc_im, k));
1477 pdrsdata = cpl_image_get_data_float(
1478 cpl_imagelist_get(drs_sc_mask, k));
1479 if (pscdata[sinfo_cu_xy(sc_im, i, j)] != ZERO
1480 && pdrsdata[sinfo_cu_xy(drs_sc_mask, i, j)]
1482 sum = sum + (pscdata[sinfo_cu_xy(
1485 * (pscdata[sinfo_cu_xy(
1496 *stdev = sqrt(sum / (counter - 1));
1498 if ((fabs(pimdata[sinfo_im_xy(im, ipos, jpos)] - *med) > factor * *stdev)
1499 || isnan(pimdata[sinfo_im_xy(im,ipos,jpos)])) {
1500 pdrsdata = cpl_image_get_data_float(cpl_imagelist_get(drs_sc_mask, rz));
1501 pdrsdata[sinfo_cu_xy(drs_sc_mask, rx, ry)] = cubePT_FIND;
1502 return (sinfo_new_c_bezier_interpol(sc_im, drs_sc_mask));
1505 return (pimdata[sinfo_im_xy(im, ipos, jpos)]);