Class ContinuedRankMorphology
- All Implemented Interfaces:
ArrayProcessor
,ArrayProcessorWithContextSwitching
,Morphology
,RankMorphology
The filter allowing to transform any RankMorphology
object to another instance of that interface,
which uses some non-trivial form of continuation outside the source matrix.
This object is built on the base of some parent object,
implementing RankMorphology
, and some continuation mode
.
This object works almost identically to the parent object with the only exception,
that it uses the specified continuation model instead of the default pseudo-cyclic continuation.
More precisely, all methods of this object call the corresponding methods of the parent one.
But before calling any processing method, the source matrix is appended (outside its bounds)
by some area of additional values
with help of Matrix.subMatrix(long[], long[], net.algart.arrays.Matrix.ContinuationMode)
method,
using the continuation mode of this filter
.
So, all dimensions of the appended matrix are little greater than the corresponding dimensions
of the source one, and extra elements are (virtually) filled by some values according the given continuation mode.
The size of extension along all coordinates depends on the patterns (aperture shapes) and the performed operation.
After this, the corresponding method of parent object processes the appended matrix,
and the method of this class returns the corresponding submatrix of the result, with dimensions, equal
to the dimensions of the source matrix.
The processing is little different for methods, placing the result into the first argument
percentile(Matrix, Matrix, Matrix, Pattern)
.
In these cases, the destination (updatable) matrix is (virtually) extended like the source matrix
before calculations with help of
Matrix.subMatrix(long[], long[], net.algart.arrays.Matrix.ContinuationMode)
method;
so, the calculated data are correctly stored into the original destination matrix.
The appending along all coordinates is performed in such a way, that the resulting matrix
is the same, as if the source matrix would be virtually appended until the infinity along all directions,
according the selected continuation mode
.
Note: Matrix.ContinuationMode.NONE
continuation mode cannot be used in this class:
such value of continuationMode argument of the instantiation method
ContinuedMorphology.getInstance(Morphology, Matrix.ContinuationMode)
leads
to IllegalArgumentException.
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
This class is immutable and thread-safe: there are no ways to modify settings of the created instance.
- Author:
- Daniel Alievsky
-
Nested Class Summary
Nested classes/interfaces inherited from interface net.algart.matrices.morphology.Morphology
Morphology.SubtractionMode
-
Field Summary
Fields inherited from interface net.algart.matrices.morphology.RankMorphology
FILL_MAX_VALUE, FILL_MIN_VALUE, FILL_NEAREST_VALUE
-
Method Summary
Modifier and TypeMethodDescriptionasFunctionOfPercentilePair
(Matrix<? extends PArray> src, double percentileIndex1, double percentileIndex2, Pattern pattern, Func processingFunc) Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the result of some given functionf(v, v1,v2) of the source matrix v and two percentiles v1,v2 of the source matrix by the specified pattern.asFunctionOfPercentilePair
(Matrix<? extends PArray> src, Matrix<? extends PArray> percentileIndexes1, Matrix<? extends PArray> percentileIndexes2, Pattern pattern, Func processingFunc) Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the result of some given functionf(v, v1,v2) of the source matrix v and two percentiles v1,v2 of the source matrix by the specified pattern.asFunctionOfSum
(Matrix<? extends PArray> src, Pattern pattern, Func processingFunc) Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the result of some given functionf(S) of the aperture sum S of the source matrix by the specified pattern.Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the mean of the source matrix by the specified pattern.asMeanBetweenPercentiles
(Matrix<? extends PArray> src, double fromPercentileIndex, double toPercentileIndex, Pattern pattern, double filler) Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the mean between 2 percentiles of the source matrix by the specified pattern.asMeanBetweenPercentiles
(Matrix<? extends PArray> src, Matrix<? extends PArray> fromPercentileIndexes, Matrix<? extends PArray> toPercentileIndexes, Pattern pattern, double filler) Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the mean between 2 percentiles of the source matrix by the specified pattern.asMeanBetweenValues
(Matrix<? extends PArray> src, Matrix<? extends PArray> minValues, Matrix<? extends PArray> maxValues, Pattern pattern, double filler) Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the mean between 2 values of the source matrix by the specified pattern.asPercentile
(Matrix<? extends PArray> src, double percentileIndex, Pattern pattern) Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the percentile of the source matrix by the specified pattern.asPercentile
(Matrix<? extends PArray> src, Matrix<? extends PArray> percentileIndexes, Pattern pattern) Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the percentile of the source matrix by the specified pattern.asRank
(Class<? extends T> requiredType, Matrix<? extends PArray> baseMatrix, Matrix<? extends PArray> rankedMatrix, Pattern pattern) Returns an immutable view of the passed baseMatrix matrix, such that any reading data from it calculates and returns the ranks of some given values v regarding the source matrix baseMatrix with the specified pattern.context
(ArrayContext newContext) Switches the context: returns an instance, identical to this one excepting that it uses the specified newContext for all operations.Matrix<? extends UpdatablePArray>
functionOfPercentilePair
(Matrix<? extends PArray> src, double percentileIndex1, double percentileIndex2, Pattern pattern, Func processingFunc) Returns a new updatable matrix, containing the result of some given functionf(v, v1,v2) of the source matrix v and two percentiles v1,v2 of the source matrix by the specified pattern.Matrix<? extends UpdatablePArray>
functionOfPercentilePair
(Matrix<? extends PArray> src, Matrix<? extends PArray> percentileIndexes1, Matrix<? extends PArray> percentileIndexes2, Pattern pattern, Func processingFunc) Returns a new updatable matrix, containing the result of some given functionf(v, v1,v2) of the source matrix v and two percentiles v1,v2 of the source matrix by the specified pattern.void
functionOfPercentilePair
(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, double percentileIndex1, double percentileIndex2, Pattern pattern, Func processingFunc) Equivalent toRankMorphology.functionOfPercentilePair(Matrix, double, double, Pattern, Func)
method, but the result matrix will be placed in the dest argument.void
functionOfPercentilePair
(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, Matrix<? extends PArray> percentileIndexes1, Matrix<? extends PArray> percentileIndexes2, Pattern pattern, Func processingFunc) Equivalent toRankMorphology.functionOfPercentilePair(Matrix, Matrix, Matrix, Pattern, Func)
method, but the result matrix will be placed in the dest argument.Matrix<? extends UpdatablePArray>
functionOfSum
(Matrix<? extends PArray> src, Pattern pattern, Func processingFunc) Returns a new updatable matrix, containing the result of some given functionf(S) of the aperture sum S of the source matrix by the specified pattern.void
functionOfSum
(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, Pattern pattern, Func processingFunc) Equivalent toRankMorphology.functionOfSum(Matrix, Pattern, Func)
method, but the result matrix will be placed in the dest argument.static ContinuedRankMorphology
getInstance
(RankMorphology parent, Matrix.ContinuationMode continuationMode) Returns new instance of this class with the passed parentRankMorphology
object and the specified continuation mode.Matrix<? extends UpdatablePArray>
Returns a new updatable matrix, containing the mean of the source matrix by the specified pattern.void
Equivalent toRankMorphology.mean(Matrix, Pattern)
method, but the result matrix will be placed in the dest argument.Matrix<? extends UpdatablePArray>
meanBetweenPercentiles
(Matrix<? extends PArray> src, double fromPercentileIndex, double toPercentileIndex, Pattern pattern, double filler) Returns a new updatable matrix, containing the mean between 2 percentiles of the source matrix by the specified pattern.Matrix<? extends UpdatablePArray>
meanBetweenPercentiles
(Matrix<? extends PArray> src, Matrix<? extends PArray> fromPercentileIndexes, Matrix<? extends PArray> toPercentileIndexes, Pattern pattern, double filler) Returns a new updatable matrix, containing the mean between 2 percentiles of the source matrix by the specified pattern.void
meanBetweenPercentiles
(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, double fromPercentileIndex, double toPercentileIndex, Pattern pattern, double filler) Equivalent toRankMorphology.meanBetweenPercentiles(Matrix, double, double, Pattern, double)
method, but the result matrix will be placed in the dest argument.void
meanBetweenPercentiles
(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, Matrix<? extends PArray> fromPercentileIndexes, Matrix<? extends PArray> toPercentileIndexes, Pattern pattern, double filler) Equivalent toRankMorphology.meanBetweenPercentiles(Matrix, Matrix, Matrix, Pattern, double)
method, but the result matrix will be placed in the dest argument.Matrix<? extends UpdatablePArray>
meanBetweenValues
(Matrix<? extends PArray> src, Matrix<? extends PArray> minValues, Matrix<? extends PArray> maxValues, Pattern pattern, double filler) Returns a new updatable matrix, containing the mean between 2 values of the source matrix by the specified pattern.void
meanBetweenValues
(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, Matrix<? extends PArray> minValues, Matrix<? extends PArray> maxValues, Pattern pattern, double filler) Equivalent toRankMorphology.meanBetweenValues(Matrix, Matrix, Matrix, Pattern, double)
method, but the result matrix will be placed in the dest argument.parent()
Returns the parentRankMorphology
object, passed togetInstance(RankMorphology, Matrix.ContinuationMode)
method.Matrix<? extends UpdatablePArray>
percentile
(Matrix<? extends PArray> src, double percentileIndex, Pattern pattern) Returns a new updatable matrix, containing the percentile of the source matrix by the specified pattern.Matrix<? extends UpdatablePArray>
percentile
(Matrix<? extends PArray> src, Matrix<? extends PArray> percentileIndexes, Pattern pattern) Returns a new updatable matrix, containing the percentile of the source matrix by the specified pattern.void
percentile
(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, double percentileIndex, Pattern pattern) Equivalent toRankMorphology.percentile(Matrix, double, Pattern)
method, but the result matrix will be placed in the dest argument.void
percentile
(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, Matrix<? extends PArray> percentileIndexes, Pattern pattern) Equivalent toRankMorphology.percentile(Matrix, Matrix, Pattern)
method, but the result matrix will be placed in the dest argument.rank
(Class<? extends T> requiredType, Matrix<? extends PArray> baseMatrix, Matrix<? extends PArray> rankedMatrix, Pattern pattern) Returns a new updatable matrix, containing the rank of some given values v regarding the source matrix baseMatrix with the specified pattern.void
rank
(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> baseMatrix, Matrix<? extends PArray> rankedMatrix, Pattern pattern) Equivalent toRankMorphology.rank(Class, Matrix, Matrix, Pattern)
method, but the result matrix will be placed in the dest argument and the required type will be chosen automatically asdest. .type
(PArray.class)Methods inherited from class net.algart.matrices.morphology.ContinuedMorphology
asDilation, asErosion, beucherGradient, closing, context, continuationMode, dilation, dilation, dilation, dilation, dilationErosion, erosion, erosion, erosion, erosion, erosionDilation, getInstance, isPseudoCyclic, maskedDilationErosion, maskedErosionDilation, opening, weakDilation, weakErosion
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface net.algart.arrays.ArrayProcessor
context
Methods inherited from interface net.algart.matrices.morphology.Morphology
asDilation, asErosion, beucherGradient, closing, dilation, dilation, dilation, dilation, dilationErosion, erosion, erosion, erosion, erosion, erosionDilation, isPseudoCyclic, maskedDilationErosion, maskedErosionDilation, opening, weakDilation, weakErosion
-
Method Details
-
getInstance
public static ContinuedRankMorphology getInstance(RankMorphology parent, Matrix.ContinuationMode continuationMode) Returns new instance of this class with the passed parentRankMorphology
object and the specified continuation mode. See comments toMatrix.ContinuationMode
class for more information about possible continuations.- Parameters:
parent
- the instance ofRankMorphology
interface that will perform all operations.continuationMode
- the mode of continuation outside the source matrix.- Returns:
- new instance of this class.
- Throws:
NullPointerException
- if parent or continuationMode argument is null.IllegalArgumentException
- if continuationMode==Matrix.ContinuationMode.NONE
.- See Also:
-
parent
Returns the parentRankMorphology
object, passed togetInstance(RankMorphology, Matrix.ContinuationMode)
method.- Overrides:
parent
in classContinuedMorphology
- Returns:
- the parent
RankMorphology
object.
-
context
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 asubtask
of the full task.- Specified by:
context
in interfaceArrayProcessorWithContextSwitching
- Specified by:
context
in interfaceMorphology
- Specified by:
context
in interfaceRankMorphology
- Overrides:
context
in classContinuedMorphology
- Parameters:
newContext
- another context, used by the returned instance; may be null.- Returns:
- new instance with another newContext.
-
asPercentile
public Matrix<? extends PArray> asPercentile(Matrix<? extends PArray> src, Matrix<? extends PArray> percentileIndexes, Pattern pattern) Description copied from interface:RankMorphology
Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the percentile of the source matrix by the specified pattern. See thecomments to this class
, section 4 about the "percentile" term. The real index r of the percentile for every element of the result is equal to the corresponding element of percentileIndexes matrix. Theelement type
of the created matrix is the same as the element type of the source one.If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real percentile
v(r)/σ , defined in the comments to this class. In this case, this method, instead of the real valuev(r)/σ , returns an integerw/σ , where w is:- either the integer result of
, if this object works in the simple histogram model (where b is the histogram, corresponding to every aperture position),Histogram.iValue
(b, (long)Math.floor(r)) - or the integer result of
, if it works in the precise histogram model.Histogram.iPreciseValue
(b, r)
1/σ is a positive integer number, andw/σ=w*2β−μ ,β = src. , μ is the binary logarithm of the histogram length M — see thearray()
.bitsPerElement()
comments to this class
, section 3. So, if μ is chosen less than the precision of this matrix β (8 for byte, 16 for short, etc.), thenβ−μ lowest bits in the result will be always zero. ForBasicRankMorphology
object, μ is chosen whileinstantiating this object
asmin(bitLevels[bitLevels.length-1], β) .- Specified by:
asPercentile
in interfaceRankMorphology
- Parameters:
src
- the source matrix.percentileIndexes
- the matrix containing r argument: the indexes of the percentile for every element of the result.pattern
- the pattern: the shape of the aperture.- Returns:
- the "lazy" matrix containing the percentile of the source matrix.
- See Also:
- either the integer result of
-
asPercentile
public Matrix<? extends PArray> asPercentile(Matrix<? extends PArray> src, double percentileIndex, Pattern pattern) Description copied from interface:RankMorphology
Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the percentile of the source matrix by the specified pattern. See thecomments to this class
, section 4 about the "percentile" term. The real index r of the percentile is equal to percentileIndex argument for all aperture positions. Theelement type
of the created matrix is the same as the element type of the source one.This method is equivalent to
asPercentile
(src, src.matrix(Arrays.nDoubleCopies
(src.size(), percentileIndex), pattern)If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real percentile
v(r)/σ , defined in the comments to this class. In this case, this method, instead of the real valuev(r)/σ , returns an integerw/σ , where w is:- either the integer result of
, if this object works in the simple histogram model (where b is the histogram, corresponding to every aperture position),Histogram.iValue
(b, (long)Math.floor(r)) - or the integer result of
, if it works in the precise histogram model.Histogram.iPreciseValue
(b, r)
1/σ is a positive integer number, andw/σ=w*2β−μ ,β = src. , μ is the binary logarithm of the histogram length M — see thearray()
.bitsPerElement()
comments to this class
, section 3. So, if μ is chosen less than the precision of this matrix β (8 for byte, 16 for short, etc.), thenβ−μ lowest bits in the result will be always zero. ForBasicRankMorphology
object, μ is chosen whileinstantiating this object
asmin(bitLevels[bitLevels.length-1], β) .- Specified by:
asPercentile
in interfaceRankMorphology
- Parameters:
src
- the source matrix.percentileIndex
- r argument of the percentile.pattern
- the pattern: the shape of the aperture.- Returns:
- the "lazy" matrix containing the percentile of the source matrix.
- See Also:
- either the integer result of
-
asRank
public <T extends PArray> Matrix<T> asRank(Class<? extends T> requiredType, Matrix<? extends PArray> baseMatrix, Matrix<? extends PArray> rankedMatrix, Pattern pattern) Description copied from interface:RankMorphology
Returns an immutable view of the passed baseMatrix matrix, such that any reading data from it calculates and returns the ranks of some given values v regarding the source matrix baseMatrix with the specified pattern. See thecomments to this class
, section 4 about the "rank" term. The real value v for every element of the result is equal to the corresponding element of rankedMatrix matrix.The matrix, returned by this method, is immutable, and the class of its built-in array implements one of the basic interfaces
BitArray
,CharArray
,ByteArray
,ShortArray
,IntArray
,LongArray
,FloatArray
orDoubleArray
. The class of desired interface (one of 8 possible classes) must be passed as requiredType argument. So, it defines the element type of the returned matrix. The rules of casting the floating-point ranks to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.The element types of baseMatrix and rankedMatrix are usually equal. If they are different (
baseMatrix. ), this method replaces rankedMatrix withelementType()
!=rankedMatrix.elementType()
Matrices.asFuncMatrix
(true,Func.IDENTITY
, baseMatrix.array().type()
, rankedMatrix)before all other calculations. In other words, this method always casts the type of the ranked elements to the type of baseMatrix elements. As a result, we can be sure, that if the source baseMatrix matrix is fixed-point (boolean, char, byte, short, int or long elements), then the rank
r(v*σ) , according to the definition of the "rank" term, will be an integer number. In this case, you can specify requiredType=IntArray.class and get the precise rank without precision loss. Moreover, if you know that the number of points in the pattern (pattern. ) is less thanpointCount()
216=65536 or28=256 , it is enough to specify correspondingly requiredType=ShortArray.class or ByteArray.class.- Specified by:
asRank
in interfaceRankMorphology
- Parameters:
requiredType
- the desired type of the built-in array in the returned matrix.baseMatrix
- the source matrix.rankedMatrix
- the matrix containing v argument: the values, the rank of which should be calculated.pattern
- the pattern: the shape of the aperture.- Returns:
- the "lazy" matrix containing the rank of the given values.
- See Also:
-
asMeanBetweenPercentiles
public Matrix<? extends PArray> asMeanBetweenPercentiles(Matrix<? extends PArray> src, Matrix<? extends PArray> fromPercentileIndexes, Matrix<? extends PArray> toPercentileIndexes, Pattern pattern, double filler) Description copied from interface:RankMorphology
Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the mean between 2 percentiles of the source matrix by the specified pattern. See thecomments to this class
, section 4 about the "mean between 2 percentiles" term. The real indexes r1 and r2 of the percentiles for every element of the result are equal to the corresponding elements of fromPercentileIndexes and toPercentileIndexes matrices. The reserved value filler is specified by the last argument of this method. Theelement type
of the created matrix is the same as the element type of the source one.If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real mean, defined in the comments to this class. In this case, the found mean value m is usually truncated to its integer part
⌊m⌋=(long)m (remember that the mean value, according to our definition, is always ≥0). More precisely, the rules of casting the floating-point means to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.- Specified by:
asMeanBetweenPercentiles
in interfaceRankMorphology
- Parameters:
src
- the source matrix.fromPercentileIndexes
- the matrix containing r1 argument: the indexes of the less percentile of the averaged range for every element of the result.toPercentileIndexes
- the matrix containing r2 argument: the indexes of the greater percentile of the averaged range for every element of the result.pattern
- the pattern: the shape of the aperture.filler
- the reserved value, returned whenr1≥r2 .- Returns:
- the "lazy" matrix containing the mean between 2 given percentiles of the source matrix.
- See Also:
-
asMeanBetweenPercentiles
public Matrix<? extends PArray> asMeanBetweenPercentiles(Matrix<? extends PArray> src, double fromPercentileIndex, double toPercentileIndex, Pattern pattern, double filler) Description copied from interface:RankMorphology
Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the mean between 2 percentiles of the source matrix by the specified pattern. See thecomments to this class
, section 4 about the "mean between 2 percentiles" term. The real indexes r1 and r2 of the percentiles for every element of the result are equal to fromPercentileIndex and toPercentileIndex arguments for all aperture positions. The reserved value filler is specified by the last argument of this method. Theelement type
of the created matrix is the same as the element type of the source one.This method is equivalent to
asMeanBetweenPercentiles
(src, src.matrix(Arrays.nDoubleCopies
(src.size(), fromPercentileIndex), src.matrix(Arrays.nDoubleCopies
(src.size(), toPercentileIndex), pattern, filler)If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real mean, defined in the comments to this class. In this case, the found mean value m is usually truncated to its integer part
⌊m⌋=(long)m (remember that the mean value, according to our definition, is always ≥0). More precisely, the rules of casting the floating-point means to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.- Specified by:
asMeanBetweenPercentiles
in interfaceRankMorphology
- Parameters:
src
- the source matrix.fromPercentileIndex
- r1 argument: the index of the less percentile of the averaged range for every element of the result.toPercentileIndex
- r2 argument: the indexes of the greater percentile of the averaged range for every element of the result.pattern
- the pattern: the shape of the aperture.filler
- the reserved value, returned whenr1≥r2 .- Returns:
- the "lazy" matrix containing the mean between 2 given percentiles of the source matrix.
- See Also:
-
asMeanBetweenValues
public Matrix<? extends PArray> asMeanBetweenValues(Matrix<? extends PArray> src, Matrix<? extends PArray> minValues, Matrix<? extends PArray> maxValues, Pattern pattern, double filler) Description copied from interface:RankMorphology
Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the mean between 2 values of the source matrix by the specified pattern. See thecomments to this class
, section 4 about the "mean between 2 values" term. The real numbers v1 and v2 for every element of the result are equal to the corresponding elements of minValues and maxValues matrices. The reserved value filler and the mode of calculation (for the caser(v1*σ)≥r(v2*σ) ) are specified by the last filler argument of this method:- if filler argument is
RankMorphology.FILL_MIN_VALUE
(Double.NEGATIVE_INFINITY), the mode B is used; - if filler argument is
RankMorphology.FILL_MAX_VALUE
(Double.POSITIVE_INFINITY), the mode C is used; - if filler argument is
RankMorphology.FILL_NEAREST_VALUE
(Double.NaN), the mode D is used; - if filler argument contains any other value, the mode A is used and this argument specifies the reserved value filler.
element type
of the created matrix is the same as the element type of the source one.If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real mean, defined in the comments to this class. In this case, the found mean value m is usually truncated to its integer part
⌊m⌋=(long)m (remember that the mean value, according to our definition, is always ≥0). More precisely, the rules of casting the floating-point means to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.- Specified by:
asMeanBetweenValues
in interfaceRankMorphology
- Parameters:
src
- the source matrix.minValues
- the matrix containing v1 argument: the low bound of the averaged range of values for every element of the result.maxValues
- the matrix containing v2 argument: the high bound of the averaged range of values for every element of the result.pattern
- the pattern: the shape of the aperture.filler
- the reserved value, returned whenr(v1*σ)≥r(v2*σ) , or one of the special keysRankMorphology.FILL_MIN_VALUE
,RankMorphology.FILL_MAX_VALUE
,RankMorphology.FILL_NEAREST_VALUE
, which mean using of special calculation modes B, C, D.- Returns:
- the "lazy" matrix containing the mean between 2 given values of the source matrix.
- See Also:
- if filler argument is
-
asMean
Description copied from interface:RankMorphology
Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the mean of the source matrix by the specified pattern.More precisely, this method is equivalent to
, where the function meanFunc is:asFunctionOfSum
(src, pattern, meanFunc)LinearFunc.getInstance
(0.0, 1.0/N),N = pattern. , if the source matrix is floating-point (pointCount()
src. is float or double) — in other words, this method calculates the usual mean of all elements in the aperture:elementType()
(v0+v1+...+vN−1) / N ;LinearFunc.getInstance
(0.5, 1.0/N),N = pattern. , if the source matrix is fixed-point (pointCount()
src. is boolean, char, byte, short, int or long) — in other words, this method calculates the mean of all elements in the aperture plus 0.5:elementType()
(v0+v1+...+vN−1) / N + 0.5.
If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real mean, defined above. In this case, the found mean value m is usually truncated to its integer part
⌊m⌋=(long)m (remember that the mean value, according to our definition, is always ≥0). More precisely, the rules of casting the floating-point means to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.The described rounding rule explains, why we add 0.5 to the mean in the case of a fixed-point source elements. Namely, in this case the combination of adding 0.5 and further truncation to the integer part works as rounding to the nearest integer:
⌊m+0.5⌋=Math.round(m) (excepting some rare cases when the real mean m is a strictly half-integer:m=2k+½ , k∈Z). In other words, this behaviour provides the maximal possible precision of the returned integer mean.Note: the behaviour of this method is similar to
asMeanBetweenPercentiles
(src, 0, N, pattern, anyFiller), whereN = pattern. , if the histogram is processed in the simple histogram model (seepointCount()
comments to SummingHistogram class
). Really, in this case the mean between 2 percentiles is equal to(S(r2)−S(r1)) / ((r2−r1)*σ) = S(N) / (N*σ) = (Σ 0≤j<M(j+0.5)*b[j]) / (N*σ)
In the simplest case, when the source elements are real numbers in the "standard" allowed range
0.0..1.0 , we haveσ = M (the histogram length),ai = ⌊vi*M⌋ , and this expression is equal to(Σ 0≤i<N(ai+0.5)) / (NM) = (v'0+v'1+...+v'N−1) / N + 0.5 / M ≈ (v0+v1+...+vN−1) / N
where
v'i = ai/M is an attempt to represent the real number vi with the given precision μ=log2M bits and a correction0.5/M is very little for large M.In another simplest case, when the source elements are integer numbers, σ=1 and the elements vi are non-negative integers, we have
ai = vi , and this expression is equal to(Σ 0≤i<N(vi+0.5)) / N = (v0+v1+...+vN−1) / N + 0.5
- Specified by:
asMean
in interfaceRankMorphology
- Parameters:
src
- the source matrix.pattern
- the pattern: the shape of the aperture.- Returns:
- the "lazy" matrix containing the mean of the source matrix.
- See Also:
-
asFunctionOfSum
public Matrix<? extends PArray> asFunctionOfSum(Matrix<? extends PArray> src, Pattern pattern, Func processingFunc) Description copied from interface:RankMorphology
Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the result of some given functionf(S) of the aperture sum S of the source matrix by the specified pattern. See thecomments to this class
, section 4 about the "aperture sum" term. Theelement type
of the created matrix is the same as the element type of the source one.The function, applied to each calculated aperture sum S, is specified via processingFunc argument. Namely, for each aperture position this method calculates the aperture sum S of the source matrix and returns
processingFunc. in the corresponding element of the resulting matrix.get
(S)If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real function result. In this case, the found function result f is usually truncated to its integer part
(long)f . More precisely, the rules of casting the floating-point function results to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.This method can be considered as a generalization of
RankMorphology.asMean(Matrix, Pattern)
.- Specified by:
asFunctionOfSum
in interfaceRankMorphology
- Parameters:
src
- the source matrix.pattern
- the pattern: the shape of the aperture.processingFunc
- the function, which should be applied to every calculated aperture sum.- Returns:
- the "lazy" matrix containing the result of the given function for the aperture sum of the source matrix.
- See Also:
-
asFunctionOfPercentilePair
public Matrix<? extends PArray> asFunctionOfPercentilePair(Matrix<? extends PArray> src, Matrix<? extends PArray> percentileIndexes1, Matrix<? extends PArray> percentileIndexes2, Pattern pattern, Func processingFunc) Description copied from interface:RankMorphology
Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the result of some given functionf(v, v1,v2) of the source matrix v and two percentiles v1,v2 of the source matrix by the specified pattern. See thecomments to this class
, section 4 about the "percentile" term. The real indexes r of two percentiles for every element of the result are equal to the corresponding elements of percentileIndexes1 (for v1) or percentileIndexes2 matrix (for v2). Theelement type
of the created matrix is the same as the element type of the source one.The function, applied to each calculated three
(v,v1,v2) , is specified via processingFunc argument. Namely, for each aperture position x this method takes the value v — the element of the source matrix src at this aperture position x, calculates two percentiles v1 and v2 of the source matrix and returnsprocessingFunc. in the corresponding element of the resulting matrix.get
(v,v1,v2)If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real function result. In this case, the found function result f is usually truncated to its integer part
(long)f . More precisely, the rules of casting the floating-point function results to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.You can get the same results by 2 calls of
RankMorphology.asPercentile(Matrix, Matrix, Pattern)
method for both matrices of percentile indexes and applying the function to them and to the source matrix via method. But such a way works slower and is less convenient, than this method. A typical application of this method in image processing area is the contrasting image — in this case, we recommend usingMatrices.asFuncMatrix(Func, Class, Matrix, Matrix, Matrix)
ContrastingFunc
object as processingFunc argument.- Specified by:
asFunctionOfPercentilePair
in interfaceRankMorphology
- Parameters:
src
- the source matrix.percentileIndexes1
- the 1st matrix containing r argument: the indexes of the 1st percentile v1 for every element of the result.percentileIndexes2
- the 2nd matrix containing r argument: the indexes of the 2nd percentile v2 for every element of the result.pattern
- the pattern: the shape of the aperture.processingFunc
- the function, which should be applied to every calculated three(v,v1,v2) , where v is the element of the source matrix, v1 and v2 are the corresponding percentiles.- Returns:
- the "lazy" matrix containing the result of the given function.
- See Also:
-
asFunctionOfPercentilePair
public Matrix<? extends PArray> asFunctionOfPercentilePair(Matrix<? extends PArray> src, double percentileIndex1, double percentileIndex2, Pattern pattern, Func processingFunc) Description copied from interface:RankMorphology
Returns an immutable view of the passed source matrix, such that any reading data from it calculates and returns the result of some given functionf(v, v1,v2) of the source matrix v and two percentiles v1,v2 of the source matrix by the specified pattern. See thecomments to this class
, section 4 about the "percentile" term. The real indexes r of two percentiles for every element of the result are equal to percentileIndex1 (for v1) or percentileIndex2 argument (for v2). Theelement type
of the created matrix is the same as the element type of the source one.This method is equivalent to
asFunctionOfPercentilePair
(src, src.matrix(Arrays.nDoubleCopies
(src.size(), percentileIndex1), src.matrix(Arrays.nDoubleCopies
(src.size(), percentileIndex1), pattern, processingFunc)If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real function result. In this case, the found function result f is usually truncated to its integer part
(long)f . More precisely, the rules of casting the floating-point function results to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.You can get the same results by 2 calls of
RankMorphology.asPercentile(Matrix, double, Pattern)
method for both matrices of percentile indexes and applying the function to them and to the source matrix via method. But such a way works slower and is less convenient, than this method. A typical application of this method in image processing area is the contrasting image — in this case, we recommend usingMatrices.asFuncMatrix(Func, Class, Matrix, Matrix, Matrix)
ContrastingFunc
object as processingFunc argument.- Specified by:
asFunctionOfPercentilePair
in interfaceRankMorphology
- Parameters:
src
- the source matrix.percentileIndex1
- the 1st r argument: the index of the 1st percentile v1.percentileIndex2
- the 2nd r argument: the index of the 2nd percentile v2.pattern
- the pattern: the shape of the aperture.processingFunc
- the function, which should be applied to every calculated three(v,v1,v2) , where v is the element of the source matrix, v1 and v2 are the corresponding percentiles.- Returns:
- the "lazy" matrix containing the result of the given function.
- See Also:
-
percentile
public Matrix<? extends UpdatablePArray> percentile(Matrix<? extends PArray> src, Matrix<? extends PArray> percentileIndexes, Pattern pattern) Description copied from interface:RankMorphology
Returns a new updatable matrix, containing the percentile of the source matrix by the specified pattern. See thecomments to this class
, section 4 about the "percentile" term. The real index r of the percentile for every element of the result is equal to the corresponding element of percentileIndexes matrix. Theelement type
of the created matrix is the same as the element type of the source one.If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real percentile
v(r)/σ , defined in the comments to this class. In this case, this method, instead of the real valuev(r)/σ , returns an integerw/σ , where w is:- either the integer result of
, if this object works in the simple histogram model (where b is the histogram, corresponding to every aperture position),Histogram.iValue
(b, (long)Math.floor(r)) - or the integer result of
, if it works in the precise histogram model.Histogram.iPreciseValue
(b, r)
1/σ is a positive integer number, andw/σ=w*2β−μ ,β = src. , μ is the binary logarithm of the histogram length M — see thearray()
.bitsPerElement()
comments to this class
, section 3. So, if μ is chosen less than the precision of this matrix β (8 for byte, 16 for short, etc.), thenβ−μ lowest bits in the result will be always zero. ForBasicRankMorphology
object, μ is chosen whileinstantiating this object
asmin(bitLevels[bitLevels.length-1], β) .- Specified by:
percentile
in interfaceRankMorphology
- Parameters:
src
- the source matrix.percentileIndexes
- the matrix containing r argument: the indexes of the percentile for every element of the result.pattern
- the pattern: the shape of the aperture.- Returns:
- the percentile of the source matrix.
- See Also:
- either the integer result of
-
percentile
public Matrix<? extends UpdatablePArray> percentile(Matrix<? extends PArray> src, double percentileIndex, Pattern pattern) Description copied from interface:RankMorphology
Returns a new updatable matrix, containing the percentile of the source matrix by the specified pattern. See thecomments to this class
, section 4 about the "percentile" term. The real index r of the percentile is equal to percentileIndex argument for all aperture positions. Theelement type
of the created matrix is the same as the element type of the source one.This method is equivalent to
percentile
(src, src.matrix(Arrays.nDoubleCopies
(src.size(), percentileIndex), pattern)If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real percentile
v(r)/σ , defined in the comments to this class. In this case, this method, instead of the real valuev(r)/σ , returns an integerw/σ , where w is:- either the integer result of
, if this object works in the simple histogram model (where b is the histogram, corresponding to every aperture position),Histogram.iValue
(b, (long)Math.floor(r)) - or the integer result of
, if it works in the precise histogram model.Histogram.iPreciseValue
(b, r)
1/σ is a positive integer number, andw/σ=w*2β−μ ,β = src. , μ is the binary logarithm of the histogram length M — see thearray()
.bitsPerElement()
comments to this class
, section 3. So, if μ is chosen less than the precision of this matrix β (8 for byte, 16 for short, etc.), thenβ−μ lowest bits in the result will be always zero. ForBasicRankMorphology
object, μ is chosen whileinstantiating this object
asmin(bitLevels[bitLevels.length-1], β) .- Specified by:
percentile
in interfaceRankMorphology
- Parameters:
src
- the source matrix.percentileIndex
- r argument of the percentile.pattern
- the pattern: the shape of the aperture.- Returns:
- the percentile of the source matrix.
- See Also:
- either the integer result of
-
rank
public <T extends PArray> Matrix<? extends T> rank(Class<? extends T> requiredType, Matrix<? extends PArray> baseMatrix, Matrix<? extends PArray> rankedMatrix, Pattern pattern) Description copied from interface:RankMorphology
Returns a new updatable matrix, containing the rank of some given values v regarding the source matrix baseMatrix with the specified pattern. See thecomments to this class
, section 4 about the "rank" term. The real value v for every element of the result is equal to the corresponding element of rankedMatrix matrix.The matrix, returned by this method, is updatable, and the class of its built-in array implements one of the basic interfaces
UpdatableBitArray
,UpdatableCharArray
,UpdatableByteArray
,UpdatableShortArray
,UpdatableIntArray
,UpdatableLongArray
,UpdatableFloatArray
orUpdatableDoubleArray
. The class of desired interface (one of 8 possible classes) must be passed as requiredType argument. So, it defines the element type of the returned matrix. Instead of these classes, you can also pass one of corresponding immutable interfacesBitArray
,CharArray
,ByteArray
,ShortArray
,IntArray
,LongArray
,FloatArray
orDoubleArray
: the result will be the same. The rules of casting the floating-point ranks to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.The element types of baseMatrix and rankedMatrix are usually equal. If they are different (
baseMatrix. ), this method replaces rankedMatrix withelementType()
!=rankedMatrix.elementType()
Matrices.asFuncMatrix
(true,Func.IDENTITY
, baseMatrix.array().type()
, rankedMatrix)before all other calculations. In other words, this method always casts the type of the ranked elements to the type of baseMatrix elements. As a result, we can be sure, that if the source baseMatrix matrix is fixed-point (boolean, char, byte, short, int or long elements), then the rank
r(v*σ) , according to the definition of the "rank" term, will be an integer number. In this case, you can specify requiredType=IntArray.class and get the precise rank without precision loss. Moreover, if you know that the number of points in the pattern (pattern. ) is less thanpointCount()
216=65536 or28=256 , it is enough to specify correspondingly requiredType=ShortArray.class or ByteArray.class. The less result precision allows you to save memory.- Specified by:
rank
in interfaceRankMorphology
- Parameters:
requiredType
- the desired type of the built-in array in the returned matrix.baseMatrix
- the source matrix.rankedMatrix
- the matrix containing v argument: the values, the rank of which should be calculated.pattern
- the pattern: the shape of the aperture.- Returns:
- the rank of the given values.
- See Also:
-
meanBetweenPercentiles
public Matrix<? extends UpdatablePArray> meanBetweenPercentiles(Matrix<? extends PArray> src, Matrix<? extends PArray> fromPercentileIndexes, Matrix<? extends PArray> toPercentileIndexes, Pattern pattern, double filler) Description copied from interface:RankMorphology
Returns a new updatable matrix, containing the mean between 2 percentiles of the source matrix by the specified pattern. See thecomments to this class
, section 4 about the "mean between 2 percentiles" term. The real indexes r1 and r2 of the percentiles for every element of the result are equal to the corresponding elements of fromPercentileIndexes and toPercentileIndexes matrices. The reserved value filler is specified by the last argument of this method. Theelement type
of the created matrix is the same as the element type of the source one.If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real mean, defined in the comments to this class. In this case, the found mean value m is usually truncated to its integer part
⌊m⌋=(long)m (remember that the mean value, according to our definition, is always ≥0). More precisely, the rules of casting the floating-point means to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.- Specified by:
meanBetweenPercentiles
in interfaceRankMorphology
- Parameters:
src
- the source matrix.fromPercentileIndexes
- the matrix containing r1 argument: the indexes of the less percentile of the averaged range for every element of the result.toPercentileIndexes
- the matrix containing r2 argument: the indexes of the greater percentile of the averaged range for every element of the result.pattern
- the pattern: the shape of the aperture.filler
- the reserved value, returned whenr1≥r2 .- Returns:
- the mean between 2 given percentiles of the source matrix.
- See Also:
-
meanBetweenPercentiles
public Matrix<? extends UpdatablePArray> meanBetweenPercentiles(Matrix<? extends PArray> src, double fromPercentileIndex, double toPercentileIndex, Pattern pattern, double filler) Description copied from interface:RankMorphology
Returns a new updatable matrix, containing the mean between 2 percentiles of the source matrix by the specified pattern. See thecomments to this class
, section 4 about the "mean between 2 percentiles" term. The real indexes r1 and r2 of the percentiles for every element of the result are equal to fromPercentileIndex and toPercentileIndex arguments for all aperture positions. The reserved value filler is specified by the last argument of this method. Theelement type
of the created matrix is the same as the element type of the source one.This method is equivalent to
meanBetweenPercentiles
(src, src.matrix(Arrays.nDoubleCopies
(src.size(), fromPercentileIndex), src.matrix(Arrays.nDoubleCopies
(src.size(), toPercentileIndex), pattern, filler)If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real mean, defined in the comments to this class. In this case, the found mean value m is usually truncated to its integer part
⌊m⌋=(long)m (remember that the mean value, according to our definition, is always ≥0). More precisely, the rules of casting the floating-point means to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.- Specified by:
meanBetweenPercentiles
in interfaceRankMorphology
- Parameters:
src
- the source matrix.fromPercentileIndex
- r1 argument: the index of the less percentile of the averaged range for every element of the result.toPercentileIndex
- r2 argument: the indexes of the greater percentile of the averaged range for every element of the result.pattern
- the pattern: the shape of the aperture.filler
- the reserved value, returned whenr1≥r2 .- Returns:
- the mean between 2 given percentiles of the source matrix.
- See Also:
-
meanBetweenValues
public Matrix<? extends UpdatablePArray> meanBetweenValues(Matrix<? extends PArray> src, Matrix<? extends PArray> minValues, Matrix<? extends PArray> maxValues, Pattern pattern, double filler) Description copied from interface:RankMorphology
Returns a new updatable matrix, containing the mean between 2 values of the source matrix by the specified pattern. See thecomments to this class
, section 4 about the "mean between 2 values" term. The real numbers v1 and v2 for every element of the result are equal to the corresponding elements of minValues and maxValues matrices. The reserved value filler and the mode of calculation (for the caser(v1*σ)≥r(v2*σ) ) are specified by the last filler argument of this method:- if filler argument is
RankMorphology.FILL_MIN_VALUE
(Double.NEGATIVE_INFINITY), the mode B is used; - if filler argument is
RankMorphology.FILL_MAX_VALUE
(Double.POSITIVE_INFINITY), the mode C is used; - if filler argument is
RankMorphology.FILL_NEAREST_VALUE
(Double.NaN), the mode D is used; - if filler argument contains any other value, the mode A is used and this argument specifies the reserved value filler.
element type
of the created matrix is the same as the element type of the source one.If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real mean, defined in the comments to this class. In this case, the found mean value m is usually truncated to its integer part
⌊m⌋=(long)m (remember that the mean value, according to our definition, is always ≥0). More precisely, the rules of casting the floating-point means to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.- Specified by:
meanBetweenValues
in interfaceRankMorphology
- Parameters:
src
- the source matrix.minValues
- the matrix containing v1 argument: the low bound of the averaged range of values for every element of the result.maxValues
- the matrix containing v2 argument: the high bound of the averaged range of values for every element of the result.pattern
- the pattern: the shape of the aperture.filler
- the reserved value, returned whenr(v1*σ)≥r(v2*σ) , or one of the special keysRankMorphology.FILL_MIN_VALUE
,RankMorphology.FILL_MAX_VALUE
,RankMorphology.FILL_NEAREST_VALUE
, which mean using of special calculation modes B, C, D.- Returns:
- the mean between 2 given values of the source matrix.
- See Also:
- if filler argument is
-
mean
Description copied from interface:RankMorphology
Returns a new updatable matrix, containing the mean of the source matrix by the specified pattern.More precisely, this method is equivalent to
, where the function meanFunc is:functionOfSum
(src, pattern, meanFunc)LinearFunc.getInstance
(0.0, 1.0/N),N = pattern. , if the source matrix is floating-point (pointCount()
src. is float or double) — in other words, this method calculates the usual mean of all elements in the aperture:elementType()
(v0+v1+...+vN−1) / N ;LinearFunc.getInstance
(0.5, 1.0/N),N = pattern. , if the source matrix is fixed-point (pointCount()
src. is boolean, char, byte, short, int or long) — in other words, this method calculates the mean of all elements in the aperture plus 0.5:elementType()
(v0+v1+...+vN−1) / N + 0.5.
If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real mean, defined above. In this case, the found mean value m is usually truncated to its integer part
⌊m⌋=(long)m (remember that the mean value, according to our definition, is always ≥0). More precisely, the rules of casting the floating-point means to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.The described rounding rule explains, why we add 0.5 to the mean in the case of a fixed-point source elements. Namely, in this case the combination of adding 0.5 and further truncation to the integer part works as rounding to the nearest integer:
⌊m+0.5⌋=Math.round(m) (excepting some rare cases when the real mean m is a strictly half-integer:m=2k+½ , k∈Z). In other words, this behaviour provides the maximal possible precision of the returned integer mean.Note: the behaviour of this method is similar to
meanBetweenPercentiles
(src, 0, N, pattern, anyFiller), whereN = pattern. , if the histogram is processed in the simple histogram model (seepointCount()
comments to SummingHistogram class
). Really, in this case the mean between 2 percentiles is equal to(S(r2)−S(r1)) / ((r2−r1)*σ) = S(N) / (N*σ) = (Σ 0≤j<M(j+0.5)*b[j]) / (N*σ)
In the simplest case, when the source elements are real numbers in the "standard" allowed range
0.0..1.0 , we haveσ = M (the histogram length),ai = ⌊vi*M⌋ , and this expression is equal to(Σ 0≤i<N(ai+0.5)) / (NM) = (v'0+v'1+...+v'N−1) / N + 0.5 / M ≈ (v0+v1+...+vN−1) / N
where
v'i = ai/M is an attempt to represent the real number vi with the given precision μ=log2M bits and a correction0.5/M is very little for large M.In another simplest case, when the source elements are integer numbers, σ=1 and the elements vi are non-negative integers, we have
ai = vi , and this expression is equal to(Σ 0≤i<N(vi+0.5)) / N = (v0+v1+...+vN−1) / N + 0.5
- Specified by:
mean
in interfaceRankMorphology
- Parameters:
src
- the source matrix.pattern
- the pattern: the shape of the aperture.- Returns:
- the mean of the source matrix.
- See Also:
-
functionOfSum
public Matrix<? extends UpdatablePArray> functionOfSum(Matrix<? extends PArray> src, Pattern pattern, Func processingFunc) Description copied from interface:RankMorphology
Returns a new updatable matrix, containing the result of some given functionf(S) of the aperture sum S of the source matrix by the specified pattern. See thecomments to this class
, section 4 about the "aperture sum" term. Theelement type
of the created matrix is the same as the element type of the source one.The function, applied to each calculated aperture sum S, is specified via processingFunc argument. Namely, for each aperture position this method calculates the aperture sum S of the source matrix and returns
processingFunc. in the corresponding element of the resulting matrix.get
(S)If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real function result. In this case, the found function result f is usually truncated to its integer part
(long)f . More precisely, the rules of casting the floating-point function results to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.This method can be considered as a generalization of
RankMorphology.mean(Matrix, Pattern)
.- Specified by:
functionOfSum
in interfaceRankMorphology
- Parameters:
src
- the source matrix.pattern
- the pattern: the shape of the aperture.processingFunc
- the function, which should be applied to every calculated aperture sum.- Returns:
- the result of the given function for the aperture sum of the source matrix.
- See Also:
-
functionOfPercentilePair
public Matrix<? extends UpdatablePArray> functionOfPercentilePair(Matrix<? extends PArray> src, Matrix<? extends PArray> percentileIndexes1, Matrix<? extends PArray> percentileIndexes2, Pattern pattern, Func processingFunc) Description copied from interface:RankMorphology
Returns a new updatable matrix, containing the result of some given functionf(v, v1,v2) of the source matrix v and two percentiles v1,v2 of the source matrix by the specified pattern. See thecomments to this class
, section 4 about the "percentile" term. The real indexes r of two percentiles for every element of the result are equal to the corresponding elements of percentileIndexes1 (for v1) or percentileIndexes2 matrix (for v2). Theelement type
of the created matrix is the same as the element type of the source one.The function, applied to each calculated three
(v,v1,v2) , is specified via processingFunc argument. Namely, for each aperture position x this method takes the value v — the element of the source matrix src at this aperture position x, calculates two percentiles v1 and v2 of the source matrix and returnsprocessingFunc. in the corresponding element of the resulting matrix.get
(v,v1,v2)If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real function result. In this case, the found function result f is usually truncated to its integer part
(long)f . More precisely, the rules of casting the floating-point function results to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.You can get the same results by 2 calls of
RankMorphology.percentile(Matrix, Matrix, Pattern)
method for both matrices of percentile indexes and applying the function to them and to the source matrix via method. But such a way works slower and is less convenient, than this method. A typical application of this method in image processing area is the contrasting image — in this case, we recommend usingMatrices.asFuncMatrix(Func, Class, Matrix, Matrix, Matrix)
ContrastingFunc
object as processingFunc argument.- Specified by:
functionOfPercentilePair
in interfaceRankMorphology
- Parameters:
src
- the source matrix.percentileIndexes1
- the 1st matrix containing r argument: the indexes of the 1st percentile v1 for every element of the result.percentileIndexes2
- the 2nd matrix containing r argument: the indexes of the 2nd percentile v2 for every element of the result.pattern
- the pattern: the shape of the aperture.processingFunc
- the function, which should be applied to every calculated three(v,v1,v2) , where v is the element of the source matrix, v1 and v2 are the corresponding percentiles.- Returns:
- the result of the given function.
- See Also:
-
functionOfPercentilePair
public Matrix<? extends UpdatablePArray> functionOfPercentilePair(Matrix<? extends PArray> src, double percentileIndex1, double percentileIndex2, Pattern pattern, Func processingFunc) Description copied from interface:RankMorphology
Returns a new updatable matrix, containing the result of some given functionf(v, v1,v2) of the source matrix v and two percentiles v1,v2 of the source matrix by the specified pattern. See thecomments to this class
, section 4 about the "percentile" term. The real indexes r of two percentiles for every element of the result are equal to percentileIndex1 (for v1) or percentileIndex2 argument (for v2). Theelement type
of the created matrix is the same as the element type of the source one.This method is equivalent to
functionOfPercentilePair
(src, src.matrix(Arrays.nDoubleCopies
(src.size(), percentileIndex1), src.matrix(Arrays.nDoubleCopies
(src.size(), percentileIndex1), pattern, processingFunc)If the element type of the source matrix (and, thus, of the result) is fixed-point — boolean, char, byte, short, int or long — then we need to round the real function result. In this case, the found function result f is usually truncated to its integer part
(long)f . More precisely, the rules of casting the floating-point function results to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.You can get the same results by 2 calls of
RankMorphology.percentile(Matrix, double, Pattern)
method for both matrices of percentile indexes and applying the function to them and to the source matrix via method. But such a way works slower and is less convenient, than this method. A typical application of this method in image processing area is the contrasting image — in this case, we recommend usingMatrices.asFuncMatrix(Func, Class, Matrix, Matrix, Matrix)
ContrastingFunc
object as processingFunc argument.- Specified by:
functionOfPercentilePair
in interfaceRankMorphology
- Parameters:
src
- the source matrix.percentileIndex1
- the 1st r argument: the index of the 1st percentile v1.percentileIndex2
- the 2nd r argument: the index of the 2nd percentile v2.pattern
- the pattern: the shape of the aperture.processingFunc
- the function, which should be applied to every calculated three(v,v1,v2) , where v is the element of the source matrix, v1 and v2 are the corresponding percentiles.- Returns:
- the result of the given function.
- See Also:
-
percentile
public void percentile(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, Matrix<? extends PArray> percentileIndexes, Pattern pattern) Description copied from interface:RankMorphology
Equivalent toRankMorphology.percentile(Matrix, Matrix, Pattern)
method, but the result matrix will be placed in the dest argument.If the
element type
of the passed dest matrix is the same as the element type of the source one, the result, saved in dest, will be identically equal to the result ofRankMorphology.percentile(Matrix, Matrix, Pattern)
method with the same src, percentileIndexes and pattern arguments. In other case, the result, saved in dest, will be equal toMatrices.asFuncMatrix
(true,Func.IDENTITY
, dest.array().type()
,percentile
(src, percentileIndexes, pattern))So, even if the precision of dest matrix is better than the precision of src — for example, if
src. is byte, butelementType()
dest. is double — this method does not try to calculate more precise percentile and rounds results likeelementType()
andRankMorphology.asPercentile(Matrix, Matrix, Pattern)
methods.RankMorphology.percentile(Matrix, Matrix, Pattern)
- Specified by:
percentile
in interfaceRankMorphology
- Parameters:
dest
- the target matrix.src
- the source matrix.percentileIndexes
- the matrix containing r argument: the indexes of the percentile for every element of the result.pattern
- the pattern: the shape of the aperture.- See Also:
-
percentile
public void percentile(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, double percentileIndex, Pattern pattern) Description copied from interface:RankMorphology
Equivalent toRankMorphology.percentile(Matrix, double, Pattern)
method, but the result matrix will be placed in the dest argument.This method is equivalent to
percentile
(dest, src, src.matrix(Arrays.nDoubleCopies
(src.size(), percentileIndex), pattern)- Specified by:
percentile
in interfaceRankMorphology
- Parameters:
dest
- the target matrix.src
- the source matrix.percentileIndex
- r argument of the percentile.pattern
- the pattern: the shape of the aperture.- See Also:
-
rank
public void rank(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> baseMatrix, Matrix<? extends PArray> rankedMatrix, Pattern pattern) Description copied from interface:RankMorphology
Equivalent toRankMorphology.rank(Class, Matrix, Matrix, Pattern)
method, but the result matrix will be placed in the dest argument and the required type will be chosen automatically asdest. . More precisely, the result, saved in dest, will be equal totype
(PArray.class)rank
(dest.array().type()
, baseMatrix, rankedMatrix, pattern)The element types of baseMatrix and rankedMatrix are usually equal. If they are different (
baseMatrix. ), this method replaces rankedMatrix withelementType()
!=rankedMatrix.elementType()
Matrices.asFuncMatrix
(true,Func.IDENTITY
, baseMatrix.array().type()
, rankedMatrix)before all other calculations. In other words, this method always casts the type of the ranked elements to the type of baseMatrix elements. As a result, we can be sure, that if the source baseMatrix matrix is fixed-point (boolean, char, byte, short, int or long elements), then the rank
r(v*σ) , according to the definition of the "rank" term, will be an integer number. In this case, you can specify requiredType=IntArray.class and get the precise rank without precision loss. Moreover, if you know that the number of points in the pattern (pattern. ) is less thanpointCount()
216=65536 or28=256 , it is enough to specify correspondingly requiredType=ShortArray.class or ByteArray.class. The less result precision allows you to save memory.- Specified by:
rank
in interfaceRankMorphology
- Parameters:
dest
- the target matrix.baseMatrix
- the source matrix.rankedMatrix
- the matrix containing v argument: the values, the rank of which should be calculated.pattern
- the pattern: the shape of the aperture.- See Also:
-
meanBetweenPercentiles
public void meanBetweenPercentiles(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, Matrix<? extends PArray> fromPercentileIndexes, Matrix<? extends PArray> toPercentileIndexes, Pattern pattern, double filler) Description copied from interface:RankMorphology
Equivalent toRankMorphology.meanBetweenPercentiles(Matrix, Matrix, Matrix, Pattern, double)
method, but the result matrix will be placed in the dest argument.If the element type of dest matrix is fixed-point — boolean, char, byte, short, int or long — then we need to round the real mean, defined in the comments to this class. In this case, the found mean value m is usually truncated to its integer part
⌊m⌋=(long)m (remember that the mean value, according to our definition, is always ≥0). More precisely, the rules of casting the floating-point means to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.- Specified by:
meanBetweenPercentiles
in interfaceRankMorphology
- Parameters:
dest
- the target matrix.src
- the source matrix.fromPercentileIndexes
- the matrix containing r1 argument: the indexes of the less percentile of the averaged range for every element of the result.toPercentileIndexes
- the matrix containing r2 argument: the indexes of the greater percentile of the averaged range for every element of the result.pattern
- the pattern: the shape of the aperture.filler
- the reserved value, returned whenr1≥r2 .- See Also:
-
meanBetweenPercentiles
public void meanBetweenPercentiles(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, double fromPercentileIndex, double toPercentileIndex, Pattern pattern, double filler) Description copied from interface:RankMorphology
Equivalent toRankMorphology.meanBetweenPercentiles(Matrix, double, double, Pattern, double)
method, but the result matrix will be placed in the dest argument.If the element type of dest matrix is fixed-point — boolean, char, byte, short, int or long — then we need to round the real mean, defined in the comments to this class. In this case, the found mean value m is usually truncated to its integer part
⌊m⌋=(long)m (remember that the mean value, according to our definition, is always ≥0). More precisely, the rules of casting the floating-point means to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.- Specified by:
meanBetweenPercentiles
in interfaceRankMorphology
- Parameters:
dest
- the target matrix.src
- the source matrix.fromPercentileIndex
- r1 argument: the index of the less percentile of the averaged range for every element of the result.toPercentileIndex
- r2 argument: the indexes of the greater percentile of the averaged range for every element of the result.pattern
- the pattern: the shape of the aperture.filler
- the reserved value, returned whenr1≥r2 .- See Also:
-
meanBetweenValues
public void meanBetweenValues(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, Matrix<? extends PArray> minValues, Matrix<? extends PArray> maxValues, Pattern pattern, double filler) Description copied from interface:RankMorphology
Equivalent toRankMorphology.meanBetweenValues(Matrix, Matrix, Matrix, Pattern, double)
method, but the result matrix will be placed in the dest argument.If the element type of dest matrix is fixed-point — boolean, char, byte, short, int or long — then we need to round the real mean, defined in the comments to this class. In this case, the found mean value m is usually truncated to its integer part
⌊m⌋=(long)m (remember that the mean value, according to our definition, is always ≥0). More precisely, the rules of casting the floating-point means to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.- Specified by:
meanBetweenValues
in interfaceRankMorphology
- Parameters:
dest
- the target matrix.src
- the source matrix.minValues
- the matrix containing v1 argument: the low bound of the averaged range of values for every element of the result.maxValues
- the matrix containing v2 argument: the high bound of the averaged range of values for every element of the result.pattern
- the pattern: the shape of the aperture.filler
- the reserved value, returned whenr(v1*σ)≥r(v2*σ) , or one of the special keysRankMorphology.FILL_MIN_VALUE
,RankMorphology.FILL_MAX_VALUE
,RankMorphology.FILL_NEAREST_VALUE
, which mean using of special calculation modes B, C, D.- See Also:
-
mean
public void mean(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, Pattern pattern) Description copied from interface:RankMorphology
Equivalent toRankMorphology.mean(Matrix, Pattern)
method, but the result matrix will be placed in the dest argument.If the element type of dest matrix is fixed-point — boolean, char, byte, short, int or long — then we need to round the real mean, defined above. In this case, the found mean value m is usually truncated to its integer part
⌊m⌋=(long)m (remember that the mean value, according to our definition, is always ≥0). More precisely, the rules of casting the floating-point means to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.The described rounding rule explains, why we add 0.5 to the mean in the case of a fixed-point source elements. Namely, in this case the combination of adding 0.5 and further truncation to the integer part works as rounding to the nearest integer:
⌊m+0.5⌋=Math.round(m) (excepting some rare cases when the real mean m is a strictly half-integer:m=2k+½ , k∈Z). In other words, this behaviour provides the maximal possible precision of the returned integer mean.Note: the behaviour of this method is similar to
meanBetweenPercentiles
(src, 0, N, pattern, anyFiller), whereN = pattern. , if the histogram is processed in the simple histogram model (seepointCount()
comments to SummingHistogram class
). Really, in this case the mean between 2 percentiles is equal to(S(r2)−S(r1)) / ((r2−r1)*σ) = S(N) / (N*σ) = (Σ 0≤j<M(j+0.5)*b[j]) / (N*σ)
In the simplest case, when the source elements are real numbers in the "standard" allowed range
0.0..1.0 , we haveσ = M (the histogram length),ai = ⌊vi*M⌋ , and this expression is equal to(Σ 0≤i<N(ai+0.5)) / (NM) = (v'0+v'1+...+v'N−1) / N + 0.5 / M ≈ (v0+v1+...+vN−1) / N
where
v'i = ai/M is an attempt to represent the real number vi with the given precision μ=log2M bits and a correction0.5/M is very little for large M.In another simplest case, when the source elements are integer numbers, σ=1 and the elements vi are non-negative integers, we have
ai = vi , and this expression is equal to(Σ 0≤i<N(vi+0.5)) / N = (v0+v1+...+vN−1) / N + 0.5
- Specified by:
mean
in interfaceRankMorphology
- Parameters:
dest
- the target matrix.src
- the source matrix.pattern
- the pattern: the shape of the aperture.- See Also:
-
functionOfSum
public void functionOfSum(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, Pattern pattern, Func processingFunc) Description copied from interface:RankMorphology
Equivalent toRankMorphology.functionOfSum(Matrix, Pattern, Func)
method, but the result matrix will be placed in the dest argument.If the element type of dest matrix is fixed-point — boolean, char, byte, short, int or long — then we need to round the real function result. In this case, the found function result f is usually truncated to its integer part
(long)f . More precisely, the rules of casting the floating-point function results to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.This method can be considered as a generalization of
RankMorphology.mean(Matrix, Matrix, Pattern)
.- Specified by:
functionOfSum
in interfaceRankMorphology
- Parameters:
dest
- the target matrix.src
- the source matrix.pattern
- the pattern: the shape of the aperture.processingFunc
- the function, which should be applied to every calculated aperture sum.- See Also:
-
functionOfPercentilePair
public void functionOfPercentilePair(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, Matrix<? extends PArray> percentileIndexes1, Matrix<? extends PArray> percentileIndexes2, Pattern pattern, Func processingFunc) Description copied from interface:RankMorphology
Equivalent toRankMorphology.functionOfPercentilePair(Matrix, Matrix, Matrix, Pattern, Func)
method, but the result matrix will be placed in the dest argument.If the element type of dest matrix is fixed-point — boolean, char, byte, short, int or long — then we need to round the real function result. In this case, the found function result f is usually truncated to its integer part
(long)f . More precisely, the rules of casting the floating-point function results to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.- Specified by:
functionOfPercentilePair
in interfaceRankMorphology
- Parameters:
dest
- the target matrix.src
- the source matrix.percentileIndexes1
- the 1st matrix containing r argument: the indexes of the 1st percentile v1 for every element of the result.percentileIndexes2
- the 2nd matrix containing r argument: the indexes of the 2nd percentile v2 for every element of the result.pattern
- the pattern: the shape of the aperture.processingFunc
- the function, which should be applied to every calculated three(v,v1,v2) , where v is the element of the source matrix, v1 and v2 are the corresponding percentiles.- See Also:
-
functionOfPercentilePair
public void functionOfPercentilePair(Matrix<? extends UpdatablePArray> dest, Matrix<? extends PArray> src, double percentileIndex1, double percentileIndex2, Pattern pattern, Func processingFunc) Description copied from interface:RankMorphology
Equivalent toRankMorphology.functionOfPercentilePair(Matrix, double, double, Pattern, Func)
method, but the result matrix will be placed in the dest argument.If the element type of dest matrix is fixed-point — boolean, char, byte, short, int or long — then we need to round the real function result. In this case, the found function result f is usually truncated to its integer part
(long)f . More precisely, the rules of casting the floating-point function results to the desired element type are the same as inArrays.asFuncArray(boolean, Func, Class, PArray...)
method with the argument truncateOverflows=true.- Specified by:
functionOfPercentilePair
in interfaceRankMorphology
- Parameters:
dest
- the target matrix.src
- the source matrix.percentileIndex1
- the 1st r argument: the index of the 1st percentile v1.percentileIndex2
- the 2nd r argument: the index of the 2nd percentile v2.pattern
- the pattern: the shape of the aperture.processingFunc
- the function, which should be applied to every calculated three(v,v1,v2) , where v is the element of the source matrix, v1 and v2 are the corresponding percentiles.- See Also:
-