/*Dezing: This routine dezingers a pair of images, putting the output
in the first image.
Derived from the ADSC routine dezinger_to_int_simple, March 2003
*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "objects.h"
void dezing(unsigned short *indat1,unsigned short *indat2, int slow_max,
int fast_max, int saturated, float *tempbuf)
{
unsigned short *ptr1, *ptr2;
float *fptr;
int i, j, l, ifm, ifn, n, diff_sig, pix1, pix2, npix, linct, mini;
float avedif, rhold;
diff_sig = 8;
npix = slow_max * fast_max;
linct = 100 * fast_max;
printf ("Dezingering:");
ptr1 = indat1;
ptr2 = indat2;
ifn = 0;
mini = 65536;
n = 0;
for (i = 0; i < npix; i++) {
pix1 = *ptr1;
pix2 = *ptr2;
if ((pix1 < saturated) && (pix2 < saturated)) {
ifn += abs(pix1 - pix2);
n++;
}
if ((pix1 < mini) && (pix1 > 0))
mini = pix1;
ptr1++;
ptr2++;
}
avedif = ifn;
rhold = 2*n;
if (n > 0)
avedif = avedif/rhold;
else
avedif = 0.0;
printf (" avg abs diff (%d pix) %6.2f,",n,avedif);
l = avedif;
l = diff_sig * (1 + l);
ifn = 0;
j = 0;
ptr1 = indat1;
ptr2 = indat2;
for (i = 0; i < npix; i++) {
pix1 = *ptr1;
pix2 = *ptr2;
if ((pix1 < saturated) && (pix2 < saturated)) {
ifm = abs(pix1 - pix2);
if (ifm < l) {
ifn += ifm;
j++;
}
}
ptr1++;
ptr2++;
}
avedif = ifn;
rhold = 2*j;
if (j > 0)
avedif = avedif/rhold;
else
avedif = 0.0;
printf (" after rejs %6.2f\n",avedif);
l = avedif;
l = diff_sig * (1 + l);
n = 0;
ptr1 = indat1;
ptr2 = indat2;
fptr = tempbuf;
for (i = 0; i < npix; i++) {
pix1 = *ptr1;
pix2 = *ptr2;
ifm = abs(pix1 - pix2);
if ((ifm < l) && (pix1 < saturated) && (pix2 < saturated)) {
rhold = pix1 + pix2; /* Both pixels unsat'd and well-behaved */
*fptr = 0.5 * rhold;
}
else { /* difference is too large, one is a zinger or saturated */
n++;
if (pix2 < saturated) { /* 2nd exposure un-saturated */
if (pix1 < pix2) { /* 1st exposure also */
*fptr = pix1; /* Use first */
}
else { /* Second smaller, use it */
*fptr = pix2;
}
}
else { /* 2nd point saturated, use first */
*fptr = pix1;
}
}
ptr1++;
ptr2++;
fptr++;
if (i%linct == 0) {
j = i/fast_max;
printf("%d ",j);
fflush(stdout);
}
}
printf (" - dezingered %d pixels\n",n);
ptr1 = indat1;
fptr = tempbuf;
for (i = 0; i < npix; i++) { /* Copy data back to original array */
pix1 = *fptr;
if (pix1 > 65535)
pix1 = 65535;
if (pix1 < 0)
pix1 = 0;
*ptr1 = pix1;
ptr1++;
fptr++;
}
printf("\n");
return;
}