All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.algart.matrices.morphology.Continuer Maven / Gradle / Ivy

Go to download

Open-source Java libraries, supporting generalized smart arrays and matrices with elements of any types, including a wide set of 2D-, 3D- and multidimensional image processing and other algorithms, working with arrays and matrices.

There is a newer version: 1.4.23
Show newest version
/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2007-2024 Daniel Alievsky, AlgART Laboratory (http://algart.net)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package net.algart.matrices.morphology;

import net.algart.arrays.Matrices;
import net.algart.arrays.Matrix;
import net.algart.arrays.PArray;
import net.algart.arrays.UpdatablePArray;
import net.algart.math.IPoint;
import net.algart.math.IRectangularArea;
import net.algart.math.patterns.Pattern;
import net.algart.matrices.DependenceApertureBuilder;

import java.util.ArrayList;
import java.util.List;

class Continuer {
    private final Matrix continuedDest;
    private final List> continuedArguments;
    private final IRectangularArea aperture;

    public Continuer(Matrix dest,
                     Matrix src, Pattern pattern,
                     RankMorphology parent, Matrix.ContinuationMode continuationMode)
    {
        this(dest, Matrices.several(PArray.class, src), pattern, parent, continuationMode);
    }

    public Continuer(Matrix dest,
                     Matrix src1, Matrix src2, Pattern pattern,
                     RankMorphology parent, Matrix.ContinuationMode continuationMode)
    {
        this(dest, Matrices.several(PArray.class, src1, src2), pattern, parent, continuationMode);
    }

    public Continuer(Matrix dest,
                     Matrix src1, Matrix src2, Matrix src3,
                     Pattern pattern,
                     RankMorphology parent, Matrix.ContinuationMode continuationMode)
    {
        this(dest, Matrices.several(PArray.class, src1, src2, src3), pattern, parent, continuationMode);
    }

    public Continuer(Matrix dest,
                     List> arguments, Pattern pattern,
                     RankMorphology parent, Matrix.ContinuationMode continuationMode)
    {
        arguments = new ArrayList>(arguments);
        Matrix mainArgument = arguments.get(0);
        if (dest != null) {
            Matrices.checkDimensionEquality(dest, mainArgument);
        }
        Matrices.checkDimensionEquality(arguments);
        arguments.remove(0);
        DependenceApertureBuilder builder = dest == null && parent.isPseudoCyclic() ?
            DependenceApertureBuilder.SUM :
            DependenceApertureBuilder.SUM_MAX_0;
        this.aperture = builder.getAperture(mainArgument.dimCount(), pattern, false);
        Matrix continuedSrc = DependenceApertureBuilder.extend(mainArgument,
            aperture, continuationMode); // also checks overflow
        this.continuedArguments = extendAdditionalMatrices(arguments);
        this.continuedArguments.add(0, continuedSrc);
        this.continuedDest = dest == null ? null :
            DependenceApertureBuilder.extend(dest, aperture, Matrix.ContinuationMode.ZERO_CONSTANT);
    }

    public Matrix get(int index) {
        return continuedArguments.get(index);
    }

    public Matrix continuedDest() {
        assert continuedDest != null;
        return continuedDest;
    }

    public  Matrix reduce(Matrix matrix) {
        assert continuedDest == null;
        return DependenceApertureBuilder.reduce(matrix, aperture);
    }

    private List> extendAdditionalMatrices(List> matrices) {
        if (matrices.isEmpty()) {
            return matrices;
        }
        List> continued = new ArrayList>();
        for (Matrix m : matrices) {
            long[] from = aperture.min().coordinates();
            long[] to = IPoint.valueOf(m.dimensions()).add(aperture.max()).coordinates();
            continued.add(m.isEmpty() ? m : m.subMatrix(from, to, Matrix.ContinuationMode.ZERO_CONSTANT));
            // outside values are not important
        }
        return continued;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy