
// RGBMeasure.java
// Andrew Davison, ad@coe.psu.ac.th, April 2023

/* Measure an RGB image using ImageStatistics,
   HistogramWindow, and ResultsTable

   Usage:
     > compile RGBMeasure.java
     > run RGBMeasure <fnm>
   e.g.
     > run RGBMeasure frankenburg-1918.png
     > run RGBMeasure shapes.png
*/

import java.util.*;

import ij.*;
import ij.io.*;
import ij.gui.*;
import ij.process.*;
import ij.plugin.*;
import ij.measure.*;


public class RGBMeasure
{

  public static void main(String[] args)
  {
    if (args.length != 1) {
      System.out.println("Usage: run RGBMeasure <fnm>");
      return;
    }

    ImagePlus imp = new ImagePlus(args[0]);
    if (imp.getBitDepth() != 24) {
      System.out.println("RGB image required");
      return;
    }

    imp.show();
    ColorProcessor imProc = (ColorProcessor)imp.getProcessor();

    ImageStatistics ims =  ImageStatistics.getStatistics(imProc);

    System.out.println("\nRaw Data:");
    System.out.println("  " + Arrays.toString(ims.getHistogram()));

    System.out.println("\nSome Statistics:");
    // System.out.println("  " + ims);
    System.out.println("  Mean: " + ims.mean);
    System.out.println("  StdDev: " + ims.stdDev);
    System.out.println("  Mode: " + ims.mode);
    int maxCount = ims.maxCount;
    System.out.println("  Max Count: " + maxCount);
    System.out.println("  No. Bins: " + ims.nBins);


    HistogramWindow hWin = new HistogramWindow("Histogram of " + 
                                    imp.getTitle(), imp, ims);
    hWin.setVisible(true);

    System.out.println("\nLarge Counts (> 25% of max)");
    ResultsTable rt = hWin.getResultsTable();
    System.out.println(rt.getColumnHeadings());  // value, count
    for (int i=0; i < rt.size(); i++) {
       double count = rt.getValue("count", i);
       if (count/maxCount > 0.25)
         System.out.println("  " + rt.getRowAsString(i));
    }

    ImageUtils.waitGone("Histogram");
    System.exit(0);
  } /* main */


}  // end of RGBMeasure class
