package fr.unistra.pelican.algorithms.segmentation.weka; import weka.classifiers.lazy.IBk; import weka.core.SelectedTag; import fr.unistra.pelican.Algorithm; import fr.unistra.pelican.Image; import fr.unistra.pelican.algorithms.geometric.Padding; import fr.unistra.pelican.algorithms.geometric.ResamplingByRatio; /** * Perform a soft classification using the 5-KNN Weka algorithm. Use a * subsampled image for the classification. */ public class WekaSoftAndCoarseClassificationKNN extends Algorithm { // Inputs parameters /** * The input image */ public Image inputImage; /** * The sample image */ public Image samples; /** * The subsampling ration (<= 1) */ public double ratio = 0.5; /** * The output image */ public Image outputImage; /** * Constructor * */ public WekaSoftAndCoarseClassificationKNN() { super.inputs = "inputImage,samples"; super.options = "ratio"; super.outputs = "outputImage"; } /* * (non-Javadoc) * * @see fr.unistra.pelican.Algorithm#launch() */ public void launch() { IBk classifier = new IBk(); classifier.setKNN(5); classifier.setWindowSize(100); classifier.setDistanceWeighting(new SelectedTag(IBk.WEIGHT_INVERSE, IBk.TAGS_WEIGHTING)); Image reduce = inputImage; if (ratio < 1) { reduce = (Image) new ResamplingByRatio().process(inputImage, inputImage .getXDim() > 1 ? ratio : 1, inputImage.getYDim() > 1 ? ratio : 1, inputImage.getZDim() > 1 ? ratio : 1, inputImage.getTDim() > 1 ? ratio : 1, 1.0, ResamplingByRatio.NEAREST); samples = (Image) new ResamplingByRatio().process(samples, inputImage .getXDim() > 1 ? ratio : 1, inputImage.getYDim() > 1 ? ratio : 1, inputImage.getZDim() > 1 ? ratio : 1, inputImage.getTDim() > 1 ? ratio : 1, 1.0, ResamplingByRatio.NEAREST); } outputImage = (Image) new WekaSoftClassification().process(reduce, classifier, samples); if (ratio < 1) { outputImage = (Image) new ResamplingByRatio().process(outputImage, inputImage.getXDim() > 1 ? 1 / ratio : 1, inputImage.getYDim() > 1 ? 1 / ratio : 1, inputImage.getZDim() > 1 ? 1 / ratio : 1, inputImage.getTDim() > 1 ? 1 / ratio : 1, 1.0, ResamplingByRatio.NEAREST); outputImage = (Image) new Padding().process(outputImage, inputImage .getXDim(), inputImage.getYDim(), inputImage.getZDim(), inputImage .getTDim(), outputImage.getBDim(), Padding.BORDERS); } } public static Image exec(Image input, Image labels) { return (Image) new WekaSoftAndCoarseClassificationKNN().process(input, labels); } public static Image exec(Image input, Image labels, double ratio) { return (Image) new WekaSoftAndCoarseClassificationKNN().process(input, labels, ratio); } }