TITLE: Automating imageJ leaf area processing
DATE: 2017-10-12
AUTHOR: John L. Godlee
====================================================================


Last year when I was working at the University of Exeter I was
involved in a project that was measuring hydraulic properties of
leaves from Amazonian trees that had been droughted or not
droughted, as part of the long running DRYFLOR experiment in the
Baia de Caxiuana in Brazil.

I had ~1800 leaves that we scanned to measure their leaf area. The
method I've used in the past uses imageJ to threshold the image,
then analyse contiguous blocks of black and white to get the area,
so I wanted to continue using the program I was comfortable with.
However, I wasn't looking forward to the prospect of measuring the
leaf area of that many leaves so I looked into using the macro
language for imageJ to automate the process.

You can find the macro I used saved as a .ijm file here, and I have
another macro that also counts the number of leaf objects in each
image here

 [here](https://johngodlee.xyz/files/imagej/LeafArea.ijm)
 [1](https://johngodlee.xyz/files/imagej/LeafArea_Count.ijm)

Tips for scanning leaves for use in imageJ

-   One Scan per sample unit - normally a leaf or a branch of
leaves - aids automation
-   Decide on a standard DPI for all scans - 300DPI is fine
-   Try to get the leaf as close to the middle of the page as
possible
-   Make sure to add a ruler or something of known size in the scan
area, so you can set your scale
-   Make sure to clean the scanner glass and cover frequently to
stop bits of sap sticking to it
-   Name all scans with the sample number and _1 _2 _3 etc. if
multiple scans per sampling unit
-   Label each scan with a written label on the image just in case
the image names go weird
-   Once the images are scanned, open them up in paint and manually
remove any elements connected to your leaf that you don't want to
include in your analysis by painting them white, e.g. petioles,
dead leaf areas.

Manual imageJ leaf area

1.  Open image
2.  Convert to 8 bit [Image > Type > 8-bit]
3.  Preserve only the leaf using the Threshold [Image > Adjust >
Threshold > Move sliders > Apply]
4.  Draw a line of known length over the image scale bar then set
the scale [Analyze > Set Scale… > Change “Known Distance” and
“Unit of length”] Set Global if all images from then on will
have the same scale
5.  Get the area [Analyze > Analyze Particles… > Check Display
Results]
6.  There might be lots of small particles but if the thresholding
was done correctly then the leaf should be the largest by far. Can
also choose “Show outlines” to get an image with the numbers
written on it in red, which correspond to those on the table.

Preparing images for imageJ automated macro

-   To automate leaf area calculation, all images must have the
same resolution. Resolution can be changed in Adobe Photoshop using
an Action:

1.  Open an image in Photoshop
2.  Select Windows -> Actions
3.  Select "Create New Action"
4.  Give the Action an appropriate name and select "Record"
5.  Select Image -> Image Size...
6.  Change "Resolution" to 300
7.  Select "OK"
8.  Select File -> Save As...
9.  Select an appropriate location
10. Change "Format:" to JPEG
11. Go back to the Actions panel and select the Stop button
12. Select File -> Automate -> Batch...
13. Select the recently created Action from the dropdown menu
14. Under "Source:" choose where your images are stored
15. Under "Destination:" choose where your new images will be stored
16. Check the box labelled "Override Action "Save As" Commands"
17. Create an appropriate File Naming system, e.g. "document name"
+ "extension"
18. Select "OK"
19. Check that new images are the desired resolution by opening
some and selecting Image -> Image Size...

Analyzing in imageJ using automated macro

1.  Open ImageJ
2.  Select Process -> Batch -> Macro…
3.  Select the appropriate input and output files
   -   Input should be where your images are
   -   Output should be where you want any files generated by the
macro to go
4.  Insert the following code into the large box, can also be
loaded from LeafArea.ijm file:

   // Calculate area of dark objects (leaves) against white
background.
   // 79.7619px/cm a4-200dpi.
   // 120.006px/cm a4-300dpi.
   // Change `size min` to analyse smaller objects, but increase
noise

   run("8-bit");
   setAutoThreshold("Default");
   //run("Threshold...");
   //setThreshold(0, 146);
   setOption("BlackBackground", false);
   run("Convert to Mask");
   run("Set Scale...", "distance=120.006 known=1 pixel=1 unit=cm
global");
   run("Analyze Particles...", "size=0.70-Infinity show=Outlines
display add");
   setOption(“Display Label”, true)

5.  Under "Output Format" selecgt "8 bit TIFF" to generate a file
for each image containing outlines of all objects analysed. Use
these to check that the macro worked properly.
6.  Select "Process" and wait for the macro to finish.
7.  A window should open containing a list of objects, their areas,
and the file in which the objects were found. The results in this
window can be copied and pasted into an excel file for analysis.

Customising the ImageJ automated leaf area macro

-   setThreshold(... is the minimum and maximum grey values to be
selected for the image analysis. These values can be generated by
doing a manual threshold and moving the sliders until only the
leaves are highlighted.

-   distance=... is a distance given in pixels used to set the
scale of the image. 120 is for 1 cm in a 300dpi a4 image. This
value can be generated by manually setting the scale in ImageJ.

-   known=... is the real distance that the "distance" value
inhabits in the image.

-   size=...-... is the minimum and maximum object size that will
be analyzed by ImageJ with units of the scale specified by
"distance" and "known".

-   circularity=...-... is the minimum and maximum object
circularity that will be analyzed, with 0 being a straight line and
1 being a perfect circle, useful for excluding rulers in the
analysis. Could also be used to measure features on the leaves such
as smut fungi, tar spots etc.