Login  Register

Re: Problem with Maximum intensity projection

Posted by Fred Damen on Mar 23, 2018; 7:26pm
URL: http://imagej.273.s1.nabble.com/Problem-with-Maximum-intensity-projection-tp5020309p5020326.html

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