/*
   * Traverses the original and mask images in tandem.
   * The mask should be identical to the original except it
   * should have been preselected to be a binary image.
   *
   * Wherever the mask has a 1 value, add that pixel value to
   * the list.
   *
   * Return the list unsorted and only containing pixel values of
   * the original matching a corresponding mask 1-value.
   *
   * @param orig
   * 		The original ImageData image
   * @param mask
   * 		The corresponding ImageData mask (having identical dimensions and containing binary values)
   *
   */
  public ArrayList mask(ImageData orig, ImageData mask) {
    ArrayList list =
        new ArrayList(); // a column-wise traversal of the input images populates this 1D list

    for (int col = 0; col < orig.getNumCols(); col++) {
      for (int row = 0; row < orig.getNumRows(); row++) {
        for (int band = 0; band < orig.getNumBands(); band++) {
          if (mask.getValue(row, col, band) == 1) {
            list.add(new Double(orig.getValue(row, col, band)));
          }
        }
      }
    }
    return list;
  }
  /*
   * Returns the sum of the pixel values of a given ImageData.
   * @param o
   * 		The ImageData providing pixels to be counted
   */
  public double sum(ImageData o) {
    double sum = 0;

    for (int row = 0; row < o.getNumRows(); row++) {
      for (int col = 0; col < o.getNumCols(); col++) {
        for (int band = 0; band < o.getNumBands(); band++) {
          sum += o.getValue(row, col, band);
        }
      }
    }
    return sum;
  }
  public ArrayList vectorize(ImageData o) {
    ArrayList list = new ArrayList();

    for (int row = 0; row < o.getNumRows(); row++) {
      for (int col = 0; col < o.getNumCols(); col++) {
        for (int band = 0; band < o.getNumBands(); band++) {
          list.add(new Double(o.getValue(row, col, band)));
        }
      }
    }

    return list;
  }