// FISHji4 // LEPABE 09-02-2015 // Daniel Carvalho & Analia Lourenco // Macro for ImageJ. Determination of the mean fluorescence intensity.
var min_size=0; var max_size=0; var min_circ=0; var max_circ=0; var distance_pixel=0; var known_distance=0; var aspect_ratio=0; var unit_length=""; var channel = "green";
macro "FISHji4"{ inputFolder = getDirectory("Choose the input folder!");
help= "<html>Search is case sensitive. Regex patterns can also be used, e.g.,<br>" +"\"<tt>[0-9&&[^1]]\</tt>\" to find a digit that is not 1, or \"<tt>-.*-\</tt>\" to " +"find<br>any character sequence flanked by hyphens. You may need to<br>" +"escape metacharacters ('.', '[', ']', '^', '$', etc.) by a backslash.<br><br>" +"Note that replaced patterns should always give rise to unique<br>" +"names as the ROI Manager cannot cope with duplicated entries.";
openDialog();
outputFolder = getDirectory("Choose the output folder!");
setBatchMode(true);
images = getFileList(inputFolder); imageCount = countImages(images); notice = "converted: \n";
//out = File.open(outputFolder+"statistics.txt");
for (i=0; i<images.length; i++) { showProgress(i, imageCount); inputPath = inputFolder + images[i];
if (isImage(inputPath)) {
processFISH(inputFolder,images[i],outputFolder);
outputPath = outputFolder + images[i]; //save(outputPath);
notice = notice + outputPath + "\n"; } } setBatchMode(false); print(notice); exit();
function processFISH(inputFolder,image,out) { inputPath = inputFolder + image; open(inputPath);
title=getTitle(); run("RGB Split");
selectImage(title+" ("+channel+")");
// Set scale: distance in pixels, known distance, pixel aspect ratio, unit of length; run("Set Scale...", "distance=distance_pixel known=known_distance pixel=aspect_ratio unit=unit_length global"); run("Subtract Background...", "rolling=80"); // Application of the "Rolling Ball" algorithm t=getTitle(); run("Duplicate...", "title=roi"); run("Convolve...", "text1=[0 0 0 -1 -1 -1 0 0 0\n0 -1 -1 -3 -3 -3 -1 -1 0\n0 -1 -3 -3 -1 -3 -3 -1 0\n-1 -3 -3 6 13 6 -3 -3 -1\n-1 -3 -1 13 24 13 -1 -3 -1\n-1 -3 -3 6 13 6 -3 -3 -1\n0 -1 -3 -3 -1 -3 -3 -1 0\n0 -1 -1 -3 -3 -3 -1 -1 0\n0 0 0 -1 -1 -1 0 0 0\n] normalize"); // Convolution Laplacian of Guassian kernel 9x9 run("Make Binary"); // automatic threshold; run("Set Measurements...", " mean redirect=["+t+"] decimal=0"); // Overlay;
run("Analyze Particles...", "size=min_size-max_size pixel circularity=min_circ-max_circ show=Nothing add"); // size and circularity parameters
roiManager("Show all without labels"); run("Colors...","selection=magenta");
open(inputPath); original=getTitle(); print(">>>>O: "+title);
selectImage("roi"); roi=getTitle(); print(">>>>R: "+roi);
run("Add Image...","image=[&original]"); run("From ROI Manager"); run("Flatten");
saveAs("Tiff",out+"/["+original+"]_1");
run("Close"); run("Clear Results");
close();
}
function generateStatistics(out){ statistics=newArray("Mean"); kk = newArray(statistics.length*nResults); for (j=0; j<statistics.length; j++){ for (i=0;i<nResults; i++){ kk[j+i*statistics.length] = getResult(statistics[j],i); } }
// Statistics output Array.getStatistics(kk, min, max, mean, stdDev); print(out,"\nImage: " + title); print(out,"Mean: " + mean); print(out,"STD: " + stdDev); }
function isImage(filename) { extensions = newArray("tif", "tiff", "jpg", "bmp"); result = false; for (i=0; i<extensions.length; i++) { if (endsWith(toLowerCase(filename), "." + extensions[i])) result = true; } return result; }
function openDialog(){
Dialog.create("FISH Image Processing");
Dialog.setInsets(12,0,0); Dialog.addNumber("Minimum image size:", 0); Dialog.addNumber("Maximum image size:", 500);
Dialog.addNumber("Minimum image circularity:", 0); Dialog.addNumber("Maximum image circularity:", 1);
Dialog.setInsets(12,0,0); Dialog.addNumber("Distance in Pixels:", 0); Dialog.addNumber("Known Distance:", 0); Dialog.addNumber("Pixel Aspect Ratio:", 1.0); Dialog.addString("Unit of Length:", "pixel");
Dialog.setInsets(12,0,0); items_c = newArray("green", "blue", "red"); Dialog.setInsets(1,1,10); Dialog.addRadioButtonGroup("Channel:", items_c, 3, 1, "green");
help= "<html>" +"<h3>Description of Parameters:</h3><br/>" +"<p><b>Size:</b> Values range from 0 (minimum image size) to infinity (maximum image size). Values are expressed in size square units or pixels. </p>" +"<p><b>Circularity:</b> Values [4*pi*(area/perimeter^2)] range from 0 (infinitely elongated polygon) to 1 (perfect circle). </p>" +"<p><b>Channel:</b> Select the correct channel (red, green, and blue) for each input folder, images will be separated in order to analyse the channel where fluorescence is emitted. </p>" +"<p>Further details about the macro and examples can be found at <a href='http://193.137.11.213/fish/'>FISHji's Web site.</a></p>" +"<br/><br/></html>";
Dialog.addHelp(help); Dialog.show();
min_size = Dialog.getNumber(); max_size = Dialog.getNumber();
min_circ = Dialog.getNumber(); max_circ = Dialog.getNumber();
distance_pixel = Dialog.getNumber(); known_distance = Dialog.getNumber(); aspect_ratio = Dialog.getNumber(); unit_length = Dialog.getString();
channel = Dialog.getRadioButton(); }
function countImages(array) { result = 0; for (i=0; i<array.length; i++) { if (isImage(array[i])) result++; } return result; }
} |