Použití klasifikátoru na více obrázků
Použití klasifikátoru na více obrázků Kateřina Eliášová Út, 28.04.2020 - 09:10Vytvoř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
- vstupní složku s připravenými soubory tif
- výstupní složku (jiná než vstupní)
- soubor klasifikátoru (.model)
- režim výsledku
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 **" );