// 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;

                 }

                

}