37 #include "vircam_mods.h"
38 #include "vircam_utils.h"
39 #include "vircam_filt.h"
40 #include "vircam_fits.h"
41 #include "vircam_mask.h"
42 #include "vircam_stats.h"
46 static int maxhist = 66536;
47 static int minhistval = -1000;
48 static int maxhistval = 65535;
51 static void modelback(
float *map, cpl_binary *bpm,
int nx,
int ny,
int nbsize,
53 static void medsig(
int *hist,
int ist,
int itarg,
float *med,
float *sig);
102 if (*status != VIR_OK)
108 data = cpl_image_get_data_float(im);
109 bpm = cpl_mask_get_data(cpl_image_get_bpm(im));
110 nx = (int)cpl_image_get_size_x(im);
111 ny = (int)cpl_image_get_size_y(im);
115 modelback(data,bpm,nx,ny,nbsize,&skymap);
119 for (i = 0; i < nx*ny; i++)
159 static void modelback(
float *map, cpl_binary *bpm,
int nx,
int ny,
160 int nbsize,
float **skymap) {
161 float fracx,fracy,skymed,sigma,skymedc,sigmac,avsky,fnbsize,dely,delx;
163 int ifracx,ifracy,nbsizx,nbsizy,nbx,nby,npixstripe,l,i,ll;
164 int isquare,ilev,j,iclip,mcpix,iloop,irej,nbsizo2,kk,k,iby,ibyp1,ibx,ibxp1;
165 int *shist,**hist,*nnp,jj1,jj2,jj3,jj4;
166 unsigned char *badmask;
170 fracx = ((float)nx)/((float)nbsize);
171 fracy = ((float)ny)/((float)nbsize);
172 ifracx = (int)(fracx + 0.1);
173 ifracy = (int)(fracy + 0.1);
176 nbsize = max(vircam_nint(0.9*nbsize),min(nbsize,min(nbsizx,nbsizy)));
177 nbsize = min(nx,min(ny,nbsize));
183 npixstripe = nbsize*nx;
187 hist = cpl_malloc(nbx*
sizeof(
int *));
188 for (l = 0; l < nbx; l++)
189 hist[l] = cpl_malloc(maxhist*
sizeof(
int));
193 bvals = cpl_malloc(nbx*nby*
sizeof(
float *));
194 badmask = cpl_calloc(nbx*nby,
sizeof(
unsigned char *));
198 nnp = cpl_malloc(nbx*
sizeof(
int));
203 for (l = 0; l < nby; l++) {
204 memset((
char *)nnp,0,nbx*
sizeof(*nnp));
205 for (i = 0; i < nbx; i++)
206 memset((
char *)hist[i],0,maxhist*
sizeof(
int));
212 for (i = 0; i < npixstripe; i++) {
213 if (bpm[ll+i] == 0) {
214 isquare = (int)((
float)(i % nx)/(
float)nbsize);
215 isquare = min(nbx-1,max(0,isquare));
216 ilev = min(maxhistval,max(minhistval,vircam_nint(map[i+ll])));
217 hist[isquare][ilev-minhistval] += 1;
225 for (j = 0; j < nbx; j++) {
227 if (nnp[j] > 0.25*nbsize*nbsize) {
229 medsig(shist,minhistval-1,nnp[j],&skymed,&sigma);
238 for (iloop = 0; iloop < 3; iloop++) {
240 for (i = vircam_nint(skymedc+3.0*sigmac); i <= iclip; i++)
241 irej += shist[i-minhistval];
244 iclip = vircam_nint(skymedc+3.0*sigmac) - 1;
245 mcpix = mcpix - irej;
246 medsig(shist,minhistval-1,mcpix,&skymedc,
249 bvals[jj1] = skymedc;
252 bvals[jj1] = -1000.0;
265 avsky =
vircam_med(bvals,badmask,(
long)(nbx*nby));
270 *skymap = cpl_malloc(nx*ny*
sizeof(
float));
272 fnbsize = 1.0/((float)nbsize);
273 for (k = 0; k < ny; k++) {
278 iby = (k + 1 + nbsizo2)/nbsize;
280 iby = min(nby,max(1,iby));
281 ibyp1 = min(nby,ibyp1);
282 dely = (k + 1 - nbsize*iby + nbsizo2)*fnbsize;
284 for (j = 0; j < nx; j++) {
288 ibx = (j + 1 + nbsizo2)/nbsize;
290 ibx = min(nbx,max(1,ibx));
291 ibxp1 = min(nbx,ibxp1);
292 delx = (j + 1 - nbsize*ibx + nbsizo2)*fnbsize;
293 jj1 = (iby-1)*nbx + ibx - 1;
294 jj2 = (ibyp1-1)*nbx + ibx - 1;
295 jj3 = (iby-1)*nbx + ibxp1 - 1;
296 jj4 = (ibyp1-1)*nbx + ibxp1 - 1;
300 t1 = (1.0 - dely)*bvals[jj1] + dely*bvals[jj2];
301 t2 = (1.0 - dely)*bvals[jj3] + dely*bvals[jj4];
302 (*skymap)[kk+j] = (1.0 - delx)*t1 + delx*t2;
308 for (l = 0; l < nbx; l++)
346 static void medsig(
int *hist,
int ist,
int itarg,
float *med,
float *sig) {
347 int isum, medata,indx;
356 indx = medata - minhistval;
357 while (isum <= (itarg+1)/2 && indx < maxhist - 1) {
359 indx = medata - minhistval;
362 ffrac = (float)(isum - (itarg+1)/2)/(
float)hist[medata-minhistval];
363 *med = (float)medata - ffrac + 0.5;
373 indx = medata - minhistval;
374 while (isum <= (itarg+3)/4 && indx < maxhist - 1) {
376 indx = medata - minhistval;
379 ffrac = (float)(isum - (itarg+3)/4)/(
float)hist[medata-minhistval];
380 sigmed = (float)medata - ffrac + 0.5;
381 *sig = 1.48*(*med - sigmed);
382 *sig = max(2.5,*sig);
int vircam_inpaint(vir_fits *in, int nbsize, int *status)
Inpaint pixels or patches in a map.
cpl_image * vircam_fits_get_image(vir_fits *p)
float vircam_med(float *data, unsigned char *bpm, long npts)
void vircam_bfilt(float *data, unsigned char *bpm, int nx, int ny, int filt, int stat, int axis)
Do linear filtering on an input map.