Class PlanarImg<T extends NativeType<T>,A extends ArrayDataAccess<A>>

All Implemented Interfaces:
Iterable<T>, Dimensions, EuclideanSpace, PlanarAccess<A>, Img<T>, NativeImg<T,A>, Interval, IterableInterval<T>, IterableRealInterval<T>, RandomAccessible<T>, RandomAccessibleInterval<T>, RealInterval, SubIntervalIterable<T>

public class PlanarImg<T extends NativeType<T>,A extends ArrayDataAccess<A>> extends AbstractNativeImg<T,A> implements PlanarAccess<A>, SubIntervalIterable<T>
A NativeImg that stores data in an list of primitive arrays, one per image plane.

The PlanarImg provides access to the underlying data arrays via the getPlane(int) method.

Author:
Jan Funke, Stephan Preibisch, Stephan Saalfeld, Johannes Schindelin, Tobias Pietzsch
  • Field Details

    • numSlices

      protected final int numSlices
    • dimensions

      protected final int[] dimensions
    • sliceSteps

      protected final int[] sliceSteps
    • mirror

      protected final ArrayList<A extends ArrayDataAccess<A>> mirror
  • Constructor Details

    • PlanarImg

      public PlanarImg(long[] dim, Fraction entitiesPerPixel)
  • Method Details

    • update

      public A update(Object c)
      Description copied from interface: NativeImg
      called by type with cursor.
      Specified by:
      update in interface NativeImg<T extends NativeType<T>,A extends ArrayDataAccess<A>>
      Parameters:
      c - cursor
      Returns:
      native array which is referred to by the updater
    • numSlices

      public int numSlices()
      Returns:
      total number of image planes
    • getIndex

      public final int getIndex(int[] l)
      For a given ≥2d location, estimate the pixel index in the stack slice.
      Parameters:
      l -
      Returns:
      TODO: remove this method? (it doesn't seem to be used anywhere)
    • indexToGlobalPosition

      public void indexToGlobalPosition(int sliceIndex, int indexInSlice, int[] position)
      Compute a global position from the index of a slice and an index within that slice.
      Parameters:
      sliceIndex - index of slice
      indexInSlice - index of element within slice
      position - receives global position of element TODO: move this method to AbstractPlanarCursor? (that seems to be the only place where it is needed)
    • indexToGlobalPosition

      public int indexToGlobalPosition(int sliceIndex, int indexInSlice, int dim)
      Compute a global position from the index of a slice and an index within that slice.
      Parameters:
      sliceIndex - index of slice
      indexInSlice - index of element within slice
      dim - which dimension of the position we are interested in
      Returns:
      dimension dim of global position TODO: move this method to AbstractPlanarCursor? (that seems to be the only place where it is needed)
    • cursor

      public PlanarCursor<T> cursor()
      Description copied from interface: IterableRealInterval

      Returns a RealCursor that iterates with optimal speed without calculating the location at each iteration step. Localization is performed on demand.

      Use this where localization is required rarely/ not for each iteration.

      Specified by:
      cursor in interface IterableInterval<T extends NativeType<T>>
      Specified by:
      cursor in interface IterableRealInterval<T extends NativeType<T>>
      Returns:
      fast iterating iterator
    • localizingCursor

      public PlanarLocalizingCursor<T> localizingCursor()
      Description copied from interface: IterableRealInterval

      Returns a RealLocalizable Iterator that calculates its location at each iteration step. That is, localization is performed with optimal speed.

      Use this where localization is required often/ for each iteration.

      Specified by:
      localizingCursor in interface IterableInterval<T extends NativeType<T>>
      Specified by:
      localizingCursor in interface IterableRealInterval<T extends NativeType<T>>
      Returns:
      fast localizing iterator
    • randomAccess

      public PlanarRandomAccess<T> randomAccess()
      Description copied from interface: RandomAccessible
      Create a random access sampler for integer coordinates.

      The returned random access covers as much of the domain as possible.

      Please note: RandomAccessibleIntervals have a finite domain (their Interval), so RandomAccessible.randomAccess() is only guaranteed to cover this finite domain. This may lead to unexpected results when using Views. In the following code
       RandomAccessible<T> extended = Views.extendBorder( img )
       RandomAccessibleInterval<T> cropped = Views.interval( extended, img );
       RandomAccess<T> a1 = extended.randomAccess();
       RandomAccess<T> a2 = cropped.randomAccess();
       
      The access a1 on the extended image is valid everywhere. However, somewhat counter-intuitively, the access a2 on the extended and cropped image is only valid on the interval img to which the extended image was cropped. The access is only required to cover this interval, because it is the domain of the cropped image. Views attempts to provide the fastest possible access that meets this requirement, and will therefore strip the extension. To deal with this, if you know that you need to access pixels outside the domain of the RandomAccessibleInterval, and you know that the RandomAccessibleInterval is actually defined beyond its interval boundaries, then use the RandomAccessible.randomAccess(Interval) variant and specify which interval you actually want to access. In the above example,
       RandomAccess<T> a2 = cropped.randomAccess( Intervals.expand( img, 10 ) );
       
      will provide the extended access as expected.
      Specified by:
      randomAccess in interface RandomAccessible<T extends NativeType<T>>
      Returns:
      random access sampler
    • iterationOrder

      public FlatIterationOrder iterationOrder()
      Description copied from interface: IterableRealInterval
      Returns the iteration order of this IterableRealInterval. If the returned object equals (Object.equals(Object)) the iteration order of another IterableRealInterval f then they can be copied by synchronous iteration. That is, having an Iterator on this and another Iterator on f, moving both in synchrony will point both of them to corresponding locations in their source domain. In other words, this and f have the same iteration order and means and the same number of elements.
      Specified by:
      iterationOrder in interface IterableRealInterval<T extends NativeType<T>>
      Returns:
      the iteration order of this IterableRealInterval.
      See Also:
    • getPlane

      public A getPlane(int no)
      Specified by:
      getPlane in interface PlanarAccess<T extends NativeType<T>>
    • setPlane

      public void setPlane(int no, A plane)
      Specified by:
      setPlane in interface PlanarAccess<T extends NativeType<T>>
    • factory

      public PlanarImgFactory<T> factory()
      Description copied from interface: Img
      Get a ImgFactory that creates Imgs of the same kind as this one. This is useful to create Imgs for temporary storage in generic methods where the specific Img type is unknown. Note, that the factory can be used even if all references to this Img have been invalidated.
      Specified by:
      factory in interface Img<T extends NativeType<T>>
      Returns:
      a factory for Imgs of the same kind as this one.
    • copy

      public PlanarImg<T,?> copy()
      Specified by:
      copy in interface Img<T extends NativeType<T>>
      Returns:
      - A copy of the current Img instance, all pixels are duplicated
    • supportsOptimizedCursor

      public boolean supportsOptimizedCursor(Interval interval)
      Determine whether a Cursor can be created that iterates the given Interval.
      Specified by:
      supportsOptimizedCursor in interface SubIntervalIterable<T extends NativeType<T>>
      Parameters:
      interval - to be checked
      Returns:
      true if a Cursor can be optimized given the Interval
    • subIntervalIterationOrder

      public Object subIntervalIterationOrder(Interval interval)
      Returns the iteration order given the interval.
      Specified by:
      subIntervalIterationOrder in interface SubIntervalIterable<T extends NativeType<T>>
      Parameters:
      interval - Interval over which to iterate
      Returns:
      the iteration order object @see IterableRealInterval
    • cursor

      public Cursor<T> cursor(Interval interval)
      Create a Cursor to iterate over the given Interval.
      Specified by:
      cursor in interface SubIntervalIterable<T extends NativeType<T>>
      Parameters:
      interval - Interval over which to iterate
      Returns:
      Cursor
    • localizingCursor

      public Cursor<T> localizingCursor(Interval interval)
      Create a Cursor to iterate over the given Interval.
      Specified by:
      localizingCursor in interface SubIntervalIterable<T extends NativeType<T>>
      Parameters:
      interval - Interval over which to iterate
      Returns:
      Cursor