pro getem,im,newim,thresh,dispaxis ; Detects badpixels based on nearest neighbor's behavior. ; Replaces isolated badpixels in an image by the average of ; adjacent points in the row. ; ; Bad Pixels are those whose value is not between the value of ; its neighbors, and its value deviates from the average of its ; neighbors by more than ; thresh * sqrt(avg(neighbors)) ; ; Axis is 1 for dispersion along x axis, 0 for dispersion along y. ;15-Jun-00 DMG Created routine if n_params() lt 3 then THRESH=10 sz = size(im) mask = bytarr(sz(1),sz(2)) + 1 ; all badpixels to start nrows = sz(2) ;number of rows in image ncols = sz(1) ;number of columns in image newim = im ; First stage - flag good pixels if their value lies between neighbors case dispaxis of 1: begin im1 = shift(im,1,0) im2 = shift(im,-1,0) end 0: begin im1 = shift(im,0,1) im2 = shift(im,0,-1) end else: begin print,' Choose dispersion axis value (0=y, 1=x)' stop end endcase diff1 = im - im1 diff2 = im - im2 p = where((diff1 lt 0 and diff2 ge 0) or (diff1 ge 0 and diff2 lt 0)) mask(p) = 0 ; good points ;print,im(394:398,841) ;print,mask(394:398,841) ;print,' ' ;print,im(427:431,854) ;print,mask(427:431,854) ;Loop thru remaining pixels, detecting deviant values for i = 0,ncols-1 do begin for j = 0,nrows-1 do begin if (mask(i,j) ne 0) then begin if (dispaxis eq 1) then begin case i of 0: medval = median([im(i+1,j),im(i,j)],/even) ncols-1: medval = median([im(i-1,j),im(i,j)],/even) else: medval = median([im(i-1,j),im(i+1,j),im(i,j)]) endcase endif else begin case j of 0: medval = median([im(i,j+1),im(i,j)],/even) nrows-1: medval = median([im(i,j-1),im(i,j)],/even) else: medval = median([im(i,j-1),im(i,j+1),im(i,j)]) endcase endelse deviation = abs(im(i,j) - medval) if (deviation lt thresh*sqrt(abs(medval))) then mask(i,j) = 0 endif endfor endfor ;print,im(394:398,841) ;print,mask(394:398,841) ;for i=0,4 do print,(im(394+i+1,841)+im(394+i-1,841))/2. ;print,' ' ;print,im(427:431,854) ;print,mask(427:431,854) ;for i=0,4 do print,(im(427+i+1,854)+im(427+i-1,854))/2. ; Replace values where badpixels are isolated if (dispaxis eq 1) then begin m1 = shift(mask,1,0) m2 = shift(mask,-1,0) endif else begin m1 = shift(mask,0,1) m2 = shift(mask,0,-1) endelse sum = m1+m2+mask avgarr = (im1 + im2)/2. p = where((sum eq 1) AND (mask eq 1)) newim(p) = avgarr(p) end