From fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 Mon Sep 17 00:00:00 2001 From: Joseph Hunkeler Date: Wed, 8 Jul 2015 20:46:52 -0400 Subject: Initial commit --- pkg/xtools/xtsample.x | 362 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 362 insertions(+) create mode 100644 pkg/xtools/xtsample.x (limited to 'pkg/xtools/xtsample.x') diff --git a/pkg/xtools/xtsample.x b/pkg/xtools/xtsample.x new file mode 100644 index 00000000..e8184e1d --- /dev/null +++ b/pkg/xtools/xtsample.x @@ -0,0 +1,362 @@ +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. + + +int procedure xt_samples (im, bpm, sample, nsample, nlines) + +pointer im #I Image pointer +pointer bpm #I Bad pixel pointer +short 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() + +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