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;
194 mlx = cpl_image_get_size_x(mask);
195 mly = cpl_image_get_size_y(mask);
196 ilx = cpl_image_get_size_x(im);
197 ily = cpl_image_get_size_y(im);
199 pmdata = cpl_image_get_data_float(mask);
200 pidata = cpl_image_get_data_float(im);
202 if (mlx != ilx || mly != ily) {
212 if (NULL == (sc_im = cpl_imagelist_new())) {
217 for (i = 0; i < szz; i++) {
218 cpl_image* sc_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
219 cpl_imagelist_set(sc_im, sc_img, i);
222 if (NULL == (drs_sc_mask = cpl_imagelist_new())) {
226 for (i = 0; i < szz; i++) {
227 cpl_image* drs_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
228 cpl_imagelist_set(drs_sc_mask, drs_img, i);
231 if (NULL == (tempMask = cpl_image_new(mlx, mly, CPL_TYPE_FLOAT))) {
233 "dead pixel mask\n");
236 ptdata = cpl_image_get_data_float(tempMask);
239 for (i = 0; i < mlx; i++) {
240 for (j = 0; j < mly; j++) {
241 if (pmdata[sinfo_im_xy(im, i, j)] == cubePT_BADPIXEL) {
245 pidata[sinfo_im_xy(im, i, j)] =
246 sinfo_new_c_bezier_correct_pixel(i, j, im, mask,
247 sc_im, drs_sc_mask, look,
248 rx_loop, ry_loop, rz_loop);
251 while (pidata[sinfo_im_xy(im, i, j)] == cubeNONEIGHBOR
252 && rx_loop < rx && ry_loop < ry && rz_loop < rz) {
259 pidata[sinfo_im_xy(im, i, j)] =
260 sinfo_new_c_bezier_correct_pixel(i, j, im,
261 mask, sc_im, drs_sc_mask,
262 look, rx_loop, ry_loop,
267 if (pidata[sinfo_im_xy(im, i, j)] == cubeNONEIGHBOR) {
268 pidata[sinfo_im_xy(im, i, j)] = ZERO;
272 if (pidata[sinfo_im_xy(im, i, j)] == ZERO) {
273 ptdata[sinfo_im_xy(tempMask, i, j)] = 0;
276 ptdata[sinfo_im_xy(tempMask, i, j)] = 1;
281 sinfo_msg(
"Replacing NaN\n");
282 auxImage = sinfo_interpol_source_image(im, tempMask, max_rad, slit_edges);
283 padata = cpl_image_get_data_float(auxImage);
284 for (i = 0; i < mlx; i++) {
285 for (j = 0; j < mly; j++) {
287 if (isnan(pidata[sinfo_im_xy(im,i,j)]))
291 pidata[sinfo_im_xy(im, i, j)] = padata[sinfo_im_xy(im, i, j)];
295 cpl_image_delete(auxImage);
296 cpl_imagelist_delete(sc_im);
297 cpl_imagelist_delete(drs_sc_mask);
299 sinfo_msg(
"bad pixels count: %d\n", count);
305 sinfo_new_c_bezier_find_bad(cpl_image *im, cpl_image *mask,
308 short ry,
short rz,
short lowerI,
short highI,
309 short lowerJ,
short highJ,
float factor)
313 cpl_imagelist * sc_im, *drs_sc_mask;
318 short rx_loop, ry_loop, rz_loop;
325 float* pidata = NULL;
329 mlx = cpl_image_get_size_x(mask);
330 mly = cpl_image_get_size_y(mask);
331 ilx = cpl_image_get_size_x(im);
332 ily = cpl_image_get_size_y(im);
335 pidata = cpl_image_get_data_float(im);
337 if (mlx != ilx || mly != ily) {
347 if (NULL == (sc_im = cpl_imagelist_new())) {
351 for (i = 0; i < szz; i++) {
352 cpl_image* sc_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
353 cpl_imagelist_set(sc_im, sc_img, i);
356 if (NULL == (drs_sc_mask = cpl_imagelist_new())) {
360 for (i = 0; i < szz; i++) {
361 cpl_image* drs_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
362 cpl_imagelist_set(drs_sc_mask, drs_img, i);
366 for (i = 0; i < mlx; i++) {
367 for (j = 0; j < mly; j++) {
368 if (i >= lowerI && i < highI && j >= lowerJ && j < highJ) {
373 newValue = sinfo_new_c_bezier_correct_pixel_2D(i, j, im, mask,
376 rx_loop, ry_loop, rz_loop, &med, &stdev,
380 while (newValue == ZERO && rx_loop < rx && ry_loop < ry
387 newValue = sinfo_new_c_bezier_correct_pixel_2D(i, j, im,
388 mask, sc_im, drs_sc_mask,
390 rx_loop, ry_loop, rz_loop, &med, &stdev,
396 old = pidata[sinfo_im_xy(im, i, j)];
397 if (newValue != old) {
398 pidata[sinfo_im_xy(im, i, j)] = newValue;
407 sinfo_msg(
"bad pixels count: %d\n", count);
409 cpl_imagelist_delete(sc_im);
410 cpl_imagelist_delete(drs_sc_mask);
415 sinfo_new_c_bezier_correct_pixel(
int ipos,
int jpos, cpl_image * im,
416 cpl_image * mask, cpl_imagelist * sc_im,
417 cpl_imagelist * drs_sc_mask, new_Lookup * look,
418 short rx,
short ry,
short rz)
420 short ic, jc, kc, ii, jj, kk, is, js, ks;
421 short i, j, k, indexJ, indexI, lx, ly, lz, szx, szy, szz;
423 cpl_image * X, *Y, *Z, *hX;
424 cpl_imagelist * id, *jd;
434 float* pXdata = NULL;
435 float* pYdata = NULL;
436 float* pZdata = NULL;
437 float* phXdata = NULL;
438 float* pidata = NULL;
439 float* pmdata = NULL;
440 float* piddata = NULL;
441 float* pjddata = NULL;
442 float* pscdata = NULL;
443 float* pdrsdata = NULL;
445 cpl_image* id_img = NULL;
446 cpl_image* jd_img = NULL;
447 cpl_image* sc_img = NULL;
448 cpl_image* drs_img = NULL;
467 pidata = cpl_image_get_data_float(im);
468 pmdata = cpl_image_get_data_float(mask);
470 phXdata = cpl_image_get_data_float(hX);
471 if (phXdata[sinfo_im_xy(hX, ipos, jpos)] < 1) {
476 pXdata = cpl_image_get_data_float(X);
477 pYdata = cpl_image_get_data_float(Y);
478 pZdata = cpl_image_get_data_float(Z);
480 ic = pXdata[sinfo_im_xy(X, ipos, jpos)];
481 jc = pYdata[sinfo_im_xy(Y, ipos, jpos)];
482 kc = pZdata[sinfo_im_xy(Z, ipos, jpos)];
486 "in Cube -> ic=%d, jc=%d, kc=%d\n",
487 ipos,jpos, ic, jc, kc );
501 sinfo_msg_debug(
"Start Point in Cube -> ii=%d,jj=%d,kk=%d\n", ii, jj, kk );
509 idlx = cpl_image_get_size_x(cpl_imagelist_get(
id, 0));
510 idly = cpl_image_get_size_y(cpl_imagelist_get(
id, 0));
511 idnp = cpl_imagelist_get_size(
id);
517 if ((ic + rx) >= idlx)
518 szx = szx - ((ic + rx) - (lx - 1));
520 if ((jc + ry) >= idly)
521 szy = szy - ((jc + ry) - (ly - 1));
523 if ((kc + rz) >= idnp)
524 szz = szz - ((kc + rz) - (lz - 1));
526 drslx = cpl_image_get_size_x(cpl_imagelist_get(drs_sc_mask, 0));
527 drsly = cpl_image_get_size_y(cpl_imagelist_get(drs_sc_mask, 0));
528 drsnp = cpl_imagelist_get_size(drs_sc_mask);
531 sinfo_msg_error(
"Size of subcube: szx=%d,szy=%d,szz=%d\n", szx, szy, szz );
534 drslx, drsly, drsnp);
536 for (i = 0; i < drslx; i++) {
537 for (j = 0; j < drsly; j++) {
538 for (k = 0; k < drsnp; k++) {
539 drs_img = cpl_imagelist_get(drs_sc_mask, k);
540 pdrsdata = cpl_image_get_data_float(drs_img);
541 pdrsdata[sinfo_cu_xy(drs_sc_mask, i, j)] = cubePT_NOINFO;
546 for (i = ii, is = 0; i < ii + szx; i++, is++) {
547 for (j = jj, js = 0; j < jj + szy; j++, js++) {
548 for (k = kk, ks = 0; k < kk + szz; k++, ks++) {
553 id_img = cpl_imagelist_get(
id, k);
554 jd_img = cpl_imagelist_get(jd, k);
555 piddata = cpl_image_get_data_float(id_img);
556 pjddata = cpl_image_get_data_float(jd_img);
558 drs_img = cpl_imagelist_get(drs_sc_mask, ks);
559 pdrsdata = cpl_image_get_data_float(drs_img);
560 sc_img = cpl_imagelist_get(sc_im, ks);
561 pscdata = cpl_image_get_data_float(sc_img);
563 indexI = sinfo_new_nint(piddata[sinfo_cu_xy(
id, i, j)]);
564 indexJ = sinfo_new_nint(pjddata[sinfo_cu_xy(jd, i, j)]);
565 if (indexJ <= -1 || indexJ >= 2048 || indexI == -1) {
566 pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] = cubePT_NOINFO;
569 pscdata[sinfo_cu_xy(sc_im, is, js)] = pidata[sinfo_im_xy(im,
571 pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] = pmdata[sinfo_im_xy(
572 mask, indexI, indexJ)];
588 drs_img = cpl_imagelist_get(drs_sc_mask, rz);
589 pdrsdata = cpl_image_get_data_float(drs_img);
590 pdrsdata[sinfo_cu_xy(drs_sc_mask, rx, ry)] = cubePT_FIND;
591 return (sinfo_new_c_bezier_interpol(sc_im, drs_sc_mask));
595 sinfo_new_c_bezier_correct_pixel_2D(
int ipos,
int jpos, cpl_image * im,
596 cpl_image * mask, cpl_imagelist * sc_im,
597 cpl_imagelist * drs_sc_mask,
600 short ry,
short rz,
double *med,
601 double *stdev,
float factor)
603 short ic, jc, kc, ii, jj, kk, is, js, ks;
604 short i, j, k, indexJ, indexI, lx, ly, lz, szx, szy, szz;
621 cpl_image* drs_img = NULL;
622 cpl_image* sc_img = NULL;
628 "in Cube -> ic=%d, jc=%d, kc=%d", ipos, jpos, ic, jc, kc);
640 sinfo_msg_debug(
"Start Point in Cube -> ii=%d,jj=%d,kk=%d", ii, jj, kk);
642 ilx = cpl_image_get_size_x(im);
643 ily = cpl_image_get_size_y(im);
652 if ((ic + rx) >= ilx)
653 szx = szx - ((ic + rx) - (lx - 1));
655 if ((jc + ry) >= ily)
656 szy = szy - ((jc + ry) - (ly - 1));
658 if ((kc + rz) >= ily)
659 szz = szz - ((kc + rz) - (lz - 1));
662 drslx=cpl_image_get_size_x(cpl_imagelist_get(drs_sc_mask,0));
663 drsly=cpl_image_get_size_y(cpl_imagelist_get(drs_sc_mask,0));
664 drsnp=cpl_imagelist_get_size(drs_sc_mask);
665 sinfo_msg_debug(
"Size of subcube : szx=%d,szy=%d,szz=%d", szx, szy, szz );
668 drslx, drsly, drsnp);
670 for (i = 0; i < drslx; i++) {
671 for (j = 0; j < drsly; j++) {
672 for (k = 0; k < drsnp; k++) {
673 drs_img = cpl_imagelist_get(drs_sc_mask, k);
674 pdrsdata = cpl_image_get_data_float(drs_img);
675 pdrsdata[sinfo_cu_xy(drs_sc_mask, i, j)] = cubePT_NOINFO;
681 memset(sumarr, 0x00,
sizeof(sumarr));
682 pidata = cpl_image_get_data(im);
683 pmdata = cpl_image_get_data(mask);
685 for (i = ii, is = 0; i < ii + szx; i++, is++) {
686 for (j = jj, js = 0; j < jj + szy; j++, js++) {
687 for (k = kk, ks = 0; k < kk + szz; k++, ks++) {
694 if (isnan(pidata[sinfo_im_xy(mask,indexI,indexJ)]))
695 pmdata[sinfo_im_xy(mask, indexI, indexJ)] = 0;
697 if (pmdata[sinfo_im_xy(mask, indexI, indexJ)] == 1
698 && (indexI != ipos || indexJ != jpos)) {
700 sum = sum + pidata[sinfo_im_xy(im, indexI, indexJ)];
703 sc_img = cpl_imagelist_get(sc_im, ks);
704 pscdata = cpl_image_get_data_float(sc_img);
705 pscdata[sinfo_cu_xy(sc_im, is, js)] = pidata[sinfo_im_xy(im,
707 drs_img = cpl_imagelist_get(drs_sc_mask, ks);
708 pdrsdata = cpl_image_get_data_float(drs_img);
709 pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] = pmdata[sinfo_im_xy(
710 mask, indexI, indexJ)];
713 "Sub is=%d, js=%d, ks=%d ; "
714 " Plane I=%d,J=%d ; mask %f ; im %f",
715 i, j, k, is, js, ks, indexI, indexJ,
716 pmdata[sinfo_im_xy(mask,indexI,indexJ)],
717 pidata[sinfo_im_xy(im,indexI,indexJ)]);
725 drs_img = cpl_imagelist_get(drs_sc_mask, rz);
726 pdrsdata = cpl_image_get_data_float(drs_img);
727 pdrsdata[sinfo_cu_xy(drs_sc_mask, rx, ry)] = cubePT_FIND;
730 *med = sum / counter;
732 return (pidata[sinfo_im_xy(im, ipos, jpos)]);
739 for (i = ii, is = 0; i < ii + szx; i++, is++) {
740 for (j = jj, js = 0; j < jj + szy; j++, js++) {
741 for (k = kk, ks = 0; k < kk + szz; k++, ks++) {
742 drs_img = cpl_imagelist_get(drs_sc_mask, ks);
743 pdrsdata = cpl_image_get_data_float(drs_img);
746 if (pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] == 1
747 && (indexI != ipos || indexJ != jpos)) {
748 sc_img = cpl_imagelist_get(sc_im, ks);
749 pscdata = cpl_image_get_data_float(sc_img);
753 + ((pscdata[sinfo_cu_xy(
757 * (pscdata[sinfo_cu_xy(
771 sum = sum / (counter - 1);
774 if ((fabs(pidata[sinfo_im_xy(im, ipos, jpos)] - *med) > factor * *stdev)
775 || isnan(pidata[sinfo_im_xy(im,ipos,jpos)])) {
781 return (sinfo_new_c_bezier_interpol(sc_im, drs_sc_mask));
783 return (pidata[sinfo_im_xy(im, ipos, jpos)]);
787 sinfo_new_c_bezier_interpol(cpl_imagelist * im, cpl_imagelist * action)
790 unsigned short i, j, k;
791 new_XYZW indata[1000];
794 float step, cumstep, selected_distance;
800 float* padata = NULL;
801 float* pidata = NULL;
802 cpl_image* i_img = NULL;
803 cpl_image* a_img = NULL;
806 memset(indata, 0x00, 1000 *
sizeof(new_XYZW));
807 ilx = cpl_image_get_size_x(cpl_imagelist_get(im, 0));
808 ily = cpl_image_get_size_y(cpl_imagelist_get(im, 0));
809 inp = cpl_imagelist_get_size(im);
812 for (i = 0; i < ilx; i++) {
813 for (j = 0; j < ily; j++) {
818 for (k = 0; k < inp; k++) {
819 a_img = cpl_imagelist_get(action, k);
820 padata = cpl_image_get_data_float(a_img);
821 i_img = cpl_imagelist_get(action, k);
822 pidata = cpl_image_get_data_float(i_img);
823 if (padata[sinfo_cu_xy(action, i, j)] == cubePT_USE) {
831 indata[pos].w = pidata[sinfo_cu_xy(im, i, j)];
835 if (padata[sinfo_cu_xy(action, i, j)] == cubePT_FIND) {
842 padata[sinfo_cu_xy(action,i,j)]);
848 i,j,k,pidata[sinfo_im_xy(im,i,j)],
861 "to use in iterpolation");
866 return (cubeNONEIGHBOR);
872 selected_distance = 1000;
873 munk = pow(1.0 - cumstep, (
double) pos - 1);
874 for (i = 0; (i < 100) && (munk != 0.0); i++) {
875 memset(&res, 0x00,
sizeof(new_XYZW));
876 sinfo_new_bezier(indata, pos - 1, cumstep, munk, &res);
877 float distance = sqrt(
878 pow(((*point).x - res.x), 2)
879 + pow(((*point).y - res.y), 2)
880 + pow(((*point).z - res.z), 2));
883 if (distance < selected_distance) {
884 selected_distance = distance;
890 cumstep = cumstep + step;
891 munk = pow(1.0 - cumstep, (
double) pos - 1);
897 selected.x,selected.y,selected.z,
898 selected.w,selected_distance);
900 i_img = cpl_imagelist_get(im, (*point).z);
901 pidata = cpl_image_get_data_float(i_img);
902 pidata[sinfo_cu_xy(im, (*point).x, (*point).y)] = selected.w;
908 sinfo_new_bezier(new_XYZW *p,
int n,
double mu,
double munk, new_XYZW *res)
912 for (
int k = 0; k <= n; k++) {
916 double blend = muk * munk;
920 blend *= (double) nn;
923 blend /= (double) kn;
927 blend /= (double) nkn;
931 res->x += p[k].x * blend;
932 res->y += p[k].y * blend;
933 res->z += p[k].z * blend;
934 res->w += p[k].w * blend;
940 sinfo_new_c_create_XYZ(new_Lookup *l)
942 cpl_image *imX, *imY, *imZ, *imcX;
943 short i, j, k, indexI, indexJ, x, y, z;
948 float* piddata = NULL;
949 float* pjddata = NULL;
950 float* pXdata = NULL;
951 float* pYdata = NULL;
952 float* pZdata = NULL;
953 float* phXdata = NULL;
955 cpl_image* i_img = NULL;
956 cpl_image* j_img = NULL;
958 idlx = cpl_image_get_size_x(cpl_imagelist_get(l->id, 0));
959 idly = cpl_image_get_size_y(cpl_imagelist_get(l->id, 0));
960 idnp = cpl_imagelist_get_size(l->id);
964 if (NULL == (imX = cpl_image_new(size, size, CPL_TYPE_FLOAT))) {
968 if (NULL == (imY = cpl_image_new(size, size, CPL_TYPE_FLOAT))) {
970 cpl_image_delete(imX);
973 if (NULL == (imZ = cpl_image_new(size, size, CPL_TYPE_FLOAT))) {
975 cpl_image_delete(imX);
976 cpl_image_delete(imY);
979 if (NULL == (imcX = cpl_image_new(size, size, CPL_TYPE_FLOAT))) {
981 cpl_image_delete(imX);
982 cpl_image_delete(imY);
983 cpl_image_delete(imZ);
993 for (i = 0; i < idlx; i++) {
994 for (j = 0; j < idly; j++) {
995 for (k = 0; k < idnp; k++) {
996 i_img = cpl_imagelist_get(l->id, k);
997 piddata = cpl_image_get_data_float(i_img);
998 piddata[sinfo_cu_xy(l->id, i, j)] = (float) sinfo_new_nint(
999 piddata[sinfo_cu_xy(l->id, i, j)]);
1005 for (i = 0; i < idlx; i++) {
1006 for (j = 0; j < idly; j++) {
1007 for (k = 0; k < idnp; k++) {
1008 j_img = cpl_imagelist_get(l->jd, k);
1009 pjddata = cpl_image_get_data_float(j_img);
1010 pjddata[sinfo_cu_xy(l->jd, i, j)] = (float) sinfo_new_nint(
1011 pjddata[sinfo_cu_xy(l->jd, i, j)]);
1017 for (i = 0; i < cpl_image_get_size_x(l->X); i++) {
1018 for (j = 0; j < cpl_image_get_size_y(l->X); j++) {
1019 pXdata = cpl_image_get_data_float(l->X);
1020 pYdata = cpl_image_get_data_float(l->Y);
1021 pZdata = cpl_image_get_data_float(l->Z);
1023 pXdata[sinfo_im_xy(l->X, i, j)] = ZERO;
1024 pYdata[sinfo_im_xy(l->Y, i, j)] = ZERO;
1025 pZdata[sinfo_im_xy(l->Z, i, j)] = ZERO;
1030 for( x = idlx - 1;x>=0;x--) {
1031 for( y = idly - 1;y>=0;y--) {
1032 for( z = idnp - 1;z>=0;z--)
1035 for (x = 0; x < idlx; x++) {
1036 for (y = 0; y < idly; y++) {
1037 for (z = 0; z < idnp; z++)
1040 i_img = cpl_imagelist_get(l->id, z);
1041 piddata = cpl_image_get_data_float(i_img);
1042 j_img = cpl_imagelist_get(l->jd, z);
1043 pjddata = cpl_image_get_data_float(j_img);
1044 indexI = piddata[sinfo_cu_xy(l->id, x, y)];
1045 indexJ = pjddata[sinfo_cu_xy(l->jd, x, y)];
1046 if (indexI > 0.0 && indexI < size && indexJ > 0.0
1050 pXdata = cpl_image_get_data_float(l->X);
1051 pYdata = cpl_image_get_data_float(l->Y);
1052 pZdata = cpl_image_get_data_float(l->Z);
1053 phXdata = cpl_image_get_data_float(l->hX);
1055 pXdata[sinfo_im_xy(l->X, indexI, indexJ)] = x;
1056 phXdata[sinfo_im_xy(l->hX, indexI, indexJ)] =
1057 phXdata[sinfo_im_xy(l->hX, indexI, indexJ)]
1060 pYdata[sinfo_im_xy(l->Y, indexI, indexJ)] = y;
1064 pZdata[sinfo_im_xy(l->Z, indexI, indexJ)] = z;
1072 sinfo_msg(
"Filled X Y Z , cX cY cZ 2D frames\n");
1082 sinfo_new_lookup(
void)
1085 l = (new_Lookup*) cpl_calloc(1,
sizeof(new_Lookup));
1095 sinfo_new_destroy_lookup(new_Lookup *l)
1108 sinfo_new_change_mask(cpl_image * mask, cpl_image * im)
1115 float* pidata = NULL;
1116 float* pmdata = NULL;
1118 if (mask == NULL || im == NULL )
1120 ilx = cpl_image_get_size_x(im);
1121 ily = cpl_image_get_size_y(im);
1122 pidata = cpl_image_get_data_float(im);
1126 pmdata = cpl_image_get_data_float(mask);
1128 for (i = 0; i < (int) ilx * ily; i++) {
1129 if (isnan(pidata[i])) {
1153 sinfo_new_c_bezier_find_cosmic(cpl_image *im, cpl_image *mask, new_Lookup *look,
1154 short rx,
short ry,
short rz,
short lowerI,
1155 short highI,
short lowerJ,
short highJ,
1160 cpl_imagelist * sc_im, *drs_sc_mask;
1161 short szx, szy, szz;
1162 float newValue, old;
1165 short rx_loop, ry_loop, rz_loop;
1167 cpl_image* o_img = NULL;
1169 float* pidata = NULL;
1177 mlx = cpl_image_get_size_x(mask);
1178 mly = cpl_image_get_size_y(mask);
1181 ilx = cpl_image_get_size_x(im);
1182 ily = cpl_image_get_size_y(im);
1183 pidata = cpl_image_get_data_float(im);
1185 if (mlx != ilx || mly != ily) {
1195 if (NULL == (sc_im = cpl_imagelist_new())) {
1199 for (i = 0; i < szz; i++) {
1200 o_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
1201 cpl_imagelist_set(sc_im, o_img, i);
1204 if (NULL == (drs_sc_mask = cpl_imagelist_new())) {
1209 for (i = 0; i < szz; i++) {
1210 o_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
1211 cpl_imagelist_set(drs_sc_mask, o_img, i);
1215 for (i = 0; i < mlx; i++) {
1216 for (j = 0; j < mly; j++) {
1217 if (i >= lowerI && i < highI && j >= lowerJ && j < highJ) {
1222 newValue = sinfo_new_c_bezier_correct_cosmic(i, j, im, mask,
1223 sc_im, drs_sc_mask, look, rx_loop, ry_loop,
1224 rz_loop, &med, &stdev, factor);
1227 while (newValue == cubeNONEIGHBOR && rx_loop < rx
1228 && ry_loop < ry && rz_loop < rz) {
1234 newValue = sinfo_new_c_bezier_correct_cosmic(i, j, im, mask,
1235 sc_im, drs_sc_mask, look, rx_loop, ry_loop,
1236 rz_loop, &med, &stdev, factor);
1239 if (isnan(newValue) || newValue == cubeNONEIGHBOR)
1243 old = pidata[sinfo_im_xy(im, i, j)];
1244 if (newValue != old) {
1245 pidata[sinfo_im_xy(im, i, j)] = newValue;
1256 cpl_imagelist_delete(sc_im);
1257 cpl_imagelist_delete(drs_sc_mask);
1279 sinfo_new_c_bezier_correct_cosmic(
int ipos,
int jpos, cpl_image * im,
1280 cpl_image * mask, cpl_imagelist * sc_im,
1281 cpl_imagelist * drs_sc_mask,
1282 new_Lookup * look,
short rx,
short ry,
1283 short rz,
double *med,
double *stdev,
1286 short ic, jc, kc, ii, jj, kk, is, js, ks;
1287 short i, j, k, indexJ, indexI, lx, ly, lz, szx, szy, szz;
1289 cpl_image * X, *Y, *Z, *hX;
1290 cpl_imagelist * id, *jd;
1293 float* phXdata = NULL;
1294 float* pXdata = NULL;
1295 float* pYdata = NULL;
1296 float* pZdata = NULL;
1298 float* pimdata = NULL;
1299 float* pscdata = NULL;
1300 float* pdrsdata = NULL;
1301 float* piddata = NULL;
1302 float* pjddata = NULL;
1303 float* pmaskdata = NULL;
1320 phXdata = cpl_image_get_data_float(hX);
1327 if (phXdata[sinfo_im_xy(hX, ipos, jpos)] < 1) {
1333 pXdata = cpl_image_get_data_float(X);
1334 pYdata = cpl_image_get_data_float(Y);
1335 pZdata = cpl_image_get_data_float(Z);
1337 ic = pXdata[sinfo_im_xy(X, ipos, jpos)];
1338 jc = pYdata[sinfo_im_xy(Y, ipos, jpos)];
1339 kc = pZdata[sinfo_im_xy(Z, ipos, jpos)];
1343 "in Cube -> ic=%d, jc=%d, kc=%d", ipos,jpos, ic, jc, kc );
1357 sinfo_msg_debug(
"Start Point in Cube -> ii=%d,jj=%d,kk=%d", ii, jj, kk );
1365 idlx = cpl_image_get_size_x(cpl_imagelist_get(
id, 0));
1366 idly = cpl_image_get_size_y(cpl_imagelist_get(
id, 0));
1367 idnp = cpl_imagelist_get_size(
id);
1372 if ((ic + rx) >= idlx)
1373 szx = szx - ((ic + rx) - (lx - 1));
1375 if ((jc + ry) >= idly)
1376 szy = szy - ((jc + ry) - (ly - 1));
1378 if ((kc + rz) >= idnp)
1379 szz = szz - ((kc + rz) - (lz - 1));
1382 sinfo_msg_error(
"Size of subcube : szx=%d,szy=%d,szz=%d\n", szx, szy, szz );
1384 drsnp=cpl_imagelist_get_size(drs_sc_mask);
1385 drslx=cpl_image_get_size_x(cpl_imagelist_get(drs_sc_mask,0));
1386 drsly=cpl_image_get_size_y(cpl_imagelist_get(drs_sc_mask,0));
1389 drslx, drsly, drsnp);
1391 for (i = 0; i < drslx; i++) {
1392 for (j = 0; j < drsly; j++) {
1393 for (k = 0; k < drsnp; k++) {
1394 pdrsdata = cpl_image_get_data_float(
1395 cpl_imagelist_get(drs_sc_mask, k));
1396 pdrsdata[sinfo_cu_xy(drs_sc_mask, i, j)] = cubePT_NOINFO;
1400 pimdata = cpl_image_get_data_float(im);
1401 pmaskdata = cpl_image_get_data_float(mask);
1402 for (i = ii, is = 0; i < ii + szx; i++, is++) {
1403 for (j = jj, js = 0; j < jj + szy; j++, js++) {
1404 for (k = kk, ks = 0; k < kk + szz; k++, ks++) {
1409 piddata = cpl_image_get_data_float(cpl_imagelist_get(
id, k));
1410 pjddata = cpl_image_get_data_float(cpl_imagelist_get(
id, k));
1411 pdrsdata = cpl_image_get_data_float(
1412 cpl_imagelist_get(drs_sc_mask, ks));
1413 pscdata = cpl_image_get_data_float(
1414 cpl_imagelist_get(sc_im, ks));
1416 indexI = sinfo_new_nint(piddata[sinfo_cu_xy(
id, i, j)]);
1417 indexJ = sinfo_new_nint(pjddata[sinfo_cu_xy(jd, i, j)]);
1418 if (indexJ <= -1 || indexJ >= 2048 || indexI == -1) {
1419 pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] = cubePT_NOINFO;
1422 pscdata[sinfo_cu_xy(sc_im, is, js)] = pimdata[sinfo_im_xy(im,
1424 pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] =
1425 pmaskdata[sinfo_im_xy(mask, indexI, indexJ)];
1428 " Sub is=%d, js=%d, ks=%d ; "
1429 " Plane I=%d,J=%d ; mask %f ; im %f\n",
1430 i, j, k, is, js, ks, indexI, indexJ,
1431 pmaskdata[sinfo_im_xy(mask,indexI,indexJ)],
1432 pimdata[sinfo_im_xy(im,indexI,indexJ)]);
1441 for (i = 0; i < szx; i++) {
1442 for (k = 0; k < szz; k++) {
1443 pdrsdata = cpl_image_get_data_float(
1444 cpl_imagelist_get(drs_sc_mask, k));
1445 pdrsdata[sinfo_cu_xy(drs_sc_mask, i, ry)] = cubePT_NOINFO;
1452 for (i = 0; i < szx; i++) {
1453 for (j = 0; j < szy; j++) {
1454 for (k = 0; k < szz; k++) {
1455 pdrsdata = cpl_image_get_data_float(
1456 cpl_imagelist_get(drs_sc_mask, k));
1457 pscdata = cpl_image_get_data_float(cpl_imagelist_get(sc_im, k));
1458 if (pscdata[sinfo_cu_xy(sc_im, i, j)] != ZERO
1459 && pdrsdata[sinfo_cu_xy(drs_sc_mask, i, j)]
1461 sum = sum + pscdata[sinfo_cu_xy(sc_im, i, j)];
1468 *med = sum / counter;
1472 for (i = 0; i < szx; i++) {
1473 for (j = 0; j < szy; j++) {
1474 for (k = 0; k < szz; k++) {
1475 pscdata = cpl_image_get_data_float(cpl_imagelist_get(sc_im, k));
1476 pdrsdata = cpl_image_get_data_float(
1477 cpl_imagelist_get(drs_sc_mask, k));
1478 if (pscdata[sinfo_cu_xy(sc_im, i, j)] != ZERO
1479 && pdrsdata[sinfo_cu_xy(drs_sc_mask, i, j)]
1481 sum = sum + (pscdata[sinfo_cu_xy(
1484 * (pscdata[sinfo_cu_xy(
1495 *stdev = sqrt(sum / (counter - 1));
1497 if ((fabs(pimdata[sinfo_im_xy(im, ipos, jpos)] - *med) > factor * *stdev)
1498 || isnan(pimdata[sinfo_im_xy(im,ipos,jpos)])) {
1499 pdrsdata = cpl_image_get_data_float(cpl_imagelist_get(drs_sc_mask, rz));
1500 pdrsdata[sinfo_cu_xy(drs_sc_mask, rx, ry)] = cubePT_FIND;
1501 return (sinfo_new_c_bezier_interpol(sc_im, drs_sc_mask));
1504 return (pimdata[sinfo_im_xy(im, ipos, jpos)]);
#define sinfo_msg_debug(...)
Print a debug message.
#define sinfo_msg_error(...)
Print an error message.