Class NLinearInterpolator<T extends NumericType<T>>
- java.lang.Object
-
- net.imglib2.AbstractEuclideanSpace
-
- net.imglib2.position.transform.AbstractPositionableTransform<LocalizablePositionable>
-
- net.imglib2.position.transform.Floor<RandomAccess<T>>
-
- net.imglib2.interpolation.randomaccess.NLinearInterpolator<T>
-
- Type Parameters:
T
-
- All Implemented Interfaces:
EuclideanSpace
,Positionable
,RealLocalizable
,RealPositionable
,RealRandomAccess<T>
,Sampler<T>
- Direct Known Subclasses:
NLinearInterpolator1D
,NLinearInterpolator2D
,NLinearInterpolator3D
,NLinearInterpolatorARGB
public class NLinearInterpolator<T extends NumericType<T>> extends Floor<RandomAccess<T>> implements RealRandomAccess<T>
Performs multi-linear interpolation.- Author:
- Stephan Preibisch, Stephan Saalfeld, Tobias Pietzsch
-
-
Field Summary
Fields Modifier and Type Field Description protected T
accumulator
protected int
code
Index intoweights
array.protected T
tmp
protected double[]
weights
Weights for each pixel of the 2x2x...x2 hypercube of pixels participating in the interpolation.-
Fields inherited from class net.imglib2.position.transform.AbstractPositionableTransform
discrete, position, target
-
Fields inherited from class net.imglib2.AbstractEuclideanSpace
n
-
-
Constructor Summary
Constructors Modifier Constructor Description protected
NLinearInterpolator(NLinearInterpolator<T> interpolator)
protected
NLinearInterpolator(RandomAccessible<T> randomAccessible)
protected
NLinearInterpolator(RandomAccessible<T> randomAccessible, T type)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description NLinearInterpolator<T>
copy()
NLinearInterpolator<T>
copyRealRandomAccess()
protected void
fillWeights()
Fill theweights
array.T
get()
Get the interpolated value at the current position.-
Methods inherited from class net.imglib2.position.transform.Floor
floor, floor, floor, floor, floor, move, move, move, move, move, setPosition, setPosition, setPosition, setPosition, setPosition
-
Methods inherited from class net.imglib2.position.transform.AbstractPositionableTransform
bck, fwd, getDoublePosition, getFloatPosition, localize, localize, move, move, move, move, move, setPosition, setPosition, setPosition, setPosition, setPosition, toString
-
Methods inherited from class net.imglib2.AbstractEuclideanSpace
numDimensions
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface net.imglib2.EuclideanSpace
numDimensions
-
Methods inherited from interface net.imglib2.Positionable
bck, fwd, move, move, move, move, move, setPosition, setPosition, setPosition, setPosition, setPosition
-
Methods inherited from interface net.imglib2.RealLocalizable
getDoublePosition, getFloatPosition, localize, localize
-
Methods inherited from interface net.imglib2.RealPositionable
move, move, move, move, move, setPosition, setPosition, setPosition, setPosition, setPosition
-
-
-
-
Field Detail
-
code
protected int code
Index intoweights
array.To visit the pixels that contribute to an interpolated value, we move in a (binary-reflected) Gray code pattern, such that only one dimension of the target position is modified per move.
This index is the corresponding gray code bit pattern which will select the correct corresponding weight.
-
weights
protected final double[] weights
Weights for each pixel of the 2x2x...x2 hypercube of pixels participating in the interpolation.Indices into this array are arranged in the standard iteration order (as provided by
IntervalIndexer.positionToIndex(int[], int[])
). Element 0 refers to position (0,0,...,0), element 1 refers to position (1,0,...,0), element 2 refers to position (0,1,...,0), etc.
-
accumulator
protected final T extends NumericType<T> accumulator
-
tmp
protected final T extends NumericType<T> tmp
-
-
Constructor Detail
-
NLinearInterpolator
protected NLinearInterpolator(NLinearInterpolator<T> interpolator)
-
NLinearInterpolator
protected NLinearInterpolator(RandomAccessible<T> randomAccessible, T type)
-
NLinearInterpolator
protected NLinearInterpolator(RandomAccessible<T> randomAccessible)
-
-
Method Detail
-
fillWeights
protected void fillWeights()
Fill theweights
array.Let w_d denote the fraction of a pixel at which the sample position p_d lies from the floored position pf_d in dimension d. That is, the value at pf_d contributes with (1 - w_d) to the sampled value; the value at ( pf_d + 1 ) contributes with w_d.
At every pixel, the total weight results from multiplying the weights of all dimensions for that pixel. That is, the "top-left" contributing pixel (position floored in all dimensions) gets assigned weight (1-w_0)(1-w_1)...(1-w_n).
We work through the weights array starting from the highest dimension. For the highest dimension, the first half of the weights contain the factor (1 - w_n) because this first half corresponds to floored pixel positions in the highest dimension. The second half contain the factor w_n. In this first step, the first weight of the first half gets assigned (1 - w_n). The first element of the second half gets assigned w_n
From their, we work recursively down to dimension 0. That is, each half of weights is again split recursively into two partitions. The first element of the second partitions is the first element of the half multiplied with (w_d). The first element of the first partitions is multiplied with (1 - w_d).
When we have reached dimension 0, all weights will have a value assigned.
-
get
public T get()
Get the interpolated value at the current position.To visit the pixels that contribute to an interpolated value, we move in a (binary-reflected) Gray code pattern, such that only one dimension of the target position is modified per move.
- Specified by:
get
in interfaceSampler<T extends NumericType<T>>
-
copy
public NLinearInterpolator<T> copy()
- Specified by:
copy
in interfaceSampler<T extends NumericType<T>>
- Returns:
- - A new
Sampler
in the same state accessing the same values. It does NOT copy T, just the state of theSampler
. Otherwise use T.copy() if available. Sampler.copy().get() == Sampler.get(), i.e. both hold the same value, not necessarily the same instance (this is the case for anArrayCursor
for example)
-
copyRealRandomAccess
public NLinearInterpolator<T> copyRealRandomAccess()
- Specified by:
copyRealRandomAccess
in interfaceRealRandomAccess<T extends NumericType<T>>
-
-