/* Krzysztof Krawiec, December 2015 Script for extracting the thin capillaries from the fundus mask images (2015IEEE TMI paper) VARIANTS: - A: radius = 1.0, minArea = 8 - B: radius = 0.5, minArea = 8 - C: radius = 1.0, minArea = 8, minAreaThick=1000 - D: radius = 0.5, minArea = 8, minAreaThick=1000 - E: radius = 1.0, minArea = 8, minAreaThick=1000, closing=false - F: radius = 0.5, minArea = 8, minAreaThick=1000, closing=false - G: radius = 1.0, minArea = 8, minAreaThick=100, closing=false - H: radius = 0.5, minArea = 8, minAreaThick=100, closing=false NOTE: - We are using variant H in the paper. - For now, show=true is required. - WARNING: Do not run with other images open in ImageJ - window names are not unique! */ importClass(Packages.java.io.File); // Reasonable values: 0.5, 1.0 var radius = 0.5 // Minimal area of a region to be preserved. var minArea = 8 // If set to 0, becomes ineffective: var minAreaThick = 100 // Whether to apply closing var closing = false // Set this variable to the path to directory containing 'training' and 'test' // subdirectories: var dirName = "./"; /* ************* */ // Main call: //processAll(dirName+"training/", 21,40, "_training_mask.png"); // Training set processAll(dirName+"test/", 1, 20, "_test_mask.png"); // Test set /* ************* */ function pad(num, size) { var s = num+""; while (s.length < size) s = "0" + s; return s; } function processAll(dirName, nFrom, nTo, suffix) { print("START"); for (var i = nFrom; i <= nTo; i++) { var ns = pad(i,2) process(dirName+"1st_manual/"+ns+"_manual1.gif", dirName+"mask/"+ns+suffix, true); } print("END"); } function process(fname, fnameMask, show){ print("Opening: " + fname); imp1 = IJ.openImage(fname); //imp1.setTitle("in.gif"); imp2 = new Duplicator().run(imp1); //imp2.setTitle("DUP_in.gif"); if(show) imp2.show(); IJ.run(imp1, "Minimum...", "radius="+radius); IJ.run(imp1, "Maximum...", "radius="+radius); if(closing){ IJ.run(imp1, "Maximum...", "radius="+radius); IJ.run(imp1, "Minimum...", "radius="+radius); } if(minAreaThick > 0){ IJ.run(imp1, "Make Binary", ""); IJ.run(imp1, "Analyze Particles...", "size=" + minAreaThick + "-Infinity circularity=0.00-1.00 show=Masks display in_situ"); IJ.run(imp1, "Invert", ""); } if(show) imp1.show(); thickVessels = new Duplicator().run(imp1); ic = new ImageCalculator(); imp3 = ic.run("Difference create", imp2, imp1); IJ.run(imp3, "Invert", ""); IJ.run(imp3, "Make Binary", ""); if(show) imp3.show(); IJ.run(imp3, "Analyze Particles...", "size=" + minArea + "-Infinity circularity=0.00-1.00 show=Masks display in_situ"); IJ.run(imp3, "Invert", ""); IJ.saveAs(imp3, "PNG", fname + ".png"); imp3.show(); IJ.run(imp3, "Merge Channels...", "c1=" + imp2.getTitle() + " c2=" + imp3.getTitle() + " keep ignore"); var im4 = IJ.getImage(); // get current image IJ.saveAs(im4, "PNG", fname + ".composite.png"); // Creating mask: print("Opening: " + fnameMask); impMask = IJ.openImage(fnameMask); IJ.run(thickVessels, "Invert LUT", ""); impNewMask = ic.run("Min create", impMask, thickVessels); impNewMask.show(); IJ.saveAs(impNewMask, "PNG", fnameMask + ".thick.png"); print("Done."); }