Class TiledMorphology

java.lang.Object
net.algart.matrices.morphology.TiledMorphology
All Implemented Interfaces:
ArrayProcessor, ArrayProcessorWithContextSwitching, Morphology
Direct Known Subclasses:
TiledRankMorphology

public class TiledMorphology extends Object implements Morphology

The filter allowing to transform any Morphology object to another instance of that interface, which uses some given tiler for processing the source matrix (an argument of Morphology methods).

This object is built on the base of some parent object, implementing Morphology, and some tiler (an instance of TiledApertureProcessorFactory class). This object works almost identically to the parent object with the only difference, that it uses the specified tiler for performing all operations.

More precisely, each method of this object creates an implementation p of ApertureProcessor interface. The only thing, performed by process method of that object p, is calling the same method of parent object with the arguments of p.process(dest,src) method (the source matrix is retrieved from src, the result is saved into dest). The dependence aperture p.dependenceAperture(...) is calculated automatically on the base of the patterns and the performed operation. Then, the method of this object executes the required operation with help of tiler().tile(p).process(dest,src) call — the source matrix is passed via src, the result is retrieved from dest. As a result, the same operation is performed tile-by-tile.

The methods asDilation(Matrix, Pattern) and asErosion(Matrix, Pattern) are an exception from this rule. These methods of this class works in the same way, as in ContinuedMorphology class, the continuation mode of which is equal to tiler().continuationMode().

Note: in improbable cases, when the dimensions of the source matrix and/or the sizes of the pattern are extremely large (about 263), so that the necessary appended matrices should have dimensions or total number of elements, greater than Long.MAX_VALUE, the methods of this class throw IndexOutOfBoundsException and do nothing. See comments to TiledApertureProcessorFactory class, "Restriction" section for precise details. Of course, these are very improbable cases.

This class is immutable and thread-safe: there are no ways to modify settings of the created instance.

Author:
Daniel Alievsky
  • Method Details

    • getInstance

      public static TiledMorphology getInstance(Morphology parent, TiledApertureProcessorFactory tiler)
      Returns new instance of this class with the passed parent Morphology object and the specified processing tiler.

      Note: the context of the created object is retrieved from parent.context(), and the context of the passed tiler is automatically replaced with the same one — the current tiler of the created object is tiler.context(newInstance.context()). It means that the context of the passed tiler is not important and can be null.

      Parameters:
      parent - parent object: the instance of Morphology interface that will perform all operations.
      tiler - the tiler, which will be used for processing matrices by this class.
      Returns:
      new instance of this class.
      Throws:
      NullPointerException - if parent or tiler argument is null.
    • parent

      public Morphology parent()
      Returns the parent Morphology object, passed to getInstance(Morphology, TiledApertureProcessorFactory) method.
      Returns:
      the parent Morphology object.
    • tiler

      Returns the processing tiler that will be used for tiled processing the source matrices.
      Returns:
      the tiler, which is used for tiled processing the source matrices.
      See Also:
    • context

      public ArrayContext context()
      Description copied from interface: ArrayProcessor
      Returns the current context used by this instance for all operations. This method may return null; the classes, implementing this interface, should work in this situation as while using ArrayContext.DEFAULT context.
      Specified by:
      context in interface ArrayProcessor
      Returns:
      the current context used by this instance; may be null.
    • context

      public Morphology context(ArrayContext newContext)
      Switches the context: returns an instance, identical to this one excepting that it uses the specified newContext for all operations. Usually, the returned instance is used only for performing a subtask of the full task.

      More precisely, this method is equivalent to getInstance(parent().context(newContext), tiler()).

      Specified by:
      context in interface ArrayProcessorWithContextSwitching
      Specified by:
      context in interface Morphology
      Parameters:
      newContext - another context, used by the returned instance; may be null.
      Returns:
      new instance with another context.
    • isPseudoCyclic

      public boolean isPseudoCyclic()
      Returns true, if this class works in the default pseudo-cyclic continuation mode. More precisely, returns true if and only if tiler().continuationMode() is PSEUDO_CYCLIC.
      Specified by:
      isPseudoCyclic in interface Morphology
      Returns:
      whether this class works in the pseudo-cyclic continuation mode.
    • asDilation

      public Matrix<? extends PArray> asDilation(Matrix<? extends PArray> src, Pattern pattern)
      Description copied from interface: Morphology
      Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the dilation of the source matrix by the specified pattern. See Morphology.dilation(Matrix, Pattern) method about the "dilation" term. The element type of the created matrix is the same as the element type of the source one.

      The result is usually "lazy", that means that this method finishes immediately and all actual calculations are performed while getting elements of the returned matrix. It is true for all implementations provided by this package. However, some implementations may not support lazy dilation; then this method will be equivalent to Morphology.dilation(Matrix, Pattern).

      Please note: this method does not require time (if the result is "lazy"), but the resulting matrix can work slowly! For example, reading all its content than work much slower than Morphology.dilation(Matrix, Pattern) method for complex patterns. Usually you should use it only for very little patterns, or if you know that the implementation of this interface does not provide better algorithm for non-"lazy" Morphology.dilation(Matrix, Pattern) method.

      Specified by:
      asDilation in interface Morphology
      Parameters:
      src - the source matrix.
      pattern - the pattern.
      Returns:
      the "lazy" matrix containing the dilation of the source matrix by the given pattern.
    • asErosion

      public Matrix<? extends PArray> asErosion(Matrix<? extends PArray> src, Pattern pattern)
      Description copied from interface: Morphology
      Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the erosion of the source matrix by the specified pattern. See Morphology.erosion(Matrix, Pattern) method about the "erosion" term. The element type of the created matrix is the same as the element type of the source one.

      The result is usually "lazy", that means that this method finishes immediately and all actual calculations are performed while getting elements of the returned matrix. It is true for all implementations provided by this package. However, some implementations may not support lazy erosion; then this method will be equivalent to Morphology.erosion(Matrix, Pattern).

      Please note: this method does not require time (if the result is "lazy"), but the resulting matrix can work slowly! For example, reading all its content than work much slower than Morphology.dilation(Matrix, Pattern) method for complex patterns. Usually you should use it only for very little patterns, or if you know that the implementation of this interface does not provide better algorithm for non-"lazy" Morphology.erosion(Matrix, Pattern) method.

      Specified by:
      asErosion in interface Morphology
      Parameters:
      src - the source matrix.
      pattern - the pattern.
      Returns:
      the "lazy" matrix containing the erosion of the source matrix by the given pattern.
    • dilation

      public Matrix<? extends UpdatablePArray> dilation(Matrix<? extends PArray> src, Pattern pattern)
      Description copied from interface: Morphology
      Returns a new updatable matrix, containing the dilation of the source matrix by the specified pattern.

      Usually dilation means the elementwise maximum from the set of matrices, obtained by pseudo-cyclic shifting the source matrix by the vectors, equal to all pattern points. More precisely, let mi=Matrices.asShifted(src,ip.coordinates()), where ip is the point #i from all points contained in the pattern. Then the every element of the returned matrix is the maximum from all corresponding elements of all mi matrices. The element type of the created matrix is the same as the element type of the source one. The byte and short elements are considered to be unsigned. In a case of bit elements, the maximum is equivalent to logical OR.

      The basic morphology implementation BasicMorphology strictly complies with this definition. However, other implementations of this interface may use alternate definitions of the dilation term. For example, some percentile (90% or 80%) may be used instead of strict maximum (as in objects, returned by BasicRankMorphology.getInstance(ArrayContext, double, CustomRankPrecision) method), or elements outside the matrix may be supposed to be filled according some non-trivial rules instead of pseudo-cyclic continuation (as in ContinuedMorphology objects), or only some region of the matrix may be processed, etc.

      Please see Wikipedia to know more about the dilation.

      Specified by:
      dilation in interface Morphology
      Parameters:
      src - the source matrix.
      pattern - the pattern.
      Returns:
      the result of dilation of the source matrix by the given pattern.
      See Also:
    • erosion

      public Matrix<? extends UpdatablePArray> erosion(Matrix<? extends PArray> src, Pattern pattern)
      Description copied from interface: Morphology
      Returns a new updatable matrix, containing the erosion of the source matrix by the specified pattern.

      Usually erosion means the elementwise minimum from the set of matrices, obtained by pseudo-cyclic shifting the source matrix by the vectors, symmetric to all pattern points relatively the origin of coordinates. More precisely, let mi=Matrices.asShifted(src,ip.symmetric().coordinates()), where ip is the point #i from all points contained in the pattern. Then the every element of the returned matrix is the minimum from all corresponding elements of all mi matrices. The element type of the created matrix is the same as the element type of the source one. The byte and short elements are considered to be unsigned. In a case of bit elements, the minimum is equivalent to logical AND.

      The basic morphology implementation BasicMorphology strictly complies with this definition. However, other implementations of this interface may use alternate definitions of the erosion term. For example, some percentile (10% or 20%) may be used instead of strict minimum (as in objects, returned by BasicRankMorphology.getInstance(ArrayContext, double, CustomRankPrecision) method), or elements outside the matrix may be supposed to be filled according some non-trivial rules instead of pseudo-cyclic continuation (as in ContinuedMorphology objects), or only some region of the matrix may be processed, etc.

      Please see Wikipedia to know more about the erosion.

      Specified by:
      erosion in interface Morphology
      Parameters:
      src - the source matrix.
      pattern - the pattern.
      Returns:
      the result of erosion of the source matrix by the given pattern.
      See Also:
    • weakDilation

      public Matrix<? extends UpdatablePArray> weakDilation(Matrix<? extends PArray> src, Pattern pattern)
      Description copied from interface: Morphology
      Returns a new updatable matrix, containing the weak dilation of the source matrix by the specified pattern.

      Weak dilation of the matrix A is defined as an elementwise difference B=dilation(A)-(closing(A)-A). It is obvious that, for any elements, A<=B<=dilation(A) (because both differences dilation(A)-closing(A) and closing(A)-A are non-negative).

      (In this method, the closing is supposed to be performed with the last argument Morphology.SubtractionMode.NONE.)

      Specified by:
      weakDilation in interface Morphology
      Parameters:
      src - the source matrix.
      pattern - the pattern.
      Returns:
      the result of weak dilation of the source matrix by the given pattern.
    • weakErosion

      public Matrix<? extends UpdatablePArray> weakErosion(Matrix<? extends PArray> src, Pattern pattern)
      Description copied from interface: Morphology
      Returns a new updatable matrix, containing the weak erosion of the source matrix by the specified pattern.

      Weak erosion of the matrix A is defined as an elementwise sum B=erosion(A)+(A-opening(A)). It is obvious that, for any elements, A>=B>=erosion(A) (because both differences opening(A)-erosion(A) and A-opening(A) are non-negative).

      (In this method, the opening is supposed to be performed with the last argument Morphology.SubtractionMode.NONE.)

      Specified by:
      weakErosion in interface Morphology
      Parameters:
      src - the source matrix.
      pattern - the pattern.
      Returns:
      the result of weak dilation of the source matrix by the given pattern.
    • beucherGradient

      public Matrix<? extends UpdatablePArray> beucherGradient(Matrix<? extends PArray> src, Pattern pattern)
      Description copied from interface: Morphology
      Returns a new updatable matrix, containing the Beucher gradient of the source matrix by the specified pattern, that means the elementwise difference between dilation and erosion of the source matrix with the same pattern.

      More precisely, the Beucher gradient of the matrix A is defined as an elementwise positive difference B=max(0,dilation(A)-erosion(A)).

      The element type of the created matrix is the same as the element type of the source one. The byte and short elements are considered to be unsigned.

      Specified by:
      beucherGradient in interface Morphology
      Parameters:
      src - the source matrix.
      pattern - the pattern.
      Returns:
      the Beucher gradient of the source matrix by the given pattern.
    • dilation

      public Matrix<? extends UpdatablePArray> dilation(Matrix<? extends PArray> src, Pattern pattern, Morphology.SubtractionMode subtractionMode)
      Description copied from interface: Morphology
      Extended version of Morphology.dilation(Matrix, Pattern) method: if subtractionMode argument is not Morphology.SubtractionMode.NONE, returns the difference between the dilation and the src matrix, according the specified mode.

      If subtractionMode==Morphology.SubtractionMode.NONE, this method is strictly equivalent to Morphology.dilation(Matrix, Pattern).

      The result of this operation with subtractionMode==Morphology.SubtractionMode.SUBTRACT_SRC_FROM_RESULT is also called the external gradient of the source matrix.

      Specified by:
      dilation in interface Morphology
      Parameters:
      src - the source matrix.
      pattern - the pattern.
      subtractionMode - whether the difference of the dilation and the source matrix should be returned.
      Returns:
      the result of dilation of the source matrix by the given pattern or the difference of the dilation and the source matrix.
    • erosion

      public Matrix<? extends UpdatablePArray> erosion(Matrix<? extends PArray> src, Pattern pattern, Morphology.SubtractionMode subtractionMode)
      Description copied from interface: Morphology
      Extended version of Morphology.erosion(Matrix, Pattern) method: if subtractionMode argument is not Morphology.SubtractionMode.NONE, returns the difference between the erosion and the src matrix, according the specified mode.

      If subtractionMode==Morphology.SubtractionMode.NONE, this method is strictly equivalent to Morphology.erosion(Matrix, Pattern).

      The result of this operation with subtractionMode==Morphology.SubtractionMode.SUBTRACT_RESULT_FROM_SRC is also called the internal gradient of the source matrix.

      Specified by:
      erosion in interface Morphology
      Parameters:
      src - the source matrix.
      pattern - the pattern.
      subtractionMode - whether the difference of the erosion and the source matrix should be returned.
      Returns:
      the result of erosion of the source matrix by the given pattern or the difference of the erosion and the source matrix.
    • closing

      public Matrix<? extends UpdatablePArray> closing(Matrix<? extends PArray> src, Pattern pattern, Morphology.SubtractionMode subtractionMode)
      Description copied from interface: Morphology
      Returns a new updatable matrix, containing the closing of the source matrix by the specified pattern.

      Closing means the result of sequential performing dilation and erosion of the source matrix with the same pattern.

      If subtractionMode is not Morphology.SubtractionMode.NONE, the behaviour is little other: this method returns the difference between the closing and the src matrix, according the specified mode. For example, Morphology.SubtractionMode.SUBTRACT_SRC_FROM_RESULT argument with this method allows to remove "light" background from a gray-scale image, represented by src matrix.

      This method is equivalent to dilationErosion(src, pattern, pattern, subtractionMode).

      Please see Wikipedia to know more about the closing.

      Specified by:
      closing in interface Morphology
      Parameters:
      src - the source matrix.
      pattern - the pattern.
      subtractionMode - whether the difference of the closing and the source matrix should be returned.
      Returns:
      the result of closing of the source matrix by the given pattern or the difference of the closing and the source matrix.
    • opening

      public Matrix<? extends UpdatablePArray> opening(Matrix<? extends PArray> src, Pattern pattern, Morphology.SubtractionMode subtractionMode)
      Description copied from interface: Morphology
      Returns a new updatable matrix, containing the opening of the source matrix by the specified pattern.

      Opening means the result of sequential performing erosion and dilation of the source matrix with the same pattern.

      If subtractionMode is not Morphology.SubtractionMode.NONE, the behaviour is little other: this method returns the difference between the opening and the src matrix, according the specified mode. For example, Morphology.SubtractionMode.SUBTRACT_RESULT_FROM_SRC argument with this method allows to remove "dark" background from a gray-scale image, represented by src matrix.

      This method is equivalent to erosionDilation(src, pattern, pattern, subtractionMode).

      Please see Wikipedia to know more about the opening.

      Specified by:
      opening in interface Morphology
      Parameters:
      src - the source matrix.
      pattern - the pattern.
      subtractionMode - whether the difference of the opening and the source matrix should be returned.
      Returns:
      the result of opening of the source matrix by the given pattern or the difference of the opening and the source matrix.
    • dilationErosion

      public Matrix<? extends UpdatablePArray> dilationErosion(Matrix<? extends PArray> src, Pattern ptn1, Pattern ptn2, Morphology.SubtractionMode subtractionMode)
      Description copied from interface: Morphology
      Returns a new updatable matrix, containing the result of sequential dilation(src, dilationPattern) and erosion(src, erosionPattern) of the source matrix by the specified patterns.

      If subtractionMode is not Morphology.SubtractionMode.NONE, the behaviour is little other: this method returns the difference between the result of these two operation and the src matrix, according the specified mode.

      When both patterns are equal, the result is the closing of the matrix.

      Specified by:
      dilationErosion in interface Morphology
      Parameters:
      src - the source matrix.
      ptn1 - the pattern for dilation.
      ptn2 - the pattern for erosion.
      subtractionMode - whether the difference with the source matrix should be returned.
      Returns:
      the result of sequential dilation and erosion of the source matrix by the given patterns or the difference of such result and the source matrix.
    • erosionDilation

      public Matrix<? extends UpdatablePArray> erosionDilation(Matrix<? extends PArray> src, Pattern ptn1, Pattern ptn2, Morphology.SubtractionMode subtractionMode)
      Description copied from interface: Morphology
      Returns a new updatable matrix, containing the result of sequential erosion(src, erosionPattern) and dilation(src, dilationPattern) of the source matrix by the specified patterns.

      If subtractionMode is not Morphology.SubtractionMode.NONE, the behaviour is little other: this method returns the difference between the result of these two operation and the src matrix, according the specified mode.

      When both patterns are equal, the result is the opening of the matrix.

      Specified by:
      erosionDilation in interface Morphology
      Parameters:
      src - the source matrix.
      ptn1 - the pattern for erosion.
      ptn2 - the pattern for dilation.
      subtractionMode - whether the difference with the source matrix should be returned.
      Returns:
      the result of sequential erosion and dilation of the source matrix by the given patterns or the difference of such result and the source matrix.
    • maskedDilationErosion

      public Matrix<? extends UpdatablePArray> maskedDilationErosion(Matrix<? extends PArray> src, Pattern ptn1, Pattern ptn2)
      Description copied from interface: Morphology
      Returns the elementwise minimum between the source matrix and the result of dilationErosion(src, dilationPattern, erosionPattern, Morphology.SubtractionMode.NONE) call.

      Let B is the result of this method, A is the source matrix, Q is dilationPattern, P is erosionPattern:
      B=min(A,erosion(dilation(A,Q),P))
      for any elements. It is obvious that (for any elements) A>=B>=erosion(A,P). But if Q is a some "boundary" or "carcass" of the erosion pattern P, then a stronger condition is true: A>=B>=opening(A,P).

      More precisely, there is the following theorem.

      If Q is a subset of P and the Minkowski sum P⊕Q is equal to P⊕P (see Pattern.carcass() method), then B>=opening(A,P).

      Below is the proof for the binary case. (For other element types, it's enough to consider the system of binary matrices A>=threshold for all possible real values threshold.)

      Let some point xopening(A,P). It means: there is such p1∈P, that for all p∈P we have x+p1-p∈A (the statement A). We already know, that x∈A (the case p=p1), and we also need to prove, that xerosion(dilation(A,Q),P).

      Let's suppose that it is not true. It means: there is such p2∈P, that for all q∈Q we have x+p2-q∉A (the statement B)

      Let x will be the origin of coordinates: x=0. Then, let P1=-P+p1={p1-p, p∈P}. Note: the origin 0∈P1 (the case p=p1). We have P1⊂A (statement A), so, for all q∈Q we have p2-q∉P1 (because p2-q∉A, statement B). In other words, p2∉P1⊕Q (dilation of P by Q, or Minkowski sum of P and Q). On the other hand, it's obvious that p2∈P1⊕P, because 0∈P1 and, so, P⊂P⊕P1=P1⊕P.

      There is a contradiction: according to the condition, there must be P1⊕P=P1⊕Q. The theorem is proved.

      This fact allows to interpret this method, if dilationPattern is a "boundary" of erosionPattern (usually UniformGridPattern.surface() or a similar point set), as a "weak" analog of opening. For binary images, it helps to remove small isolated objects, but (unlike usual opening) to preserve thin structures.

      Specified by:
      maskedDilationErosion in interface Morphology
      Parameters:
      src - the source matrix.
      ptn1 - the pattern for dilation.
      ptn2 - the pattern for erosion.
      Returns:
      the elementwise minimum between the source matrix and its sequential dilation and erosion by the given patterns.
    • maskedErosionDilation

      public Matrix<? extends UpdatablePArray> maskedErosionDilation(Matrix<? extends PArray> src, Pattern ptn1, Pattern ptn2)
      Description copied from interface: Morphology
      Returns the elementwise maximum between the source matrix and the result of erosionDilation(src, erosionPattern, dilationPattern, Morphology.SubtractionMode.NONE) call.

      This is an inverse method for Morphology.maskedDilationErosion(Matrix, Pattern, Pattern).

      Specified by:
      maskedErosionDilation in interface Morphology
      Parameters:
      src - the source matrix.
      ptn1 - the pattern for erosion.
      ptn2 - the pattern for dilation.
      Returns:
      the elementwise maximum between the source matrix and its sequential erosion and dilation by the given patterns.
    • dilation

      public void dilation(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, Pattern pattern, boolean disableMemoryAllocation)
      Description copied from interface: Morphology
      Equivalent to Morphology.dilation(Matrix, Pattern) method, but the result matrix will be placed in the dest argument. It allows to avoid extra memory allocation if you need to perform dilation many times from one matrix to another.

      Moreover, if disableMemoryAllocation argument is true, this method guarantees that no any additional memory will be allocated, even if it can optimize the algorithm speed. In this case, this method is always executed in one pass: it is equivalent to creating new lazy matrix by Morphology.asDilation(Matrix src, Pattern pattern) method and further copying it into dest by Matrices.copy(ArrayContext, Matrix, Matrix) method. It can be useful if you are sure that the pattern is small enough (usually 2-10 points), and allocation additional work matrices can slow down the algorithm to greater extent than using the simple one-pass algorithm.

      If the element type of the dest matrix is not the same as the source element type (dest.elementType()!=src.elementType()), the elements are automatically cast to the necessary type. More precisely, in this case the dest matrix, before all further calculations, is replaced with

       Matrices.asUpdatableFuncMatrix(true, Func.UPDATABLE_IDENTITY, src.updatableType(UpdatablePArray.class), dest)
       

      We do not recommend to pass matrices with different element types: it can slow down calculations.

      Specified by:
      dilation in interface Morphology
      Parameters:
      dest - the target matrix.
      src - the source matrix.
      pattern - the pattern.
      disableMemoryAllocation - if false, this method may allocate additional temporary matrices for optimizing the algorithm speed; if true, no any work memory will be allocated.
    • erosion

      public void erosion(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, Pattern pattern, boolean disableMemoryAllocation)
      Description copied from interface: Morphology
      Equivalent to Morphology.erosion(Matrix, Pattern) method, but the result matrix will be placed in the dest argument. It allows to avoid extra memory allocation if you need to perform erosion many times from one matrix to another.

      Moreover, if disableMemoryAllocation argument is true, this method guarantees that no any additional memory will be allocated, even if it can optimize the algorithm speed. In this case, this method is always executed in one pass: it is equivalent to creating new lazy matrix by Morphology.asDilation(Matrix src, Pattern pattern) method and further copying it into dest by Matrices.copy(ArrayContext, Matrix, Matrix) method. It can be useful if you are sure that the pattern is small enough (usually 2-10 points), and allocation additional work matrices can slow down the algorithm to greater extent than using the simple one-pass algorithm.

      If the element type of the dest matrix is not the same as the source element type (dest.elementType()!=src.elementType()), the elements are automatically cast to the necessary type. More precisely, in this case the dest matrix, before all further calculations, is replaced with

       Matrices.asUpdatableFuncMatrix(true, Func.UPDATABLE_IDENTITY, src.updatableType(UpdatablePArray.class), dest)
       

      We do not recommend to pass matrices with different element types: it can slow down calculations.

      Specified by:
      erosion in interface Morphology
      Parameters:
      dest - the target matrix.
      src - the source matrix.
      pattern - the pattern.
      disableMemoryAllocation - if false, this method may allocate additional temporary matrices for optimizing the algorithm speed; if true, no any work memory will be allocated.
    • dilation

      public void dilation(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, Pattern pattern)
      Description copied from interface: Morphology
      Specified by:
      dilation in interface Morphology
      Parameters:
      dest - the target matrix.
      src - the source matrix.
      pattern - the pattern.
    • erosion

      public void erosion(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, Pattern pattern)
      Description copied from interface: Morphology
      Specified by:
      erosion in interface Morphology
      Parameters:
      dest - the target matrix.
      src - the source matrix.
      pattern - the pattern.