Page MenuHomec4science

II-c Threshold
Updated 1,985 Days AgoPublic

Some considerations regarding a very classic method : Thresholding

Why bother using Thresholds ?

Because you would like to identify different kind of objects within your image

Should I fix a value an apply the same to all my images?

You can run the code below in ImageJ and see why it may not be such a good idea.

// clear the environment
run("Close All");
run("Clear Results")
roiManager("Reset");
// Set the measurements of intererest
run("Set Measurements...", "area mean standard min limit display redirect=None decimal=3");


run("Gel (105K)");
rename("Original");

waitForUser("There are several factors than can create variability in acquisition,"+
		"\nthat will make grey levels a little bit different"+
		"\nfrom one image to another even if the object is the same."
		);
			
run("Gel (105K)");
rename("Lower");
run("Add...", "value=-8");

run("Gel (105K)");
rename("Higher");
run("Add...", "value=25");

run("Tile");

waitForUser("Let's now look at the corresponding histograms");

image_Nbr = nImages;
for (i = 1 ; i <= image_Nbr ; i++){
	selectImage(i);
	run("Histogram");
}

run("Tile");
waitForUser("We can see that 'min' and 'max' are different for the 3 images"+
			"\nBUT the histograms are equivalent."+
			"\nLet's apply an arbitrary threshold on the images, like 81 ! "
			);

for (i = 1 ; i <= image_Nbr ; i++){
	selectImage(i);
	setThreshold(0, 81);
	run("Measure");
}	

waitForUser("We can see that '81' is maybe note the 'right' value for all the images"+
			"\nLet's apply the same algorithm threshold on the images (Shanbhag)"
			);

for (i = 1 ; i <= image_Nbr ; i++){
	selectImage(i);
	setAutoThreshold("Shanbhag");
	run("Measure");
}	
	
waitForUser("We can now realize that the Area is the same for all the images"+
		"\nwhile other parameters (like the mean) can show difference."+
		"\nThat's why we like so much 'Auto_Thresholding'"+
		"\nit's able to compensate for small fluctuations between images"+
		"\nand still robust results."+
		"\n..."+
		"\nLet's see now what happen if you work with saturated images."
		);

selectImage("Lower");
setMinAndMax(50, 255);
run("Apply LUT");

selectImage("Higher");
setMinAndMax(0, 200);
run("Apply LUT");

selectImage("Histogram of Lower");
close();
selectImage("Histogram of Higher");
close();

for (i = 2 ; i <= image_Nbr ; i++){
	selectImage(i);
	run("Histogram");
}

run("Tile");

waitForUser("With 'some' saturation we see that the histograms are dramatically affected"+
		"\nLet's check the result of thresholding."
		);
			
for (i = 1 ; i <= image_Nbr ; i++){
	selectImage(i);
	setAutoThreshold("Shanbhag");
	run("Measure");
}

waitForUser("Nothing has much more sense anymore...");

How do I choose an Algorithm ?

You can run the code below in ImageJ and know more about the Automatic Methods that exist to determine a threshold.

// clear the environment
run("Close All");
roiManager("Reset");

//open an image
run("Fly Brain (1MB)");
// make it composite, duplicate one slice and get information
run("Make Composite");
run("Duplicate...", "duplicate channels=1 slices=27");
getDimensions(width, height, channels, slices, frames);

// here we run the Auto_Threshold 
run("Auto Threshold", "method=[Try all] white");
getDimensions(output_Width, output_Height, output_channels, output_slices,output_frames);

// I will highlith the categories with some ROIs of different colors
xSize = 258;
ySize = 274;
// so I define the categories and their colors
//arrayCatNbr = newArray(1,2,3,1,  2,1,1,3  ,1,2,1,2  ,1,2,2,1);
//Mod from 2018/06/12 to account for new auto threshold method
arrayCatNbr = newArray(1,2,2,1, 1,2,1,2,2,3,1,1,2,1,3,2,1);

arrayRoiColor = newArray("50FFFF00", "5000FF00", "50FF00FF");
// adding ROIs
i = 0;	
	for (y = 0 ; y < output_Height ; y+=ySize){
		for (x = 0 ; x < output_Width ; x+=xSize){
			if(i<lengthOf(arrayCatNbr)) {
				makeRectangle(x, y, xSize, ySize);
				Roi.setName("Cat-"+arrayCatNbr[i]);
				Roi.setFillColor(arrayRoiColor[arrayCatNbr[i]-1]);
				roiManager("Add");
				i++;
			}
		}
}
// Sort the ROi and Tile the images
roiManager("Sort");
run("Tile");
selectImage("Montage")
roiManager("Show All");

or using ROIs as an ouput :

// clear the environment
run("Close All");
roiManager("Reset");

//open an image
run("Fly Brain (1MB)");
// make it composite, duplicate one slice and get information
run("Make Composite");
run("Duplicate...", "duplicate channels=1 slices=27");
getDimensions(width, height, channels, slices, frames);

threshold_List = getList("threshold.methods");

for (i = 0 ; i < lengthOf(threshold_List) ; i++){
	currentThresholdName = threshold_List[i];
	setAutoThreshold(currentThresholdName+" dark");
	run("Create Selection");
	if (selectionType >= 0){
		Roi.setName(threshold_List[i]);
		roiManager("Add");
	}
}

roiManager("Show None");
waitForUser("Select ROIs in the roiManager to look at the different results");
Last Author
oburri
Last Edited
Dec 3 2018, 10:46

Event Timeline

romainGuiet created this document.Oct 25 2017, 08:48
romainGuiet edited the content of this document. (Show Details)
romainGuiet changed the title from Threshold to II-c Threshold.Oct 25 2017, 08:54
romainGuiet edited the content of this document. (Show Details)
romainGuiet edited the content of this document. (Show Details)
romainGuiet edited the content of this document. (Show Details)Oct 25 2017, 12:32
romainGuiet edited the content of this document. (Show Details)
romainGuiet edited the content of this document. (Show Details)
romainGuiet edited the content of this document. (Show Details)Oct 25 2017, 13:01
romainGuiet edited the content of this document. (Show Details)
oburri edited the content of this document. (Show Details)Jun 12 2018, 11:17
oburri edited the content of this document. (Show Details)Dec 3 2018, 10:46
oburri changed the visibility from "All Users" to "Public (No Login Required)".