;+ ;NAME: IVM_FRACSHIFT_DATA ; ;PURPOSE: sub-pixel shifting/registration of images ; ;CATEGORY: data processing ; ;CALLING SEQUENCE: IVM_FRACSHIFT_DATA,oblk,filein,fileout,shiftarr ; ;INPUTS: ; oblk - oblk structure ; datin - input 3D array = fltarr(nn, nn, nimages) ; regout - output 3D array = fltarr(nn, nn, nimages) ; shiftarr - array of shifts from SHIFTER_2D or similar = fltarr(2,nimages) ; filein - flag for whether to read input file (fdatin, if set) ; fileout - flag for whether to write output file (fregout, if set) ; ;KEYWORDS: ; fregout - Output file - write the contents of 'regout' array ; fdatin - Input file to read, from which to set 'datin' input array ; ;PROCEDURE: Uses IDL interpolate for sub-pixel shifts like the IDL "shift" function. ; ;MODIFICATION HISTORY: based on B. Welch's shift_data and shift_frac ; ELW-20100310 - missing=0. was causing weird problems down the line: ; regout(*,*,i)=INTERPOLATE(datin(*,*,i),xinterp,yinterp,cubic=-0.5,/grid,missing=0.) ; ELW-20100225 - Array I/O with optional file I/O ; ELW-20100526 - 'filein' param ;- PRO IVM_FRACSHIFT_DATA, oblk, datin, regout, shiftarr, filein, fileout, $ fdatin=fdatin,fregout=fregout nn=oblk.spix ; assumed square nimages=oblk.ntimes * oblk.n_image_sets * oblk.nframes ; Read input array from file if 'fdatin' is set if (filein && keyword_set(fdatin)) then begin datin=fltarr(nn,nn,nimages) openr, lun, fdatin, /get_lun readu, lun, datin close, lun & free_lun, lun endif regout=fltarr(nn,nn,nimages) ; Output array for i=0,nimages-1 DO BEGIN xinterp=FINDGEN(nn)-shiftarr[0,i] yinterp=FINDGEN(nn)-shiftarr[1,i] regout[*,*,i]=INTERPOLATE(datin[*,*,i],xinterp,yinterp,cubic=-0.5,/grid) endfor if (fileout && keyword_set(fregout)) THEN BEGIN openw, lun, fregout, /get_lun writeu, lun, regout close, lun & free_lun, lun endif END