package fr.unistra.pelican.algorithms.arithmetic; import java.util.Random; import fr.unistra.pelican.Algorithm; import fr.unistra.pelican.Image; /** * Cut the samples dataset in k folds. * A sample image is a boolean image of a bands for each * class, if true, a pixel is a sample. * * @author Sébastien Derivaux */ public class KFolds extends Algorithm { // Inputs parameters /** * Input Image */ public Image input; /** * nbFolds */ public int nbFolds; // Outputs parameters /** * Resulting samples images */ public Image[] output; /** * Constructor * */ public KFolds() { super(); super.inputs = "input,nbFolds"; super.outputs = "output"; } /* * (non-Javadoc) * * @see fr.unistra.pelican.Algorithm#launch() */ public void launch() { int xDim = input.getXDim(); int yDim = input.getYDim(); int bDim = input.getBDim(); output = new Image[nbFolds]; for (int i = 0; i < output.length; i++) { output[i] = input.copyImage(false); output[i].fill(0.0); } Random r = new Random(); for (int b = 0; b < bDim; b++) for (int x = 0; x < xDim; x++) for (int y = 0; y < yDim; y++) if (input.getPixelXYBBoolean(x, y, b)) output[r.nextInt(nbFolds)].setPixelXYBBoolean(x, y, b, true); } /** * Cut the samples dataset in k folds. * A sample image is a boolean image of a bands for each * class, if true, a pixel is a sample. * * @param input Sample image * @param nbFolds number of subsamples images needed. * @return Resulting samples images */ public static Image[] exec(Image input, int nbFolds) { return (Image[])new KFolds().process(input, nbFolds); } }