Použití klasifikátoru na více obrázků

Vytvořený klasifikátor lze pomocí skriptu v ImageJ použít automaticky na více souborů. Příklad takového skriptu je níže. Pro skriptování pluginu Trainable Weka Segmentation (TWS) lze používat standardní makro jazyk ImageJ. Často se ale dává přednost skriptovacímu jazyku Bean Shell. Tak je tomu i v tomto případě.

Skript pro použití klasifikátoru na více souborů jsme převzali z příručky pro skriptování TWS. Můžete ho spustit v ImageJ (Plugins -> New -> Macro) po vložení do skriptovacího formuláře a klepnutím na "Run". Před spuštěním změňte skriptovací jazyk z IJ1 Macro na Bean Shell v nabídce Language formuláře.

V makru po spuštění zadáme

Další běh makra už je bez interakce s uživatelem.

#@ File(label="Input directory", description="Select the directory with input images", style="directory") inputDir
#@ File(label="Output directory", description="Select the output directory", style="directory") outputDir
#@ File(label="Weka model", description="Select the Weka model to apply") modelPath
#@ String(label="Result mode",choices={"Labels","Probabilities"}) resultMode
 
import trainableSegmentation.WekaSegmentation;
import trainableSegmentation.utils.Utils;
import ij.io.FileSaver;
import ij.IJ;
import ij.ImagePlus;
  
// starting time
startTime = System.currentTimeMillis();
  
// caculate probabilities?
getProbs = resultMode.equals( "Probabilities" );
 
// create segmentator
segmentator = new WekaSegmentation();
// load classifier
segmentator.loadClassifier( modelPath.getCanonicalPath() );
  
// get list of input images
listOfFiles = inputDir.listFiles();
for ( i = 0; i < listOfFiles.length; i++ )
{
    // process only files (do not go into sub-folders)
    if( listOfFiles[ i ].isFile() )
    {
        // try to read file as image
        image = IJ.openImage( listOfFiles[i].getCanonicalPath() );
        if( image != null )
        {                   
            // apply classifier and get results (0 indicates number of threads is auto-detected)
            result = segmentator.applyClassifier( image, 0, getProbs );
 
            if( !getProbs )
                // assign same LUT as in GUI
                result.setLut( Utils.getGoldenAngleLUT() );
             
            // save result as TIFF in output folder
            outputFileName = listOfFiles[ i ].getName().replaceFirst("[.][^.]+$", "") + " out.tif";
            new FileSaver( result ).saveAsTiff( outputDir.getPath() + File.separator + outputFileName );
  
            // force garbage collection (important for large images)
            result = null; 
            image = null;
            System.gc();
        }
    }
}
// print elapsed time
estimatedTime = System.currentTimeMillis() - startTime;
IJ.log( "** Finished processing folder in " + estimatedTime + " ms **" );