After completing this lesson, learners should be able to:
Use for loops to repeat operations multiple times
Running a script for multiple files
Motivation
In an imaging processing workflow you often apply the same operation to several images, several labels, etc. In order to avoid repeating the same code many times we can use control flow statements such as a for loop. Loops together with if clauses represent extremely useful tools when programming.
Concept map
graph TD
A["Previous code"] --> Loop{"Check condition"}
Loop --> |Condition is valid| RepeatChunk("Code chunk to be repeated")
RepeatChunk --> Loop
Loop --> |Condition is not valid| NextChunk("Next code to run")
Figure
In a control flow statement a piece of code is repeated (loop) as long as a specific condition is valid.
For loop
A for loop occurs by iterating over a loop variable defined in a loop header. You use for loops when you know the number of iterations to execute.
While loop
While loop does not have a fixed number of iterations. Typically the header contains a condition that is computed within the body of the loop.
TODO.
Activities
For loop basics
Open a script editor.
Open and run a script that contains several repeated operations and explain that you would like to write this part of code in a more simple way.
Explain the different elements of a numeric for loop:
The loop header, the loop counter/variable, and body
The initial and end condition
How the counter is iterated (e.g. i++).
Using a print command show how the iterator changes
Take the starting script and modify it using a for loop
Show activity for:
ImageJ Macro, loop structure
// Before the loopprint("Starting the process");// We use for loop to print the processing status of 10 imagesfor(i=0;i<10;i++){// we are using string concatenation to make this messageprint("Index: "+i);}// After processingprint("Process completed");// Self referencing variablecounter=1;print("counter "+counter);counter=counter+1;print("counter "+counter);// is equivalent tocounter=1;print("counter "+counter);counter++;print("counter "+counter);// You can also have a loop in a loopfor(j=0;j<10;j++){for(i=0;i<10;i++){// we are using string concatenation to make this messageprint("Index big loop "+j+"; index small loop "+i);}}
ImageJ Macro, example no loop
// Macro to measure closest, furthest and mean distance of labels to each other// This is what we would do when recording a macrorun("Close All");open("https://github.com/NEUBIAS/training-resources/raw/master/image_data/xy_16bit_labels__nuclei.tif");rename("labels");run("Duplicate...","title=binary");run("Manual Threshold...","min=1 max=1");run("Convert to Mask");run("Invert");run("Chamfer Distance Map","distances=[Chessknight (5,7,11)] output=[16 bits] normalize");run("Intensity Measurements 2D/3D","input=binary-dist labels=labels mean max min");Table.rename("binary-dist-intensity-measurements","dist_label"+labelID);
ImageJ Macro, example with loop
// Macro to measure closest, furthest and mean distance of labels to each other// This is a version with a looprun("Close All");open("https://github.com/NEUBIAS/training-resources/raw/master/image_data/xy_16bit_labels__nuclei.tif");rename("labels");// Explain how to find maximal value of loopgetRawStatistics(nPixels,mean,min,max,std,histogram);for(i=0;i<max;i++){run("Duplicate...","title=binary");labelID=i+1;run("Manual Threshold...","min="+labelID+" max="+labelID);run("Convert to Mask");run("Invert");run("Chamfer Distance Map","distances=[Chessknight (5,7,11)] output=[16 bits] normalize");run("Intensity Measurements 2D/3D","input=binary-dist labels=labels mean max min");close("binary");close("binary-dist");Table.rename("binary-dist-intensity-measurements","dist_label"+labelID);}