Loosing Particles when Rotating Image

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

Loosing Particles when Rotating Image

Brendan H.
I have a series of images where a few thousand tiny particles form a circular ring, and I need a
way to count the number of particles in a discrete fashion; i.e. form a 5 degree selection wedge
(using the center of the ring as the vertex, and half the image width, which is slightly larger than
the ring diameter, as the radii) that includes 5 degree's worth of particles, count them, then rotate
the wedge by 5 degrees, and iterate.

I'm having some troubles getting this to work however.  My first idea was to make the wedge,
count the particles, rotate the image, and reiterate.  This keeps the wedge stationary, but "sweeps"
the image past the selection, eventually counting all the particles in discrete steps.  I got the
macro to work fine, but I noticed a few things:

1) When I rotate the image arbitrarily without iterating, I loose a bunch of particles each time.  E.g.
when I do a total particle count before rotation, I get 1669 particles, but after one arbitrary
rotation (43degrees in this case) the particle count drops to 1557.  My ring is centered in the
square window, so the particles are not leaving the field of view; also 90 degree rotations do not
yield a flux in the number of particles.  I noticed this problem because as I ran the macro, the
particles got more "clumpy" with each small rotation; it's clearly an additive issue.

2) If I iterate when rotating, I have to re-threshold every rotation.  This has the same clumping
effect (although much more severe) as the simple rotation.

Anybody have any ideas?  I'm pretty stuck on this!!

Thanks for your help,
Brendan Hermalyn
Reply | Threaded
Open this post in threaded view
|

Re: Loosing Particles when Rotating Image

Gluender
Dear Brendan Hermalyn,

you may first try to imagine how images are rotated by arbitrary angles.
Of course this operation involves some kind of interpolation, the
result of which you are observing.

If you like to stick with the very method, then you are to always
rotate from the original image _once_. Doing so will at least not
accumulate interpolation artefacts. However, you must accept
artefacts from a single rotation.

>I have a series of images where a few thousand tiny particles form a
>circular ring, and I need a
>way to count the number of particles in a discrete fashion; i.e.
>form a 5 degree selection wedge
>(using the center of the ring as the vertex, and half the image
>width, which is slightly larger than
>the ring diameter, as the radii) that includes 5 degree's worth of
>particles, count them, then rotate
>the wedge by 5 degrees, and iterate.
>
>I'm having some troubles getting this to work however.  My first
>idea was to make the wedge,
>count the particles, rotate the image, and reiterate.  This keeps
>the wedge stationary, but "sweeps"
>the image past the selection, eventually counting all the particles
>in discrete steps.  I got the
>macro to work fine, but I noticed a few things:
>
>1) When I rotate the image arbitrarily without iterating, I loose a
>bunch of particles each time.  E.g.
>when I do a total particle count before rotation, I get 1669
>particles, but after one arbitrary
>rotation (43degrees in this case) the particle count drops to 1557.
>My ring is centered in the
>square window, so the particles are not leaving the field of view;
>also 90 degree rotations do not
>yield a flux in the number of particles.  I noticed this problem
>because as I ran the macro, the
>particles got more "clumpy" with each small rotation; it's clearly
>an additive issue.
>
>2) If I iterate when rotating, I have to re-threshold every
>rotation.  This has the same clumping
>effect (although much more severe) as the simple rotation.
>
>Anybody have any ideas?  I'm pretty stuck on this!!
>
>Thanks for your help,
>Brendan Hermalyn

HTH
--


                   Herbie

          ------------------------

          <http://www.gluender.de>
Reply | Threaded
Open this post in threaded view
|

Re: Loosing Particles when Rotating Image

Gabriel Landini
In reply to this post by Brendan H.
On Wednesday 07 November 2007, Brendan H. wrote:
> 1) When I rotate the image arbitrarily without iterating, I loose a bunch
> of particles each time.

Of course, you are rotating a square pixel array by a 5 degree angle!

Your only option is to rotate the ROI.

G.
Reply | Threaded
Open this post in threaded view
|

Re: Loosing Particles when Rotating Image

Kenneth Sloan-2
Excuse my ignorance of IJ internals (I'm just starting to use it) -  
but is it not possible to find ALL particles and then catagorize each  
one according to which ROI it lies in?  What I would look for is a  
routine that produced an array (or list) of particles annotated with  
x,y coordinates.  It would then be simple to step through that list  
and produced a histogram of #particles per angular bin.

Of course, rotating the image is blurring the particles and merging  
them.  You could minimize the problems by always rotating from the  
same starting image.  Even then you would get some loss, but the loss  
would not depend on how far you rotated.  Rotating incrementally is a  
classic error.


On Nov 7, 2007, at 12:38 PM, Gabriel Landini wrote:

> On Wednesday 07 November 2007, Brendan H. wrote:
>> 1) When I rotate the image arbitrarily without iterating, I loose  
>> a bunch
>> of particles each time.
>
> Of course, you are rotating a square pixel array by a 5 degree angle!
>
> Your only option is to rotate the ROI.
>
> G.

--
Kenneth Sloan                                          
[hidden email]
Computer and Information Sciences                        +1-205-934-2213
University of Alabama at Birmingham              FAX +1-205-934-5473
Birmingham, AL 35294-1170                http://KennethRSloan.com/
Reply | Threaded
Open this post in threaded view
|

Re: Loosing Particles when Rotating Image

Gabriel Landini
On Wednesday 07 November 2007 20:54:07 Kenneth Sloan wrote:
> Excuse my ignorance of IJ internals (I'm just starting to use it) -
> but is it not possible to find ALL particles and then catagorize each
> one according to which ROI it lies in?  What I would look for is a
> routine that produced an array (or list) of particles annotated with
> x,y coordinates.  It would then be simple to step through that list
> and produced a histogram of #particles per angular bin.

Yes, that is possible, and I guess that it would be quite fast (only 1 call to
the particle analyzer).

Cheers,
G.
Reply | Threaded
Open this post in threaded view
|

Re: Loosing Particles when Rotating Image

Russell Kincaid
In reply to this post by Brendan H.
Dear imageJ users and Brendan H,

I have a plugin that might make this job easy. I sent earlier email to
Brendan but now I have the support documentation on my website and I'm
sharing my crazy masterpiece with you all.

I have a plugin to map a circle to a vertical line. my goal was to look
at the characteristics of the "edge", along the circle, and I wanted to
check each radial direction easily. Like Brendan, I would have needed to
rotate the image over and over again incrementally and this has been a
good solution to avoid that. One good thing about my plugin is that you
can adjust where you think the center of your circle is with the goal of
making (in the case of Brendan's task) all the particles line up in a
straight line.

Even if you don't get the particles in a straight line, the new image
coordinates can be easily converted to radius and angle (polar
coordinates), using the spot you picked as the center as the polar
origin. In the new image, the "x" distance is the radius and the "y"
distance is the angle. If this isn't obvious, let me know and I'll
explain completely.

I have made good instructions with nice pictures. I think this is all
pretty clear if you look at them. I've posted them at:
 http://www.phy.syr.edu/~rkincaid/PluginDescription_RadialDisk_Mapper080606.doc

The plugin is attached to this email. I apologize in advance, to the
great programmers who contribute to this listserv, for my hacked messy code.

My plugin can be tried out very easily. All you need is an image with a
circle on it and (essentially) you just click in the center and it draws
a new image! (The fourth option on the "alternatives" menu is to "Quit
the program".) The instructions say you need a 32 bit real image but it
worked just now with a *.jpg.

Please let me know if there are any questions. And, please let me know
what you think.

Sincerely,

Russell Kincaid


Brendan H. wrote:

> I have a series of images where a few thousand tiny particles form a circular ring, and I need a
> way to count the number of particles in a discrete fashion; i.e. form a 5 degree selection wedge
> (using the center of the ring as the vertex, and half the image width, which is slightly larger than
> the ring diameter, as the radii) that includes 5 degree's worth of particles, count them, then rotate
> the wedge by 5 degrees, and iterate.
>
> I'm having some troubles getting this to work however.  My first idea was to make the wedge,
> count the particles, rotate the image, and reiterate.  This keeps the wedge stationary, but "sweeps"
> the image past the selection, eventually counting all the particles in discrete steps.  I got the
> macro to work fine, but I noticed a few things:
>
> 1) When I rotate the image arbitrarily without iterating, I loose a bunch of particles each time.  E.g.
> when I do a total particle count before rotation, I get 1669 particles, but after one arbitrary
> rotation (43degrees in this case) the particle count drops to 1557.  My ring is centered in the
> square window, so the particles are not leaving the field of view; also 90 degree rotations do not
> yield a flux in the number of particles.  I noticed this problem because as I ran the macro, the
> particles got more "clumpy" with each small rotation; it's clearly an additive issue.
>
> 2) If I iterate when rotating, I have to re-threshold every rotation.  This has the same clumping
> effect (although much more severe) as the simple rotation.
>
> Anybody have any ideas?  I'm pretty stuck on this!!
>
> Thanks for your help,
> Brendan Hermalyn
>  

import ij.*;          /*  Russell Kincaid      */
import ij.process.*;  /*  [hidden email]     */
import ij.gui.*;      /* start August 4, 2006 */
import java.awt.*;    /*    hacked from        */
import ij.plugin.*;   /*  GridColValues_AquireN07.java  */

/*  added start at any angle (not just straight up) and appends to image name, Sept. 2, 2006  */
                       
import ij.plugin.filter.PlugInFilter;
import java.awt.event.*;

import ij.plugin.PlugIn;
import ij.plugin.filter.Duplicater;
import ij.ImagePlus;
import ij.ImagePlus.*;

import ij.text.TextPanel.*;
import ij.text.*;

import java.lang.*;
import java.math.*;
import java.math.BigDecimal;

        /*
        This plugin implements the MouseListener interface and listens
        for mouse events generated by the current image.
        */

        public class RadialDisk_MapperN06 implements PlugInFilter, MouseListener {
                ImagePlus img;
                ImageWindow win;
                ImageCanvas canvas;
                boolean done;
         
     ImageProcessor IprocMINE, IprocNEW;  
     ImagePlus IplusSHOW;
 
     int xCOL, yROW;
     double  thePixValue, theIncrement, theLimit,  moveSinPhase, RemoveSinAmplitude;
     int  theBestX, theBestY, centerXguess, centerYguess, numIncrements, newSizeXX;

     int numPixelsForRadius, numArcIncrements, startAngle;
     double arcIncrement, ddCOL, ddROW, INTERPcenterX, INTERPcenterY, Theta, incrementsPerRadialPixel;
     String startAngleString;
  int   CH = 0;
  String[] ChoiceN01 = {"I want to use the location I clicked on", "I want to input the center coordinates myself", "I want to modify the center coordinates using a sin function", "I want to QUIT the Program"};

      public int setup(String arg, ImagePlus img) {
                this.img = img;
                if (img!=null) {
                        win = img.getWindow();
                        win.running = true;
                }
                return DOES_ALL+NO_CHANGES;
        }

   public void run(ImageProcessor ip) {  

            IprocMINE = img.getProcessor();  /*  img is the ImagePlus  */

                ImageWindow win = img.getWindow();
                canvas = win.getCanvas();
                canvas.addMouseListener(this);
                if (!win.running)
                        {IJ.beep(); done=true; return;}

            IJ.showMessage("  \n   click on your estimate for the very center of the disk   \n \n   this need not be exact, just click the image  \n  \n   a mouse click is needed to drive the whole plugin  ");
            numPixelsForRadius = 300;        // hard wired to start
            arcIncrement = 0.25;             //  this is hard wired to start, IN DEGREES
            incrementsPerRadialPixel = 2;    //  to start I want to see better
                startAngle = 0;
            moveSinPhase = 0.0;
            RemoveSinAmplitude = 0.0;
  }

        public void mousePressed(MouseEvent e) {
                int x = e.getX();
                int y = e.getY();
                int offscreenX = canvas.offScreenX(x);
                int offscreenY = canvas.offScreenY(y);
              IJ.write(" your estimate for the center was  "+offscreenX+"  ,  "+offscreenY);

            centerXguess = offscreenX;
            centerYguess = offscreenY;   // initial guess


         GenericDialog gd24 = new GenericDialog("Alternatives");
           gd24.addChoice("What Now?: ", ChoiceN01, ChoiceN01[CH]);
           gd24.showDialog();
           CH = gd24.getNextChoiceIndex();

         if(CH == 0) { // start of    use the clicked coordinates
            INTERPcenterX = centerXguess;  
            INTERPcenterY = centerYguess;
         }   //  end of   use the clicked coordinates
         if(CH == 1) { // start of    input center coordinates myself

                     GenericDialog gd28 = new GenericDialog("Center Coordinates");
                       gd28.addNumericField("X coordinate, col: ", INTERPcenterX, 2);
                       gd28.addNumericField("Y coordinate, row: ", INTERPcenterY, 2);
                       gd28.showDialog();
                       INTERPcenterX = gd28.getNextNumber();
                       INTERPcenterY = gd28.getNextNumber();
         }   //  end of   input center coordinates myself


         if(CH == 2) { // start of    modify old coordinates by using sin function
            IJ.showMessage("  \n   you'll have two inputs,  look at the previous output image  \n  look for a sin curve increasing at first to the right as it moves down the screen  \n   \n   you need the phase (in degrees) that you want  \n  to shift the sin function DOWN the screen to ''correct'' it \n  and the amplitude of the sin curve you see  \n  \n  the plugin DOES take into account the radial scaling being used so don't worry about that");
            GenericDialog gd22 = new GenericDialog("Center Coordinates");
              gd22.addNumericField("phase shift sin (down, in degrees): ", moveSinPhase, 2);
              gd22.addNumericField("amplitude of the function (in pixels): ", RemoveSinAmplitude, 2);
              gd22.showDialog();
              moveSinPhase = gd22.getNextNumber();
            RemoveSinAmplitude = gd22.getNextNumber();
            Theta = ((2.0 * Math.PI) / 360) * (moveSinPhase);  /*  now in radians  */
            INTERPcenterX = INTERPcenterX + ((RemoveSinAmplitude/incrementsPerRadialPixel) * Math.cos(Theta)) ;  
              INTERPcenterY = INTERPcenterY - ((RemoveSinAmplitude/incrementsPerRadialPixel) * Math.sin(Theta)) ;
              IJ.write(" the new image was created with phase shift equals (down):   "+moveSinPhase+"  and amplitude equals,  "+RemoveSinAmplitude);

         }   //  end of   modify old coordinates by using sin function

         if(CH == 3) { // start of    end the program
             canvas.removeMouseListener(this);
             return;                           // this is the end of the program
         }      //  end of   end the program

                YesNoCancelDialog YesNoEND = new YesNoCancelDialog(win, "New Parameters?", "  Do you want to input parameters?     \n \n  (click NO to use previous or defaults) ");
                if(YesNoEND.yesPressed()) {  // start of ifYN
                     GenericDialog gd25 = new GenericDialog("Radial Mapping");
                       gd25.addNumericField("Start angle, reads integer value ONLY, zero is straight up: ", startAngle, 0);
                       gd25.addNumericField("Angular increment in degrees: ", arcIncrement, 3);
                       gd25.addNumericField("Acquire how many radial pixels from disk: ", numPixelsForRadius, 0);
                       gd25.addNumericField("How many new pixels per old radial pixel: ", incrementsPerRadialPixel, 1);
                       gd25.showDialog();
                     startAngle = (int) gd25.getNextNumber();
                       arcIncrement = gd25.getNextNumber();
                       numPixelsForRadius = (int) gd25.getNextNumber();
                       incrementsPerRadialPixel = gd25.getNextNumber();
                 
                }  // end of ifYN
                else  {  // start of elseYN
                       
                }  // end of elseYN


            numArcIncrements = (int) Math.rint(Math.ceil(360 / arcIncrement));
            newSizeXX = (int) Math.rint(Math.ceil(numPixelsForRadius * incrementsPerRadialPixel));
                ImageProcessor IprocNEW;
       IprocNEW = IprocMINE.createProcessor(newSizeXX, numArcIncrements);

            for (int iROW=0; iROW <= (numArcIncrements - 1);iROW++) { // this becomes the angle, clockwise from the startAngle
                  Theta = ((2.0 * Math.PI) / 360) * (startAngle + (iROW * arcIncrement));  /*  in radians  */
                  for (int iCOL=0; iCOL <= (newSizeXX - 1); iCOL++) { // this is scaled distance from center
                       ddCOL = INTERPcenterX + (Math.sin(Theta) * (iCOL / incrementsPerRadialPixel)) ;  // this real valued position on old image
                       ddROW = INTERPcenterY - (Math.cos(Theta) * (iCOL / incrementsPerRadialPixel)) ;  // remember starts at top so need neg sign                      
                       IprocNEW.putPixelValue(iCOL, iROW, findXYinterpPixel(IprocMINE, ddCOL, ddROW));
                  }
            }

            startAngleString = Integer.toString(startAngle);
            IplusSHOW = new ImagePlus(" Radial Profiles Start Angle "+startAngleString+" Degrees ", IprocNEW);
            IplusSHOW.show();

              IJ.write(" the new image was created using center equals (x,y):   "+INTERPcenterX+"  ,  "+INTERPcenterY);
              IJ.write(" and StartAngle of :   "+startAngle+" ,  arcIncrement :  "+arcIncrement+" ,  PixelRadius : "+numPixelsForRadius+" , IncPerOldRadialPixel : "+incrementsPerRadialPixel);

            IJ.showMessage("  \n   after clicking this message to remove it,  \n   look at the output image and decide how much you want to adjust the sin function  \n   then click the mouse on the original image   \n  \n   a mouse click is needed to drive the whole plugin  ");

        }  //  end of mousePressed

        public void mouseReleased(MouseEvent e) {
    }
        public void mouseExited(MouseEvent e) {
        }
        public void mouseClicked(MouseEvent e) {
        }
        public void mouseEntered(MouseEvent e) {
      }
     

public double findXYinterpPixel(ImageProcessor XYinterpIP, double XXCol, double YYRow)  {
 /*        inputs correct data into cubic spline routine
               to get new pixel value, where x and y are real
               and will be fit using four consecutive "x's" and "y's" in a row     */
         double XYvaluePIX, XYvalue1, XYvalue2, XYvalue3, XYvalue4;           //  I need two sets of four variables and a pixel value
         double XYpixValInterp, Pv1InterpXY, Pv2InterpXY, Pv3InterpXY, Pv4InterpXY;
         XYpixValInterp  = 0.0;   // for now I assume I have two pixels on all sides
         int xTruncXY = (int) Math.rint(XXCol - 0.5); // rint converts to a double that = an int
         int yTruncXY = (int) Math.rint(YYRow - 0.5); // rint converts to a double that = an int

         Pv1InterpXY = XYinterpIP.getPixelValue((xTruncXY - 1), yTruncXY - 1);  
         Pv2InterpXY = XYinterpIP.getPixelValue((xTruncXY), yTruncXY - 1);
         Pv3InterpXY = XYinterpIP.getPixelValue((xTruncXY + 1), yTruncXY - 1);
         Pv4InterpXY = XYinterpIP.getPixelValue((xTruncXY + 2), yTruncXY - 1);  /*  in the middle, expect  1 < x < 2  */
         XYvalue1 = findWithCubicSplines(Pv1InterpXY, Pv2InterpXY, Pv3InterpXY, Pv4InterpXY, (XXCol - xTruncXY + 1));

         Pv1InterpXY = XYinterpIP.getPixelValue((xTruncXY - 1), yTruncXY);  
         Pv2InterpXY = XYinterpIP.getPixelValue((xTruncXY), yTruncXY);
         Pv3InterpXY = XYinterpIP.getPixelValue((xTruncXY + 1), yTruncXY);
         Pv4InterpXY = XYinterpIP.getPixelValue((xTruncXY + 2), yTruncXY);  /*  in the middle, expect  1 < x < 2  */
         XYvalue2 = findWithCubicSplines(Pv1InterpXY, Pv2InterpXY, Pv3InterpXY, Pv4InterpXY, (XXCol - xTruncXY + 1));

         Pv1InterpXY = XYinterpIP.getPixelValue((xTruncXY - 1), yTruncXY + 1);  
         Pv2InterpXY = XYinterpIP.getPixelValue((xTruncXY), yTruncXY + 1);
         Pv3InterpXY = XYinterpIP.getPixelValue((xTruncXY + 1), yTruncXY + 1);
         Pv4InterpXY = XYinterpIP.getPixelValue((xTruncXY + 2), yTruncXY + 1);  /*  in the middle, expect  1 < x < 2  */
         XYvalue3 = findWithCubicSplines(Pv1InterpXY, Pv2InterpXY, Pv3InterpXY, Pv4InterpXY, (XXCol - xTruncXY + 1));

         Pv1InterpXY = XYinterpIP.getPixelValue((xTruncXY - 1), yTruncXY + 2);  
         Pv2InterpXY = XYinterpIP.getPixelValue((xTruncXY), yTruncXY + 2);
         Pv3InterpXY = XYinterpIP.getPixelValue((xTruncXY + 1), yTruncXY + 2);
         Pv4InterpXY = XYinterpIP.getPixelValue((xTruncXY + 2), yTruncXY + 2);  /*  in the middle, expect  1 < x < 2  */
         XYvalue4 = findWithCubicSplines(Pv1InterpXY, Pv2InterpXY, Pv3InterpXY, Pv4InterpXY, (XXCol -xTruncXY + 1));

         XYpixValInterp = findWithCubicSplines(XYvalue1, XYvalue2, XYvalue3, XYvalue4, (YYRow - yTruncXY +1));

         Pv1InterpXY = XYinterpIP.getPixelValue((xTruncXY - 1), yTruncXY - 1);  
         Pv2InterpXY = XYinterpIP.getPixelValue((xTruncXY - 1), yTruncXY);
         Pv3InterpXY = XYinterpIP.getPixelValue((xTruncXY - 1), yTruncXY + 1);
         Pv4InterpXY = XYinterpIP.getPixelValue((xTruncXY - 1), yTruncXY + 2);  /*  in the middle, expect  1 < x < 2  */
         XYvalue1 = findWithCubicSplines(Pv1InterpXY, Pv2InterpXY, Pv3InterpXY, Pv4InterpXY, (YYRow - yTruncXY + 1));

         Pv1InterpXY = XYinterpIP.getPixelValue((xTruncXY), yTruncXY - 1);  
         Pv2InterpXY = XYinterpIP.getPixelValue((xTruncXY), yTruncXY);
         Pv3InterpXY = XYinterpIP.getPixelValue((xTruncXY), yTruncXY + 1);
         Pv4InterpXY = XYinterpIP.getPixelValue((xTruncXY), yTruncXY + 2);  /*  in the middle, expect  1 < x < 2  */
         XYvalue2 = findWithCubicSplines(Pv1InterpXY, Pv2InterpXY, Pv3InterpXY, Pv4InterpXY, (YYRow - yTruncXY + 1));

         Pv1InterpXY = XYinterpIP.getPixelValue((xTruncXY + 1), yTruncXY - 1);  
         Pv2InterpXY = XYinterpIP.getPixelValue((xTruncXY + 1), yTruncXY);
         Pv3InterpXY = XYinterpIP.getPixelValue((xTruncXY + 1), yTruncXY + 1);
         Pv4InterpXY = XYinterpIP.getPixelValue((xTruncXY + 1), yTruncXY + 2);  /*  in the middle, expect  1 < x < 2  */
         XYvalue3 = findWithCubicSplines(Pv1InterpXY, Pv2InterpXY, Pv3InterpXY, Pv4InterpXY, (YYRow - yTruncXY + 1));

         Pv1InterpXY = XYinterpIP.getPixelValue((xTruncXY + 2), yTruncXY - 1);  
         Pv2InterpXY = XYinterpIP.getPixelValue((xTruncXY + 2), yTruncXY);
         Pv3InterpXY = XYinterpIP.getPixelValue((xTruncXY + 2), yTruncXY + 1);
         Pv4InterpXY = XYinterpIP.getPixelValue((xTruncXY + 2), yTruncXY + 2);  /*  in the middle, expect  1 < x < 2  */
         XYvalue4 = findWithCubicSplines(Pv1InterpXY, Pv2InterpXY, Pv3InterpXY, Pv4InterpXY, (YYRow - yTruncXY + 1));


         XYpixValInterp = XYpixValInterp +  findWithCubicSplines(XYvalue1, XYvalue2, XYvalue3, XYvalue4, (XXCol - xTruncXY +1));
         XYpixValInterp = (XYpixValInterp / 2.0);

    /*  makes a pretty picture to use instead of using the 47 lines of code above...  
         XYpixValInterp = XXCol * YYRow;   */

         return XYpixValInterp;
}

public double findWithCubicSplines(double I_y0, double I_y1, double I_y2, double I_y3, double I_x) {
        /* This finds the missing value in a cubic polynomial if four neighbors in a row
           are known.  It follows from Newton's interpolation formula, MAT581 10/15/02,
           and from my lab notes 6/23/05.  Modified 7/9/05 for input of I_x     */
 
          double x1 = 0.0;  /* the "y" inputs come from four "x's" in a row */
          double x2 = 1.0;
          double x3 = 2.0;
          double x4 = 3.0;
          double x = I_x;   /* this must be indexed as one should imagine from the "x's" */
          double y1 = I_y0;
          double y2 = I_y1;
          double y3 = I_y2;
          double y4 = I_y3;  /* from here on down the code is generic */
          double C1 = y1;
          double C2 = (y2 - C1)/(x2 - x1);
          double C3 = (  (y3 - C1 - (C2 * (x3 - x1))) / ((x3 - x1)*(x3 - x2))  );
          double C4 = ((y4-C1-(C2*(x4-x1))-(C3*((x4-x1)*(x4-x2))))/((x4-x1)*(x4-x2)*(x4-x3)));
          double y5 = (C1+ (C2*(x-x1)) +(C3*((x-x1)*(x-x2))) +(C4*((x-x1)*(x-x2)*(x-x3)))  );
          return y5;
}


}


Reply | Threaded
Open this post in threaded view
|

Problems While Using Command Line

Alphonso Magri
I am attempting to run a custom made plugin on many different image  
sets and tried making  a macro to do this. I found that after the  
second image set ImageJ crashes. The image sets are very large so this  
crash usually occurs after 1.5 days of running. I then looked for an  
automated way to open ImageJ, run the plugin twice, then close imageJ  
and repeat the process. I found that I can use a terminal on my Mac  
and call ImageJ and a macro. I do so by typing something like...

"cd /Applications/ImageJ_1_37; java -jar ij.jar -batch Trial_run_1".

I found that this can work for macros that do not call custom made  
plugins, and when I try to call my plugin from the macro which I call  
from the command line I get an error like...

"Unrecognized command: Fitting algo", where Fitting algo is the name  
of my custom plugin.

Why is it incapable of recognizing the plugin?

The plugin is already complied and has a class file. To add to my  
confusion when I double click on the ij.jar file I get ImageJ with a  
plugins tab pull down menu full of plugins, however when I call ImageJ  
from the command line I find that the pull down menu for the plugins  
tab empty of plugins.

Is there a way to call ImageJ from the Command line and being able to  
recognize custom plugins? Does anyone have another suggestion to solve  
my problem?

Alphonso
Reply | Threaded
Open this post in threaded view
|

Re: Problems While Using Command Line

ctrueden
Hi Alphonso,

By default, ImageJ looks for plugins in the plugins subfolder of the current
working directory. The problem you describe sounds like your working
directory is different than /Applications/ImageJ.

I tried "cd /Applications/ImageJ; java -jar ij" on my Mac and the plugins
show up.

However, from my home directory, "java -jar /Applications/ImageJ/ij.jar"
results in an empty plugins list.

It is also possible to manually specify the path to the plugins folder. The
following works on my machine regardless of the current working directory:

java -Dplugins.dir=/Applications/ImageJ/plugins -jar
/Applications/ImageJ/ij.jar

-Curtis

On Thu, Mar 20, 2008 at 10:48 AM, Alphonso Magri <[hidden email]> wrote:

> I am attempting to run a custom made plugin on many different image
> sets and tried making  a macro to do this. I found that after the
> second image set ImageJ crashes. The image sets are very large so this
> crash usually occurs after 1.5 days of running. I then looked for an
> automated way to open ImageJ, run the plugin twice, then close imageJ
> and repeat the process. I found that I can use a terminal on my Mac
> and call ImageJ and a macro. I do so by typing something like...
>
> "cd /Applications/ImageJ_1_37; java -jar ij.jar -batch Trial_run_1".
>
> I found that this can work for macros that do not call custom made
> plugins, and when I try to call my plugin from the macro which I call
> from the command line I get an error like...
>
> "Unrecognized command: Fitting algo", where Fitting algo is the name
> of my custom plugin.
>
> Why is it incapable of recognizing the plugin?
>
> The plugin is already complied and has a class file. To add to my
> confusion when I double click on the ij.jar file I get ImageJ with a
> plugins tab pull down menu full of plugins, however when I call ImageJ
> from the command line I find that the pull down menu for the plugins
> tab empty of plugins.
>
> Is there a way to call ImageJ from the Command line and being able to
> recognize custom plugins? Does anyone have another suggestion to solve
> my problem?
>
> Alphonso
>