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

org.jgrasstools.lesto.modules.vegetation.watershed.WatershedPixel Maven / Gradle / Ivy

The newest version!
package org.jgrasstools.lesto.modules.vegetation.watershed;

/*
 * Watershed algorithm
 *
 * Copyright (c) 2003 by Christopher Mei ([email protected])
 *
 * This plugin is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this plugin; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

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

/**
 *  The aim of WatershedPixel is to enable
 *  sorting the pixels of an Image according
 *  to their grayscale value.
 *
 *  This is the first step of the Vincent
 *  and Soille Watershed algorithm (1991)
 *  
 **/

public class WatershedPixel implements Comparable {
    /** Value used to initialise the image */
    final static int INIT = -1;
    /** Value used to indicate the new pixels that
     *  are going to be processed (intial value 
     *  at each level)
     **/
    final static int MASK = -2;
    /** Value indicating that the pixel belongs 
     *  to a watershed.
     **/
    final static int WSHED = 0;
    /** Fictitious pixel **/
    final static int FICTITIOUS = -3;

    /** x coordinate of the pixel **/
    private int x;
    /** y coordinate of the pixel **/
    private int y;
    /** grayscale value of the pixel **/
    private byte height;
    /** Label used in the Watershed immersion algorithm **/
    private int label;
    /** Distance used for working on pixels */
    private int dist;

    /** Neighbours **/
    private List neighbours;

    public WatershedPixel( int x, int y, byte height ) {
        this.x = x;
        this.y = y;
        this.height = height;
        label = INIT;
        dist = 0;
        neighbours = new ArrayList(8);
    }

    public WatershedPixel() {
        label = FICTITIOUS;
    }

    public void addNeighbour( WatershedPixel neighbour ) {
        /*IJ.write("In Pixel, adding :");
          IJ.write(""+neighbour);
          IJ.write("Add done");
        */
        neighbours.add(neighbour);
    }

    public List getNeighbours() {
        return neighbours;
    }

    public String toString() {
        return new String("(" + x + "," + y + "), height : " + getIntHeight() + ", label : " + label + ", distance : " + dist);
    }

    public final byte getHeight() {
        return height;
    }

    public final int getIntHeight() {
        return (int) height & 0xff;
    }

    public final int getX() {
        return x;
    }

    public final int getY() {
        return y;
    }

    /** Method to be able to use the Collections.sort static method. **/
    public int compareTo( WatershedPixel o ) {
        if (o.getIntHeight() < getIntHeight())
            return 1;

        if (o.getIntHeight() > getIntHeight())
            return -1;

        return 0;
    }

    public void setLabel( int label ) {
        this.label = label;
    }

    public void setLabelToINIT() {
        label = INIT;
    }

    public void setLabelToMASK() {
        label = MASK;
    }

    public void setLabelToWSHED() {
        label = WSHED;
    }

    public boolean isLabelINIT() {
        return label == INIT;
    }
    public boolean isLabelMASK() {
        return label == MASK;
    }
    public boolean isLabelWSHED() {
        return label == WSHED;
    }

    public int getLabel() {
        return label;
    }

    public void setDistance( int distance ) {
        dist = distance;
    }

    public int getDistance() {
        return dist;
    }

    public boolean isFICTITIOUS() {
        return label == FICTITIOUS;
    }

    public boolean allNeighboursAreWSHED() {
        for( int i = 0; i < neighbours.size(); i++ ) {
            WatershedPixel r = (WatershedPixel) neighbours.get(i);

            if (!r.isLabelWSHED())
                return false;
        }
        return true;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy