Re: Normalising XY data by Z-direction in stacks

Posted by Michael Schmid on
URL: http://imagej.273.s1.nabble.com/Normalising-XY-data-by-Z-direction-in-stacks-tp3685096p3685100.html

Hi James,

stepping through the pixels one by one in a macro is slower than the  
corresponding ImageJ functions written in java.
This macro avoids the loops:

   run("32-bit");
   original = getImageID();  //remember this image
   run("Z Project...", "start=1 stop=36 projection=[Min Intensity]");
   minimum = getImageID();   //reference to the output image created
   selectImage(original);
   run("Z Project...", "start=1 stop=36 projection=[Max Intensity]");
   maximum = getImageID();
   imageCalculator("subtract create", maximum, minimum); //maxValue-
minValue
   difference = getImageID();
   imageCalculator("subtract stack", original, minimum); //pixel-
minValue
   imageCalculator("divide stack", original, difference);
   // now we have (pixel-minValue)/(maxValue-minValue)
   selectImage(maximum);
   close();
   selectImage(minimum);
   close();
   selectImage(difference);
   close();


Michael
________________________________________________________________

On 7 Apr 2011, at 16:33, James Cleverley wrote:

> Thanks Neil, That was all the pointer I needed to get a modified  
> version of your code snippet to do what I needed.  Next will be to  
> think about effective processing order to maximise speed .... Code  
> below if anyone is interested:
>
> // Make sure image accepts floating point values
>
> run("32-bit");
>
> // get image width x
> x = getWidth;
> // get image height y
> y = getHeight;
> // get image depth z
> z = nSlices;
>
> for (i=0; i < x; i++){
>   for (j=0; j < y; j++){
>     // Get max and min value in the x-y coord
>     maxValue = 0;
>     minValue = 10000;
>     for (k=1; k <= z; k++){
>
>       setSlice(k);
>       currValue = getPixel(i, j);
>       if (currValue > maxValue){
>         maxValue = currValue;
>       }
>       if (currValue < minValue){
>         minValue = currValue;
>       }
>     }
>     // Set new value normalised to max value
>     for (k=1; k <= z; k++){
>       setSlice(k);
>       currPixelValue = getPixel(i,j);
>       newPixelValue = (currPixelValue-(minValue))/(maxValue-minValue);
>       putPixel(i, j, (newPixelValue));
>     }
>   }
> }
>
> Much appreciated,
>
> Cheers
>
> James
>
> Dr James Cleverley
> Senior Geochemist
> Stream Leader | Mineral Systems & Targeting
> Minerals Down Under Research Flagship
> CSIRO Earth Science & Resource Engineering
> Phone: +61 864368714 | Mobile: 0408 180972
> [hidden email] | www.csiro.au | www.csiro.au/
> Address: Australian Resources Research Centre, PO Box 1130,  
> Bentley, WA, 6102
>
> PLEASE NOTE
> The information contained in this email may be confidential or  
> privileged. Any unauthorised use or disclosure is prohibited. If  
> you have received this email in error, please delete it immediately  
> and notify the sender by return email. Thank you. To the extent  
> permitted by law, CSIRO does not represent, warrant and/or  
> guarantee that the integrity of this communication has been  
> maintained or that the communication is free of errors, virus,  
> interception or interference.
> Please consider the environment before printing this email.
>
> -----Original Message-----
> From: ImageJ Interest Group [mailto:[hidden email]] On Behalf  
> Of Thomson Neil (EAST KENT HOSPITALS UNIVERSITY NHS FOUNDATION TRUST)
> Sent: Thursday, 7 April 2011 20:51
> To: [hidden email]
> Subject: Normalising XY data by Z-direction in stacks
>
> Hi James
>
> I don't know your background, so forgive me if I'm way off the mark...
>
> This should be a pretty trivial problem with some coding. If you  
> haven't looked at the developer<http://rsbweb.nih.gov/ij/developer/ 
> index.html> section of he ImageJ website, have a look now. If  
> you've never done any programming then writing a Java plugin might  
> be a bit scary, but the macro language <http://rsbweb.nih.gov/ij/ 
> developer/macro/macros.html> should so the trick.
>
> This macro-code snippet might give you an idea on normalisation:
>
> // Make sure image accepts floating point values
> run("32-bit");
> // get image width x
> // get image height y
> // get image depth z
> for (i=0; i < x; i++){
>   for (j=0; i < y; j++){
>     // Get max value in the x-y coord
>     maxValue = 0;
>     for (k=0; i < z; k++){
>       setSlice(k);
>       currValue = getPixel(x, y);
>       if (currValue > maxValue){
>         maxValue = currValue;
>       }
>     }
>     // Set new value normalised to max value
>     for (k=0; i < z; k++){
>       setSlice(k);
>       setValue(x, y, getPixel(x, y)/maxValue);
>     }
>   }
> }
>
> Neil
>
> Neil Thomson,
> Nuclear Medicine Physics Section,
> Medical Physics,
> Kent and Canterbury Hospital,
> UK. CT1 3NG
> +44 (0) 1227 766877
>
> **********************************************************************
> **********************************************
>
> This message may contain confidential information. If you are not  
> the intended recipient please inform the
> sender that you have received the message in error before deleting it.
> Please do not disclose, copy or distribute information in this e-
> mail or take any action in reliance on its contents:
> to do so is strictly prohibited and may be unlawful.
>
> Thank you for your co-operation.
>
> NHSmail is the secure email and directory service available for all  
> NHS staff in England and Scotland
> NHSmail is approved for exchanging patient data and other sensitive  
> information with NHSmail and GSi recipients
> NHSmail provides an email address for your career in the NHS and  
> can be accessed anywhere
> For more information and to find out how you can switch, visit  
> www.connectingforhealth.nhs.uk/nhsmail
>
> **********************************************************************
> **********************************************