package robo.vision; import java.awt.Point; import java.awt.Rectangle; import java.awt.image.DataBuffer; import java.awt.image.Raster; import java.awt.image.SampleModel; /** A simple extension of Raster which adds some convenience methods for * access pixel values in a more intuitive way (grey(), red(), green(), * blue(), etc.) and a set of statistical operations on pixel values. */ public class RoboRaster extends Raster { /* CONSTRUCTORS */ /** constructs a Raster2 by calling parent constructor with the given * parameters. */ public RoboRaster(SampleModel sampleModel, DataBuffer dataBuffer, Point origin) { super(sampleModel, dataBuffer, origin); } /** constructs a Raster2 by calling parent constructor with the given * parameters. */ public RoboRaster(SampleModel sampleModel, DataBuffer dataBuffer, Rectangle aRegion, Point sampleModelTranslate, Raster parent) { super(sampleModel, dataBuffer, aRegion, sampleModelTranslate, parent); } /** constructs a Raster2 by calling parent constructor with the given * parameters. */ public RoboRaster(SampleModel sampleModel, Point origin) { super(sampleModel, origin); } /** Effectively type-casts a Raster as a Raster2 by calling parent * constructor with the given parameters. * @param src the Raster to cast */ public RoboRaster(Raster src) { super(src.getSampleModel(), src.getDataBuffer(), new Point(0, 0)); } /* PUBLIC INTERFACE */ /* Class Constants */ public static final int BLACK = 0; public static final int WHITE = 255; /* Accessors */ /** returns the pixel value in band 0 at the given position. * @param u horizontal raster position. * @param v vertical raster position. * @return the pixel value at position u,v. */ public int grey(int u, int v) { return (getSample(u, v, 0)); } /** returns the pixel value in band 0 at position west of the given * position, if it exists, otherwise returns -1. * @param u horizontal raster position. * @param v vertical raster position. * @return the pixel value at position u-1,v or -1. */ public int westNeighbor(int u, int v) { if (u > 0) return (getSample(u - 1, v, 0)); else return -1; } /** returns the pixel value in band 0 at position east of the given * position, if it exists, otherwise returns -1. * @param u horizontal raster position. * @param v vertical raster position. * @return the pixel value at position u+1,v or -1. */ public int eastNeighbor(int u, int v) { if (u < getWidth() - 1) return (getSample(u + 1, v, 0)); else return -1; } /** returns the pixel value in band 0 at position north of the given * position, if it exists, otherwise returns -1. * @param u horizontal raster position. * @param v vertical raster position. * @return the pixel value at position u,v-1, or -1. */ public int northNeighbor(int u, int v) { if (v > 0) return (getSample(u, v - 1, 0)); else return -1; } /** returns the pixel value in band 0 at position south of the given * position, if it exists, otherwise returns -1. * @param u horizontal raster position. * @param v vertical raster position. * @return the pixel value at position u,v+1. */ public int southNeighbor(int u, int v) { if (v < getHeight() - 1) return (getSample(u, v + 1, 0)); else return -1; } /** returns the blue pixel value in band 2 at the given position. * @param u horizontal raster position. * @param v vertical raster position. * @return the blue pixel value at position u,v. */ public int blue(int u, int v) { return (getSample(u, v, 2)); } /** returns the green pixel value in band 1 at the given position. * @param u horizontal raster position. * @param v vertical raster position. * @return the green pixel value at position u,v. */ public int green(int u, int v) { return (getSample(u, v, 1)); } /** returns the red pixel value in band 0 at the given position. * @param u horizontal raster position. * @param v vertical raster position. * @return the red pixel value at position u,v. */ public int red(int u, int v) { return (getSample(u, v, 0)); } /** returns the minimum pixel value in band 0. * @return the minimum pixel value. */ public int minGrey() { int m = Integer.MAX_VALUE; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { if (grey(u, v) < m) m = grey(u, v); } } return m; } /** returns the minimum red pixel value in band 0. * @return the minimum red pixel value. */ public int minRed() { int m = Integer.MAX_VALUE; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { if (red(u, v) < m) m = red(u, v); } } return m; } /** returns the minimum green pixel value in band 1. * @return the minimum green pixel value. */ public int minGreen() { int m = Integer.MAX_VALUE; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { if (green(u, v) < m) m = green(u, v); } } return m; } /** returns the minimum blue pixel value in band 2. * @return the minimum blue pixel value. */ public int minBlue() { int m = Integer.MAX_VALUE; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { if (blue(u, v) < m) m = blue(u, v); } } return m; } /** returns the maximum pixel value in band 0 * @return the maximum pixel value. */ public int maxGrey() { int m = Integer.MIN_VALUE; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { if (grey(u, v) > m) m = grey(u, v); } } return m; } /** returns the maximum red pixel value in band 0. * @return the maximum red pixel value. */ public int maxRed() { int m = Integer.MIN_VALUE; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { if (red(u, v) > m) m = red(u, v); } } return m; } /** returns the maximum green pixel value in band 1. * @return the maximum green pixel value. */ public int maxGreen() { int m = Integer.MIN_VALUE; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { if (green(u, v) > m) m = green(u, v); } } return m; } /** returns the maximum blue pixel value in band 2. * @return the maximum blue pixel value. */ public int maxBlue() { int m = Integer.MIN_VALUE; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { if (blue(u, v) > m) m = blue(u, v); } } return m; } /** returns the mean red pixel value in band 0. * @return the mean red pixel value. */ public double redMean() { double mean = 0.f; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { mean += red(u, v); } } mean /= getWidth() * getHeight(); return mean; } /** returns the covariance of the red pixels in band 0. * @return the red pixel value covariance. */ public double redCovariance() { double mean = redMean(), covariance = 0.f, temp; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { temp = red(u, v) - mean; covariance += temp * temp; } } covariance /= getWidth() * getHeight(); return covariance; } /** returns the mean green pixel value in band 1. * @return the mean green pixel value. */ public double greenMean() { double mean = 0.f; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { mean += green(u, v); } } mean /= getWidth() * getHeight(); return mean; } /** returns the covariance of the green pixels in band 1. * @return the green pixel value covariance. */ public double greenCovariance() { double mean = greenMean(), covariance = 0.f, temp; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { temp = green(u, v) - mean; covariance += temp * temp; } } covariance /= getWidth() * getHeight(); return covariance; } /** returns the mean blue pixel value in band 2. * @return the mean blue pixel value. */ public double blueMean() { double mean = 0.f; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { mean += blue(u, v); } } mean /= getWidth() * getHeight(); return mean; } /** returns the covariance of the blue pixels in band 2. * @return the blue pixel value covariance. */ public double blueCovariance() { double mean = blueMean(), covariance = 0.f, temp; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { temp = blue(u, v) - mean; covariance += temp * temp; } } covariance /= getWidth() * getHeight(); return covariance; } /** returns the mean pixel value in band 0. * @return the mean pixel value. */ public double greyMean() { double mean = 0.f; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { mean += grey(u, v); } } mean /= getWidth() * getHeight(); return mean; } /** returns the covariance of the pixels in band 0. * @return the pixel value covariance. */ public double greyCovariance() { double mean = greyMean(), covariance = 0.f, temp; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { temp = grey(u, v) - mean; covariance += temp * temp; } } covariance /= getWidth() * getHeight(); return covariance; } /** returns the covariance between the pixel values in bands 0 and 1 (red, green). * @return the covariance between the red and green pixel values. */ public double redGreenCrossCovariance() { double mean1 = redMean(), mean2 = greenMean(), covariance = 0.; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { covariance += (red(u, v) - mean1) * (green(u, v) - mean2); } } covariance /= getWidth() * getHeight(); return covariance; } /** returns the covariance between the pixel values in bands 1 and 2 (blue, green). * @return the covariance between the blue and green pixel values. */ public double blueGreenCrossCovariance() { double mean1 = blueMean(), mean2 = greenMean(), covariance = 0.; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { covariance += (blue(u, v) - mean1) * (green(u, v) - mean2); } } covariance /= getWidth() * getHeight(); return covariance; } /** returns the covariance between the pixel values in bands 0 and 2 (red, blue). * @return the covariance between the red and blue pixel values. */ public double redBlueCrossCovariance() { double mean1 = redMean(), mean2 = blueMean(), covariance = 0.; for (int v = 0; v < getHeight(); v++) { for (int u = 0; u < getWidth(); u++) { covariance += (red(u, v) - mean1) * (blue(u, v) - mean2); } } covariance /= getWidth() * getHeight(); return covariance; } /* Common Interface */ //public String toString(); //public boolean equals(Object obj); //protected Object clone() throws CloneNotSupportedException; //protected void finalize() throws Throwable; /* PRIVATE METHODS */ /* CLASS AND OBJECT ATTRIBUTES */ /* TEST METHODS */ //public static void main(String arg[]); }