Login  Register

Re: Problem with Maximum intensity projection

Posted by Michael Schmid on Mar 23, 2018; 7:49pm
URL: http://imagej.273.s1.nabble.com/Problem-with-Maximum-intensity-projection-tp5020309p5020328.html

Hi Fred,

also for a hyperstack, you can have an initial loop to get the stack
indices:

   int nFrames = imp.getNFrames();
   ImageProcessor[] inIps = new ImageProcessor[nFrames];
   for (int frame = 1; frame <= nFrames; frame++)
     inIps = stack.getProcessor(getStackIndex(channel, slice, frame));

   double[] fitData = new double[nFrames];

Then you can have the loop over y, x as in my previous example, then the
inner loop
       for (int i=0; i<nFrames; i++)
          fitData[i] = inIps[i].getPixelValue(x, y);

The ImageProcessor.getPixelValue function is needed if you have pixel
value calibration and/or want to support all types of ImageProcessors,
otherwise there are faster calls available. If you want to fit the data,
most computing time goes into the fitting, so there is no point in
trying to have very fast code here, anyhow.

Michael
________________________________________________________________
On 23/03/2018 20:26, Fred Damen wrote:

> Thanks for the info, but all of what I do is in the frame direction of a
> hyperstack; the z direction is just another one of the indices to a voxel of
> data.  As far as I can tell, for hyperstacks, there is no way around using
> imp.getStackIndex in the middle of the inner loop.
>
> Thanks,
>
> Fred
>
>
> On Fri, March 23, 2018 1:22 pm, Michael Schmid wrote:
>> Hi Fred,
>>
>> for getting the values along the z direction, e.g. for fitting, you can
>> do the following:
>>
>>           int nSlices = stack.getSize();
>>           ImageProcessor[] inIps = new ImageProcessor[nSlices];
>>           for (int i=0; i<nSlices; i++)
>>               inIps[i] = stack.getProcessor(i+1);
>>           Calibration cal = imp.getCalibration();
>>           double[] zData = new double[nSlices];
>>           for (int i=0; i<nSlices; i++)
>>               zData[i] = cal.getZ(i);
>>
>>           double[] fitData = new double[nSlices];
>>           for (int y=0; y<height; y++) {
>>               IJ.showProgress((double)y/height);
>>               for (int x=0; x<width; x++) {
>>                   double[] params = null;
>>                   for (int i=0; i<nSlices; i++)
>>                       fitData[i] = inIps[i].getPixelValue(x, y);
>>                       // do the fit for fitData over zData
>>                   }
>>               }
>>           }
>>
>> Somewhere I have a Stack_Fitter plugin, I'll upload it to
>> http://imagejdocu.tudor.lu
>>
>> Michael
>> ________________________________________________________________
>> On 23/03/2018 18:32, Fred Damen wrote:
>>> Greetings,
>>>
>>> I would like to second Kenneth's frustration with my version of fetching the
>>> requisite values:
>>>
>>>     for(int iz=0; iz<nz; iz++) {
>>>         IJ.showStatus("NonLinearFit: z="+iz);
>>>         IJ.showProgress(((float)iz)/nz);
>>>
>>>         for(int ix=0; ix<nx; ix++)
>>>            for(int iy=0; iy<ny; iy++) {
>>>               for(int if=0; if<nf; if++)
>>>                  y[if] =
>>> ((FloatProcessor)is.getProcessor(imp.getStackIndex(1,iz+1,if+1))).getf(ix,iy);
>>>                  process(x,y);
>>>               }
>>>         }
>>>
>>> Ages ago, I tried using the various getVoxel(s) methods to no avail.  If
>>> memory serves, they would always return the same value. So once I got the
>>> aforementioned code working I just copy and paste every time I need it;
>>> which
>>> is always.
>>>
>>> I would assume that this inner loop can be done extremely more efficiently
>>> under the hood than through the interface, i.e., repeated calls to
>>> is.getProcessor and imp.getStackIndex are not free; notice the need for
>>> showStatus and showProgress. Can the  getVoxels and setVoxels methods that
>>> include the frame dimension be included.
>>>
>>> Thanks for listening,
>>>
>>> Fred
>>>
>>>
>>> On Fri, March 23, 2018 11:30 am, Kenneth Sloan wrote:
>>> ...
>>>> Obligatory question: I tried to use getVoxels - but failed miserably.
>>>> After a
>>>> few attempts, I just
>>>> rolled my own.
>>>>
>>>> This is slower than dirt - but I hope it's clear.
>>>>
>>>> And, as always - I welcome corrections to my chronic mis-understanding of
>>>> the
>>>> API.
>>>>    --
>>>> Kenneth Sloan
>>>> [hidden email]
>>>> Vision is the art of seeing what is invisible to others.
>>> ...
>>>
>>> --
>>> ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>>>
>>
>> --
>> ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>>
>
> --
> ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html