aboutsummaryrefslogtreecommitdiff
path: root/math/iminterp/doc/im2dinterp.spc
diff options
context:
space:
mode:
authorJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
committerJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
commit40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch)
tree4464880c571602d54f6ae114729bf62a89518057 /math/iminterp/doc/im2dinterp.spc
downloadiraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'math/iminterp/doc/im2dinterp.spc')
-rw-r--r--math/iminterp/doc/im2dinterp.spc432
1 files changed, 432 insertions, 0 deletions
diff --git a/math/iminterp/doc/im2dinterp.spc b/math/iminterp/doc/im2dinterp.spc
new file mode 100644
index 00000000..e4d88be3
--- /dev/null
+++ b/math/iminterp/doc/im2dinterp.spc
@@ -0,0 +1,432 @@
+.help iinterp Dec84 "Math Package"
+.ce
+Specifications for the 2D-Image Interpolator Package
+.ce
+Lindsey Davis
+.ce
+December 1984
+
+.sh
+1. Introduction
+
+One of the most common operations required in image processing is
+two-dimensional interpolation in a data array. Any image operator which
+physically moves pixels around requires image interpolation to calculate
+the new gray levels of the pixels. The advantage
+of having a locally written image interpolation package includes the ability to
+optimize for uniformly spaced data and the possibility of adding features
+that are useful to the final application.
+
+.sh
+2. Requirements
+
+.ls (1)
+The package shall take as input a 2-D array containing an image or image
+section. The pixels are assumed to be equally spaced on a rectangular grid.
+The coordinates of the pixels
+are assumed to be the same as the subscripts of the pixel in the data array.
+Therefore the coordinates of the first pixel in the array are assumed
+to be (1,1). For operations on image sections the calling program must
+keep track of any transformations between image and section coordinates.
+All pixels are assumed to be good.
+Checking for INDEF and out of bounds pixels is
+the responsibility of the user. A routine to remove INDEF valued pixels
+ARBPIX is available in the 1-D package.
+.le
+.ls (2)
+The package is divided into array sequential interpolants and array random
+interpolants. The sequential interpolants have been optimized for returning
+many values as when an array is shifted or when an array is oversampled
+at many points in order to produce a smooth surface plot.
+The random interpolants
+allow the evaluation of a few interpolated points without the computing
+time and storage overhead required for setting up the sequential version.
+.le
+.ls (3)
+The quality of the interpolant will be set at run time. The options are:
+
+.nf
+ II_BINEAREST # nearest neighbour
+ II_BILINEAR # bilinear
+ II_BIPOLY3 # bicubic interior polynomial
+ II_BIPOLY5 # biquintic interior polynomial
+ II_BISPLINE3 # bicubic spline
+.fi
+
+The calling sequences shall be invariant to the interpolant selected.
+Routines should be designed so that new interpolants can be added with
+minimal changes to the code and no changes to the calling sequences.
+.le
+.ls (4)
+The interpolant parameters and the arrays necessary to store the
+coefficients are stored in a structure referenced by a pointer. The pointer
+is returned to the user program by the initial call to MSIINIT or
+MSIRESTORE and freed by a call to MSIFREE.
+.le
+.ls (5)
+The package routines should be able to:
+.ls o
+Calculate the coefficients of the interpolant and store these coefficients
+in the appropriate part of the interpolant descriptor structure.
+.le
+.ls o
+Evaluate the interpolant at a given x-y(s) coordinate.
+.le
+.ls o
+Evaluate the first nder derivatives at a given value of x-y.
+.le
+.ls o
+Integrate the interpolant over a specified interval in x-y.
+.le
+
+.sh
+3. Specifications
+
+.sh
+3.1. The Matrix Sequential Interpolator Routines
+
+The package prefix is msi and the package routines are:
+
+.nf
+ msiinit (msi, interp_type)
+ msifit (msi, datain, nxpix, nypix, len_datain)
+ y = msieval (msi, x, y)
+ msivector (msi, x, y, zfit, npix)
+ msigrid (msi, x, y, zfit, nx, ny, len_zfit)
+ msider (msi, x, y, der, nxder, nyder, len_der)
+ v = msigrl (msi, x, y, npts)
+ v = msisqgrl (msi, x1, x2, y1, y2)
+ msisave (msi, interpolant)
+ msirestore (msi, interpolant)
+ msifree (msi)
+.fi
+
+.sh
+3.2. The Matrix Random Interpolator Routines
+
+The package prefix is mri and the package routines are:
+
+.nf
+ y = mrieval (x, y, datain, nx, ny, len_datain, interp_type)
+ mrider (x, y, datain, nx, ny, len_datain, der, nxder, nyder,
+ len_der, interp_type)
+.fi
+
+.sh
+3.3. Miscellaneous
+
+A routine ARBPIX will remove INDEF valued pixels from an
+array and is available in the 1-D package.
+
+.nf
+ arbpix (datain, dataout, npix, interp_type, boundary_type)
+.fi
+
+.sh
+3.4. Algorithms
+
+.sh
+3.4.1. Coefficients
+
+The coefficients for the msi routines are calculated by MSIFIT. MSIFIT
+accepts the input data, checks that the number of data pixels is
+appropriate for the interpolant selected, and allocates space for the
+interpolant. Boundary coefficient values are calculated using boundary
+projection. With the exception of the II_BISPLINE3 option, the interpolant
+is stored as the data points. The B-spline coefficients are calculated
+using the "natural" end conditions in two steps.
+First the B-spline coefficients in x at each value of y are calculated.
+The B-x coefficients are then solved for the B-spline coefficients in x-y.
+After a call to MSIFIT the coefficient
+array contains the following.
+
+.nf
+ CASE II_BINEAREST:
+
+ # no boundary extension required, coeff[1:nx,1:ny]
+
+ coeff[i,j] = data[i,j] i = 1,...,nx
+ j = 1,...,ny
+
+ case II_BILINEAR:
+
+ # must extend nx by 1 and ny by 1, coeff[1:nx+1,1:ny+1]
+
+ coeff[i,j] = data[i,j] i = 1,...,nx
+ j = 1,...,ny
+
+ coeff[nx+1,j] = 2 * data[nx] - data[nx-1] j = 1,...,ny
+ coeff[i,ny+1] = 2 * data[ny] - data[ny-1] i = 1,...,nx
+
+ coeff[nx+1,ny+1] = 2 * coeff[nx+1,ny] - data[nx,ny]
+
+ case II_BIPOLY3:
+
+ # must extend nx by -1 and 2 and ny by -1 and 2, coeff[0:nx+2,0:ny+2]
+
+ coeff[i,j] = data[i,j] i = 1,...,nx
+ j = 1,...,ny
+
+ coeff[0,j] = 2 * data[1,j] - data[2,j] j = 1,...,ny
+ coeff[nx+1,j] = 2 * data[nx,j] - data[nx-1,j] j = 1,...,ny
+ coeff[nx+2,j] = 2 * data[nx,j] - data[nx-2,j] j = 1,...,ny
+
+ coeff[i,0] = 2 * data[i,1] - data[i,2] i = 1,...,ny
+ coeff[i,ny+1] = 2 * data[i,ny] - data[i,ny-1] i = 1,...,nx
+ coeff[i,ny+2] = 2 * data[i,ny] - data[i,ny-2] i = 1,...,nx
+
+ # plus remaining points
+
+ case II_BIPOLY5:
+
+ # extend -2 and 3 in nx and -2 and 3 in ny, coeff[-1:nx+3,-1:ny+3]
+
+ coeff[i,j] = data[i,j] i = 1,...,nx
+ j = 1,...,ny
+
+ coeff[-1,j] = 2 * data[1,j] - data[3,j] j = 1,...,ny
+ coeff[0,j] = 2 * data[1,j] - data[2,j] j = 1,...,ny
+ coeff[nx+1,j] = 2 * data[nx,j] - data[nx-1,j] j = 1,...,ny
+ coeff[nx+2,j] = 2 * data[nx,j] - data[nx-2,j] j = 1,...,ny
+ coeff[nx+3,j] = 2 * data[nx,j] - data[nx-3,j] j = 1,...,ny
+
+ coeff[i,-1] = 2 * data[i,1] - data[i,3] i = 1,...,nx
+ coeff[i,0] = 2 * data[i,1] - data[i,2] i = 1,...,nx
+ coeff[i,ny+1] = 2 * data[i,ny] - data[i,ny-1] i = 1,...,nx
+ coeff[i,ny+2] = 2 * data[i,ny] - data[i,ny-2] i = 1,...,nx
+ coeff[i,ny+3] = 2 * data[i,ny] - data[i,ny-3] i = 1,...,nx
+
+ # plus remaining conditions
+
+ case II_BISPLINE3:
+
+ # the natural boundary conditions are used, coeff[0:nx+2,0:ny+2]
+
+ coeff[i,j] = data[i,j] i = 1,...,nx
+ j = 1,...,ny
+
+ coeff[i,0] = 0. i = 0,...,nx+2
+ coeff[i,ny+1] = 0. i = 0,...,nx+2
+ coeff[i,ny+2] = 0. i = 0,...,nx+2
+
+ coeff[0,j] = 0. j = 1,...,ny
+ coeff[nx+1,j] = 0. j = 1,...,ny
+ coeff[nx+2,j] = 0. j = 1,...,ny
+
+ # plus remaining coefficients
+
+.fi
+
+.sh
+3.4.2. Evaluation
+
+The MSIEVAL and MSIVECTOR routines will be optimized to be as efficient
+as possible for evaluating arbitrarily spaced data. A special function
+MSIGRID is included for evaluating closely spaced points on a rectangular grid.
+For the options II_BINEAREST and II_BILINEAR the value of the
+interpolant is calculated directly. The II_BISPLINE3 interpolant is
+evaluated using polynomial coefficients calculated directly from the
+B-spline coefficients. Values of the higher order polynomial interpolants
+are calculated using Everett's central difference formula. The equations
+are listed below.
+
+.nf
+case II_BINEAREST:
+
+ z = coeff[int (x + 0.5), int (y + 0.5))
+
+case II_BILINEAR:
+
+ sx = x - nx sy = y - ny
+ tx = 1. - sx ty = 1. - sy
+
+ z = tx * ty * coeff[nx,ny] + sx * ty * coeff[nx+1,ny] +
+ sy * tx * coeff[nx,ny+1] + sx * sy * coeff[nx+1,ny+1]
+
+
+case II_BIPOLY3:
+
+ nx = x
+ sx = x - nx
+ tx = 1. - sx
+
+ # interpolate in x
+
+ i = 1
+
+ do j = ny-1, ny+2 {
+
+ cd20[i] = 1./6. * (coeff[nx+1,j] - 2. * coeff[nx,j] + coeff[nx-1,j])
+ cd21[i] = 1./6. * (coeff[nx+2,j] - 2. * coeff[nx+1,j] + coeff[nx,j])
+
+ z[i] = sx * (coeff[nx+1,j] + (sx * sx - 1.) * cd21[i]) +
+ tx * (coeff[nx,j] + (tx * tx - 1.) * cd20[i])
+
+ i = i + 1
+ }
+
+ ny = y
+ sy = y - ny
+ ty = 1. - sy
+
+ # interpolate in y
+
+ cd20y = 1./6. * (z[3] - 2. * z[2] + z[1])
+ cd21y = 1./6. * (z[4] - 2. * z[3] + z[2])
+
+ value = sy * (z[3] + (sy * sy - 1.) * cd21y) +
+ ty * (z[2] + (ty * ty - 1.) *cd20y)
+
+
+case II_BIPOLY5:
+
+ nx = x
+ sx = x - nx
+ sx2 = sx * sx
+ tx = 1. - sx
+ tx2 = tx * tx
+
+ # interpolate in x
+
+ i = 1
+
+ do j = ny-2, ny+3 {
+
+ cd20[i] = 1./6. * (coeff[nx+1,j] - 2. * coeff[nx,j] + coeff[nx-1,j])
+ cd21[i] = 1./6. * (coeff[nx+2,j] - 2. * coeff[nx+1,j] + coeff[nx,j])
+ cd40[i] = 1./120. * (coeff[nx-2,j] - 4. * coeff[nx-1,j] +
+ 6. * coeff[nx,j] - 4. * coeff[nx+1,j] + coeff[nx+2,j])
+ cd41[i] = 1./120. * (coeff[nx-1,j] - 4. * coeff[nx,j] +
+ 6. * coeff[nx+1,j] - 4. * coeff[nx+2,j] + coeff[nx+3,j])
+
+ z[i] = sx * (coeff[nx+1,j] + (sx2 - 1.) * (cd21[j] + (sx2 - 4.) *
+ cd41[j])) + tx * (coeff[nx,j] + (tx2 - 1.) *
+ (cd20[j] + (tx2 - 4.) * cd40[j]))
+
+ i = i + 1
+ }
+
+ ny = y
+ sy = y - ny
+ sy2 = sy * sy
+ ty = 1. - sy
+ ty2 = ty * ty
+
+ # interpolate in y
+
+ cd20y = 1./6. * (z[3] - 2. * z[2] + z[1])
+ cd21y = 1./6. * (z[4] - 2. * z[3] + z[2])
+ cd40y = 1./120. * (z[1] - 4. * z[2] + 6. * z[3] - 4. * z[4] + z[5])
+ cd41y = 1./120. * (z[2] - 4. * z[3] + 6. * z[4] - 4. * z[5] + z[6])
+
+ value = sy * (z[4] + (sy2 - 1.) * (cd21y + (sy2 - 4.) * cd41y)) +
+ ty * (z[3] + (ty2 - 1.) * (cd20y + (ty2 - 4.) * cd40y))
+
+case II_BISPLINE3:
+
+ # use the B-spline representation
+
+ value = coeff[i,j] * B[i](x) * B[j](y)
+
+ # the B-splines are the following
+
+ B1(x) = (x - x1) ** 3
+ B2(x) = 1 + 3 * (x - x2) + 3 * (x - x2) ** 2 - 3 * (x - x2) ** 3
+ B3(x) = 1 + 3 * (x3 - x) + 3 * (x3 - x) ** 2 - 3 * (x3 - x) ** 3
+ B4(x) = (x4 - x) ** 3
+
+ # the y B-splines are identical
+
+.fi
+
+.sh
+3.4.3. Derivatives
+
+The derivatives are calculated by evaluating the derivatives of the
+interpolating polynomial. The 0-th derivative is the value of the
+interpolant. The 1-st derivatives are d/dx and d/dy. The second are
+d2/dx2, d2/dy2 and d2/dxdy. The derivatives in the case II_BINEAREST
+and II_BILINEAR are calculated directly.
+
+.nf
+case II_BINEAREST:
+
+ der[1,1] = value # see previous section
+
+case II_BILINEAR:
+
+ der[1] = value # see previous section
+
+ # d/dx
+ der[2,1] = -ty * coeff[nx,ny] + ty * coeff[nx+1,ny] -
+ sy * coeff[nx,ny+1] + sy * coeff[nx+1,ny+1]
+
+ # d/dy
+ der[1,2] = -tx * coeff[nx,ny] + sx * coeff[nx+1,ny] +
+ tx * coeff[nx,ny+1] + sx * coeff[nx+1,ny+1]
+
+ # d2/dxdy
+ der[2,2] = coeff[nx,ny] - coeff[nx+1,ny] - coeff[nx,ny+1] + coeff[nx+1,ny+1]
+
+case II_BIPOLY3, II_BIPOLY5, II_BISPLINE3:
+.fi
+
+For the higher order interpolants the coefficients of the interpolating
+polynomial in x and y are calculated. In the case of II_BIPOLY3 and II_BIPOLY5
+this is the Everett polynomial of the 3-rd and 5-th order respectively.
+In the case of II_BISPLINE3 the pp-representation is calculated for
+the B-spline coefficients. The value of the interpolant and its
+derivatives is calculated using nested multiplication.
+
+.sh
+3.4.5. Integration
+
+Integration is most easily accomplished by integrating the interpolant in
+x for each value of y. The resulting function of y can then be integrated
+in y to derive the 2-D integral. The limits of the integral are assumed
+to be the corners of a polygon. At minimum of three points which define
+a triangular region in x-y are required. The integral will be an approximation.
+A special function for integrating over a rectangular region is also
+provided.
+
+.sh
+4. Detailed Design
+
+.sh
+4.1. Interpolant Descriptor
+
+The interpolant parameters and coefficients will be stored in a structure
+as listed below.
+
+.nf
+ define LEN_MSISTRUCT 10
+
+ struct {
+
+ int msi_type # interpolant type
+ int msi_nxcoeff # size of coefficient array in x
+ int msi_nycoeff # size of coefficient array in y
+ int msi_fstpnt # first datapoint in coefficient array
+ int asi_coeff # pointer to 1-D coefficient array
+
+ } msistruct
+
+.fi
+
+.sh
+4.2. Storage Requirements
+
+The interpolant descriptor requires LEN_MSISTRUCT storage units.
+The coefficient array storage is dynamically allocated and requires
+msi_nxcoeff * msi_nycoeff real storage elements. The requirements for
+each interpolant type are listed below.
+
+.nf
+ II_BINEAREST nxpix * nypix
+ II_BILINEAR (nxpix + 1) * (nypix + 1)
+ II_BIPOLY3 (nxpix + 3) * (nypix + 3)
+ II_BIPOLY5 (nxpix + 5) * (nypix + 5)
+ II_BISPLINE3 (nxpix + 3) * (nypix + 3)
+.fi
+
+.endhelp