ResultsTable

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

ResultsTable

Susanna Trollvad
I have written a plugin which loads n pictures, and stores their names in an
array called fileArray. The pictures contains one or more needle-like
objects and my plugin finds them and measures their length and width which
is then stored in two arrays:
length[][]
width[][]
for example id picture one has two "needles" length[0] will contain an int
array with the length of each needle in each element.

I want to display the results in table that a user could view, save and
possibly manipulate. I have tried using the class ResultsTable in imagej but
I doesn't work and I'm not sure why. Does anyone else know?

Here is the code were I try to put the values in the table:


        resulty = new ResultsTable();
        for(int a = 0;a<fileArray.length;a++) {
            for(int b=0;b<county[a];b++){
                resulty.addLabel("Image",fileArray[a]);
                //resulty.addValue("Length",(double)lengthArr[a][b]);
                //resulty.addValue("Width",(double)widthArr[a][b]);
            }
        }

This is the message I get when I try to run my program:

"java.lang.IllegalArgumentException: Counter==0
    at ij.measure.ResultsTable.addLabel(ResultsTable.java:160)
    at Rotating_Bounding_Box.run(Rotating_Bounding_Box.java:140)
    at ij.IJ.runUserPlugIn(IJ.java:183)
    at ij.ImageJ.runUserPlugIn(ImageJ.java:264)
    at ij.plugin.PlugInExecuter.run(Compiler.java:264)
    at java.lang.Thread.run(Thread.java:619)"

Here is the entire program:

import ij.*;
import ij.plugin.filter.PlugInFilter;
import ij.process.*;
import java.awt.*;
import ij.plugin.*;
import ij.gui.*;
import ij.measure.*;
import ij.text.*;
import java.util.*;
import ij.plugin.Thresholder;
import ij.plugin.filter.ParticleAnalyzer;
import ij.plugin.frame.RoiManager;
import java.io.File;
import ij.io.Opener;
import ij.WindowManager;
import ij.measure.ResultsTable;
//Plugin that loads a number of pictures(all depicting one or more pin-like
structures).
//Then the plugin measures the length and thickness of each pin in all of
the pictures.


public class Rotating_Bounding_Box implements PlugIn {
    ImagePlus imp;
    ImageProcessor ip;
    ImageConverter convert;
    ImageStack stacky;
    Thresholder treshy;
    ParticleAnalyzer party;
    RoiManager manager1;
    Roi[] RoiArr;
    Rectangle r;
    Roi roy;
    ImageWindow win;
    File load;
    String path;
    String[] fileArray;
    Opener openy;
    String processy;
    String MorP;
    ResultsTable resulty;
    int[] county;
    int[][] lengthArr;
    int[][] widthArr;

    public void run(String arg) {

        path = IJ.getString("Path to image files: ",path);
        load = new File(path);
        fileArray = load.list();
        openy = new Opener();
        county = new int[fileArray.length];
        lengthArr = new int[fileArray.length][];
        widthArr = new int[fileArray.length][];

        for(int i = 0;i<fileArray.length;i++) {
            imp = openy.openImage(path+"/"+fileArray[i]);
            imp.show();

            //Code from line 34-53 adapted from (
http://imagej.588099.n2.nabble.com/How-to-rotate-transform-an-Roi-td2639892.html
)
            int ht = imp.getHeight();
            int wd = imp.getWidth();

            ImagePlus dst = NewImage.createRGBImage("HSB", wd, ht, 1,
NewImage.FILL_BLACK);

            ImageProcessor srcp = imp.getProcessor();
            imp.changes = false;
            imp.close();
            ImageProcessor dstp = dst.getProcessor();
            int[] srcpix = (int[])srcp.getPixels();
            int[] dstpix = (int[])dstp.getPixels();

            Rectangle r = srcp.getRoi();

            for (int y=r.y; y<(r.y+r.height); y++) {
                for (int x=r.x; x<(r.x+r.width); x++) {
                    int u = x + y*wd;
                    dstpix[u] = srcpix[u];
                }
             }
             dst.show();

            //Convert to HSB and delete H and S slice
            convert = new ImageConverter(dst);
            convert.convertToHSB();
            stacky = dst.getImageStack();
            dst.setSlice(3);
            stacky.deleteSlice(1);
            stacky.deleteSlice(2);

            //Threshold
            //Use ThresholdtoSelection?
            dstp.setThreshold(200, 255, dstp.getLutUpdateMode());
            treshy = new Thresholder();
            treshy.run("Convert to Mask");

            //Analyze particles
            manager1 = new RoiManager();//For all particles
            IJ.run(dst,"Analyze Particles...", "size=1000-Infinity
circularity=0.00-1.00 show=Nothing exclude clear include add
slice");

            //Rotate particles
            manager1 = manager1.getInstance();
            county[i] = manager1.getCount();
            if(manager1.getCount()!=0) {
                RoiArr = manager1.getRoisAsArray();
                lengthArr[i] = new int[RoiArr.length];
                widthArr[i] = new int[RoiArr.length];
                int minW; int lengthy;
                for(int j=0;j<RoiArr.length;j++){
                    r = RoiArr[j].getBounds();
                    minW = r.width;
                    lengthy = r.height;
                    manager1.select(dst,j);
                    for(int ang=1;ang<180;ang++){
                        IJ.run("Rotate...", "angle="+IJ.d2s(ang));
                        roy = dst.getRoi();
                        r=roy.getBounds();
                        if(minW>r.width){
                            minW = r.width;
                            lengthy = r.height;
                        }
                        manager1.select(dst,j);
                    }
                    lengthArr[i][j] = lengthy;
                    widthArr[i][j] = minW;
                }
            }
            else{
                lengthArr[i] = new int[1];
                widthArr[i] = new int[1];
                lengthArr[i][0] = 0;
                widthArr[i][0] = 0;
            }
            dst.changes = false;
            dst.close();
            manager1.close();
        }

        resulty = new ResultsTable();
        for(int a = 0;a<fileArray.length;a++) {
            for(int b=0;b<county[a];b++){
                resulty.addLabel("Image",fileArray[a]);
                //resulty.addValue("Length",(double)lengthArr[a][b]);
                //resulty.addValue("Width",(double)widthArr[a][b]);
            }
        }


    }


}
Reply | Threaded
Open this post in threaded view
|

Re: ResultsTable

Volker Baecker
Hello,
you need to call the method incrementCounter on the results-table each
time before adding values to a new line.
Volker

On 19/05/11 11:48, Susanna Trollvad wrote:

> I have written a plugin which loads n pictures, and stores their names in an
> array called fileArray. The pictures contains one or more needle-like
> objects and my plugin finds them and measures their length and width which
> is then stored in two arrays:
> length[][]
> width[][]
> for example id picture one has two "needles" length[0] will contain an int
> array with the length of each needle in each element.
>
> I want to display the results in table that a user could view, save and
> possibly manipulate. I have tried using the class ResultsTable in imagej but
> I doesn't work and I'm not sure why. Does anyone else know?
>
> Here is the code were I try to put the values in the table:
>
>
>         resulty = new ResultsTable();
>         for(int a = 0;a<fileArray.length;a++) {
>             for(int b=0;b<county[a];b++){
>                 resulty.addLabel("Image",fileArray[a]);
>                 //resulty.addValue("Length",(double)lengthArr[a][b]);
>                 //resulty.addValue("Width",(double)widthArr[a][b]);
>             }
>         }
>
> This is the message I get when I try to run my program:
>
> "java.lang.IllegalArgumentException: Counter==0
>     at ij.measure.ResultsTable.addLabel(ResultsTable.java:160)
>     at Rotating_Bounding_Box.run(Rotating_Bounding_Box.java:140)
>     at ij.IJ.runUserPlugIn(IJ.java:183)
>     at ij.ImageJ.runUserPlugIn(ImageJ.java:264)
>     at ij.plugin.PlugInExecuter.run(Compiler.java:264)
>     at java.lang.Thread.run(Thread.java:619)"
>
> Here is the entire program:
>
> import ij.*;
> import ij.plugin.filter.PlugInFilter;
> import ij.process.*;
> import java.awt.*;
> import ij.plugin.*;
> import ij.gui.*;
> import ij.measure.*;
> import ij.text.*;
> import java.util.*;
> import ij.plugin.Thresholder;
> import ij.plugin.filter.ParticleAnalyzer;
> import ij.plugin.frame.RoiManager;
> import java.io.File;
> import ij.io.Opener;
> import ij.WindowManager;
> import ij.measure.ResultsTable;
> //Plugin that loads a number of pictures(all depicting one or more pin-like
> structures).
> //Then the plugin measures the length and thickness of each pin in all of
> the pictures.
>
>
> public class Rotating_Bounding_Box implements PlugIn {
>     ImagePlus imp;
>     ImageProcessor ip;
>     ImageConverter convert;
>     ImageStack stacky;
>     Thresholder treshy;
>     ParticleAnalyzer party;
>     RoiManager manager1;
>     Roi[] RoiArr;
>     Rectangle r;
>     Roi roy;
>     ImageWindow win;
>     File load;
>     String path;
>     String[] fileArray;
>     Opener openy;
>     String processy;
>     String MorP;
>     ResultsTable resulty;
>     int[] county;
>     int[][] lengthArr;
>     int[][] widthArr;
>
>     public void run(String arg) {
>
>         path = IJ.getString("Path to image files: ",path);
>         load = new File(path);
>         fileArray = load.list();
>         openy = new Opener();
>         county = new int[fileArray.length];
>         lengthArr = new int[fileArray.length][];
>         widthArr = new int[fileArray.length][];
>
>         for(int i = 0;i<fileArray.length;i++) {
>             imp = openy.openImage(path+"/"+fileArray[i]);
>             imp.show();
>
>             //Code from line 34-53 adapted from (
> http://imagej.588099.n2.nabble.com/How-to-rotate-transform-an-Roi-td2639892.html
> )
>             int ht = imp.getHeight();
>             int wd = imp.getWidth();
>
>             ImagePlus dst = NewImage.createRGBImage("HSB", wd, ht, 1,
> NewImage.FILL_BLACK);
>
>             ImageProcessor srcp = imp.getProcessor();
>             imp.changes = false;
>             imp.close();
>             ImageProcessor dstp = dst.getProcessor();
>             int[] srcpix = (int[])srcp.getPixels();
>             int[] dstpix = (int[])dstp.getPixels();
>
>             Rectangle r = srcp.getRoi();
>
>             for (int y=r.y; y<(r.y+r.height); y++) {
>                 for (int x=r.x; x<(r.x+r.width); x++) {
>                     int u = x + y*wd;
>                     dstpix[u] = srcpix[u];
>                 }
>              }
>              dst.show();
>
>             //Convert to HSB and delete H and S slice
>             convert = new ImageConverter(dst);
>             convert.convertToHSB();
>             stacky = dst.getImageStack();
>             dst.setSlice(3);
>             stacky.deleteSlice(1);
>             stacky.deleteSlice(2);
>
>             //Threshold
>             //Use ThresholdtoSelection?
>             dstp.setThreshold(200, 255, dstp.getLutUpdateMode());
>             treshy = new Thresholder();
>             treshy.run("Convert to Mask");
>
>             //Analyze particles
>             manager1 = new RoiManager();//For all particles
>             IJ.run(dst,"Analyze Particles...", "size=1000-Infinity
> circularity=0.00-1.00 show=Nothing exclude clear include add
> slice");
>
>             //Rotate particles
>             manager1 = manager1.getInstance();
>             county[i] = manager1.getCount();
>             if(manager1.getCount()!=0) {
>                 RoiArr = manager1.getRoisAsArray();
>                 lengthArr[i] = new int[RoiArr.length];
>                 widthArr[i] = new int[RoiArr.length];
>                 int minW; int lengthy;
>                 for(int j=0;j<RoiArr.length;j++){
>                     r = RoiArr[j].getBounds();
>                     minW = r.width;
>                     lengthy = r.height;
>                     manager1.select(dst,j);
>                     for(int ang=1;ang<180;ang++){
>                         IJ.run("Rotate...", "angle="+IJ.d2s(ang));
>                         roy = dst.getRoi();
>                         r=roy.getBounds();
>                         if(minW>r.width){
>                             minW = r.width;
>                             lengthy = r.height;
>                         }
>                         manager1.select(dst,j);
>                     }
>                     lengthArr[i][j] = lengthy;
>                     widthArr[i][j] = minW;
>                 }
>             }
>             else{
>                 lengthArr[i] = new int[1];
>                 widthArr[i] = new int[1];
>                 lengthArr[i][0] = 0;
>                 widthArr[i][0] = 0;
>             }
>             dst.changes = false;
>             dst.close();
>             manager1.close();
>         }
>
>         resulty = new ResultsTable();
>         for(int a = 0;a<fileArray.length;a++) {
>             for(int b=0;b<county[a];b++){
>                 resulty.addLabel("Image",fileArray[a]);
>                 //resulty.addValue("Length",(double)lengthArr[a][b]);
>                 //resulty.addValue("Width",(double)widthArr[a][b]);
>             }
>         }
>
>
>     }
>
>
> }
Reply | Threaded
Open this post in threaded view
|

Re: ResultsTable

Susanna Trollvad
Thanks, now it works. :)

//Susanna

2011/5/19 Volker Baecker <[hidden email]>

> Hello,
> you need to call the method incrementCounter on the results-table each
> time before adding values to a new line.
> Volker
>
> On 19/05/11 11:48, Susanna Trollvad wrote:
> > I have written a plugin which loads n pictures, and stores their names in
> an
> > array called fileArray. The pictures contains one or more needle-like
> > objects and my plugin finds them and measures their length and width
> which
> > is then stored in two arrays:
> > length[][]
> > width[][]
> > for example id picture one has two "needles" length[0] will contain an
> int
> > array with the length of each needle in each element.
> >
> > I want to display the results in table that a user could view, save and
> > possibly manipulate. I have tried using the class ResultsTable in imagej
> but
> > I doesn't work and I'm not sure why. Does anyone else know?
> >
> > Here is the code were I try to put the values in the table:
> >
> >
> >         resulty = new ResultsTable();
> >         for(int a = 0;a<fileArray.length;a++) {
> >             for(int b=0;b<county[a];b++){
> >                 resulty.addLabel("Image",fileArray[a]);
> >                 //resulty.addValue("Length",(double)lengthArr[a][b]);
> >                 //resulty.addValue("Width",(double)widthArr[a][b]);
> >             }
> >         }
> >
> > This is the message I get when I try to run my program:
> >
> > "java.lang.IllegalArgumentException: Counter==0
> >     at ij.measure.ResultsTable.addLabel(ResultsTable.java:160)
> >     at Rotating_Bounding_Box.run(Rotating_Bounding_Box.java:140)
> >     at ij.IJ.runUserPlugIn(IJ.java:183)
> >     at ij.ImageJ.runUserPlugIn(ImageJ.java:264)
> >     at ij.plugin.PlugInExecuter.run(Compiler.java:264)
> >     at java.lang.Thread.run(Thread.java:619)"
> >
> > Here is the entire program:
> >
> > import ij.*;
> > import ij.plugin.filter.PlugInFilter;
> > import ij.process.*;
> > import java.awt.*;
> > import ij.plugin.*;
> > import ij.gui.*;
> > import ij.measure.*;
> > import ij.text.*;
> > import java.util.*;
> > import ij.plugin.Thresholder;
> > import ij.plugin.filter.ParticleAnalyzer;
> > import ij.plugin.frame.RoiManager;
> > import java.io.File;
> > import ij.io.Opener;
> > import ij.WindowManager;
> > import ij.measure.ResultsTable;
> > //Plugin that loads a number of pictures(all depicting one or more
> pin-like
> > structures).
> > //Then the plugin measures the length and thickness of each pin in all of
> > the pictures.
> >
> >
> > public class Rotating_Bounding_Box implements PlugIn {
> >     ImagePlus imp;
> >     ImageProcessor ip;
> >     ImageConverter convert;
> >     ImageStack stacky;
> >     Thresholder treshy;
> >     ParticleAnalyzer party;
> >     RoiManager manager1;
> >     Roi[] RoiArr;
> >     Rectangle r;
> >     Roi roy;
> >     ImageWindow win;
> >     File load;
> >     String path;
> >     String[] fileArray;
> >     Opener openy;
> >     String processy;
> >     String MorP;
> >     ResultsTable resulty;
> >     int[] county;
> >     int[][] lengthArr;
> >     int[][] widthArr;
> >
> >     public void run(String arg) {
> >
> >         path = IJ.getString("Path to image files: ",path);
> >         load = new File(path);
> >         fileArray = load.list();
> >         openy = new Opener();
> >         county = new int[fileArray.length];
> >         lengthArr = new int[fileArray.length][];
> >         widthArr = new int[fileArray.length][];
> >
> >         for(int i = 0;i<fileArray.length;i++) {
> >             imp = openy.openImage(path+"/"+fileArray[i]);
> >             imp.show();
> >
> >             //Code from line 34-53 adapted from (
> >
> http://imagej.588099.n2.nabble.com/How-to-rotate-transform-an-Roi-td2639892.html
> > )
> >             int ht = imp.getHeight();
> >             int wd = imp.getWidth();
> >
> >             ImagePlus dst = NewImage.createRGBImage("HSB", wd, ht, 1,
> > NewImage.FILL_BLACK);
> >
> >             ImageProcessor srcp = imp.getProcessor();
> >             imp.changes = false;
> >             imp.close();
> >             ImageProcessor dstp = dst.getProcessor();
> >             int[] srcpix = (int[])srcp.getPixels();
> >             int[] dstpix = (int[])dstp.getPixels();
> >
> >             Rectangle r = srcp.getRoi();
> >
> >             for (int y=r.y; y<(r.y+r.height); y++) {
> >                 for (int x=r.x; x<(r.x+r.width); x++) {
> >                     int u = x + y*wd;
> >                     dstpix[u] = srcpix[u];
> >                 }
> >              }
> >              dst.show();
> >
> >             //Convert to HSB and delete H and S slice
> >             convert = new ImageConverter(dst);
> >             convert.convertToHSB();
> >             stacky = dst.getImageStack();
> >             dst.setSlice(3);
> >             stacky.deleteSlice(1);
> >             stacky.deleteSlice(2);
> >
> >             //Threshold
> >             //Use ThresholdtoSelection?
> >             dstp.setThreshold(200, 255, dstp.getLutUpdateMode());
> >             treshy = new Thresholder();
> >             treshy.run("Convert to Mask");
> >
> >             //Analyze particles
> >             manager1 = new RoiManager();//For all particles
> >             IJ.run(dst,"Analyze Particles...", "size=1000-Infinity
> > circularity=0.00-1.00 show=Nothing exclude clear include add
> > slice");
> >
> >             //Rotate particles
> >             manager1 = manager1.getInstance();
> >             county[i] = manager1.getCount();
> >             if(manager1.getCount()!=0) {
> >                 RoiArr = manager1.getRoisAsArray();
> >                 lengthArr[i] = new int[RoiArr.length];
> >                 widthArr[i] = new int[RoiArr.length];
> >                 int minW; int lengthy;
> >                 for(int j=0;j<RoiArr.length;j++){
> >                     r = RoiArr[j].getBounds();
> >                     minW = r.width;
> >                     lengthy = r.height;
> >                     manager1.select(dst,j);
> >                     for(int ang=1;ang<180;ang++){
> >                         IJ.run("Rotate...", "angle="+IJ.d2s(ang));
> >                         roy = dst.getRoi();
> >                         r=roy.getBounds();
> >                         if(minW>r.width){
> >                             minW = r.width;
> >                             lengthy = r.height;
> >                         }
> >                         manager1.select(dst,j);
> >                     }
> >                     lengthArr[i][j] = lengthy;
> >                     widthArr[i][j] = minW;
> >                 }
> >             }
> >             else{
> >                 lengthArr[i] = new int[1];
> >                 widthArr[i] = new int[1];
> >                 lengthArr[i][0] = 0;
> >                 widthArr[i][0] = 0;
> >             }
> >             dst.changes = false;
> >             dst.close();
> >             manager1.close();
> >         }
> >
> >         resulty = new ResultsTable();
> >         for(int a = 0;a<fileArray.length;a++) {
> >             for(int b=0;b<county[a];b++){
> >                 resulty.addLabel("Image",fileArray[a]);
> >                 //resulty.addValue("Length",(double)lengthArr[a][b]);
> >                 //resulty.addValue("Width",(double)widthArr[a][b]);
> >             }
> >         }
> >
> >
> >     }
> >
> >
> > }
>