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.AlgorithmException;
import fr.unistra.pelican.Image;
import fr.unistra.pelican.algorithms.geometric.Padding;
import fr.unistra.pelican.algorithms.geometric.ResamplingByRatio;
/**
* Perform a classification using the k-Nearest Neighbour Weka algorithm. Each
* band from input represents a attribute. Each band from samples represent a
* class exemples.
*
* @author Lefevre
*/
public class WekaCoarseClassificationKNN extends Algorithm {
// Inputs parameters
public Image inputImage;
public Image samples;
public int k;
/**
* The subsampling ration (<= 1)
*/
public double ratio = 0.5;
public boolean stats=false;
// Outputs parameters
public Image outputImage;
/**
* Constructor
*
*/
public WekaCoarseClassificationKNN() {
super.inputs = "inputImage,samples,k";
super.options="stats,ratio";
super.outputs = "outputImage";
}
public static Image exec(Image inputImage, Image samples,int k) {
return (Image) new WekaCoarseClassificationKNN().process(inputImage, samples,k);
}
public static Image exec(Image inputImage, Image samples,int k,boolean stats) {
return (Image) new WekaCoarseClassificationKNN().process(inputImage, samples,k,stats);
}
public static Image exec(Image inputImage, Image samples,int k,boolean stats,double ratio) {
return (Image) new WekaCoarseClassificationKNN().process(inputImage, samples,k,stats,ratio);
}
public static Image exec(Image inputImage, Image samples,int k,double ratio) {
return (Image) new WekaCoarseClassificationKNN().process(inputImage, samples,k,null,ratio);
}
/*
* (non-Javadoc)
*
* @see fr.unistra.pelican.Algorithm#launch()
*/
public void launch() throws AlgorithmException {
IBk classifier = new IBk();
classifier.setKNN(k);
classifier.setWindowSize(100);
classifier.setDistanceWeighting(new SelectedTag(IBk.WEIGHT_INVERSE,
IBk.TAGS_WEIGHTING));
classifier
.setNearestNeighbourSearchAlgorithm(new weka.core.neighboursearch.CoverTree());
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 = WekaClassification.exec(reduce,
classifier, samples,stats);
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);
}
}
}