include # XT_SAMPLE -- Get sample of pixels. # # This routine returns a sample of unmasked pixels from an N-dim image. # The input is the image pointer, the mask pointer (which may be NULL), # the array to be filled, the maximum number of sample plixels, and the # minimum number of lines to sample. The return value is the actual number # of pixels which will be less than or equal to the specified maximum number. # # The intent of this routine is to sample fairly uniformly but efficiently. # If nlines is zero the total number of pixels, in raster order, is divided # into uniform steps. But this may end up reading many lines each for a # few pixels. To be more efficient if nlines is greater than zero then as # many pixels per line as possible are read to sample at least the requested # number of lines. $for (sird) int procedure xt_sample$t (im, bpm, sample, nsample, nlines) pointer im #I Image pointer pointer bpm #I Bad pixel pointer PIXEL sample[nsample] #I Work array int nsample #I Maximum number of sample pixels int nlines #I Minimum number of lines to sample int nreturn #I Number of pixels returned long v[IM_MAXDIM], vbuf[IM_MAXDIM] int i, ip, n, ndim, npix, nc real p, c, pstep, cstep pointer buf, bpmbuf int imgnls() $if (datatype != s) int imgnl$t() $endif begin # Determine the number of pixels in the data, the number # to make up nsample pixels, and the pixel step. ndim = IM_NDIM(im) nc = IM_LEN(im,1) npix = 1 do i = 1, ndim npix = npix * IM_LEN(im,i) pstep = real(npix) / min (npix, nsample) # To insure a minimum number of lines and efficient use of # pixels in a line, set the column step. if (nlines == 0) cstep = pstep else cstep = nc / min (min(npix,nsample)/nlines, nc) # Step through the pixels. call amovkl (long(1), v, IM_MAXDIM) nreturn = 0 for (p=(pstep-0.01)/2; p