package fr.unistra.pelican.demos;
import fr.unistra.pelican.BooleanImage;
import fr.unistra.pelican.ByteImage;
import fr.unistra.pelican.Image;
import fr.unistra.pelican.algorithms.conversion.BinaryMasksToLabels;
import fr.unistra.pelican.algorithms.conversion.ColorImageFromMultiBandImage;
import fr.unistra.pelican.algorithms.conversion.RGBToHSY;
import fr.unistra.pelican.algorithms.histogram.ContrastStretch;
import fr.unistra.pelican.algorithms.io.ImageBuilder;
import fr.unistra.pelican.algorithms.io.ImageLoader;
import fr.unistra.pelican.algorithms.io.ImageSave;
import fr.unistra.pelican.algorithms.morphology.binary.BinaryErosion;
import fr.unistra.pelican.algorithms.morphology.binary.BinaryOpening;
import fr.unistra.pelican.algorithms.morphology.binary.geodesic.FastBinaryReconstruction;
import fr.unistra.pelican.algorithms.morphology.gray.GrayMedian;
import fr.unistra.pelican.algorithms.segmentation.MarkerBasedMultiProbashed;
import fr.unistra.pelican.algorithms.segmentation.flatzones.BooleanConnectedComponentsLabeling;
import fr.unistra.pelican.algorithms.segmentation.labels.LabelsToBinaryMasks;
import fr.unistra.pelican.algorithms.segmentation.labels.RegionSize;
import fr.unistra.pelican.algorithms.segmentation.weka.WekaClassificationKNN;
import fr.unistra.pelican.algorithms.visualisation.Viewer2D;
import fr.unistra.pelican.util.morphology.FlatStructuringElement2D;
public class ExtendedLabelingDemo {
public static void main(String[] args) {
if (args.length == 0) {
System.out
.println("Usage: InteractiveLabelingDemo file markers output [-stretch][-color]\n"
+ "- file is the image to be segmented\n"
+ "- output is the resulting image\n"
+ "- markers is the predefined marker image\n"
+ "- -stretch to perform a contrast stretch step\n"
+ "- -color to perform the classification in a color space");
return;
}
new ExtendedLabelingDemo(args);
}
public ExtendedLabelingDemo(String[] args) {
boolean color = false;
Image input = ImageLoader.exec(args[0]);
Image samples= LabelsToBinaryMasks.exec(ImageLoader.exec(args[1]));
String outfile = args[2];
Image result = null;
for (int i = 2; i < args.length; i++) {
if (args[i].equalsIgnoreCase("-stretch"))
input = ContrastStretch.exec(input);
else if (args[i].equalsIgnoreCase("-color"))
color = true;
}
Image outputSamples = WekaClassificationKNN
.exec(color ? MarkerBasedMultiProbashed.scalarize(RGBToHSY.exec(input))
: input, samples, 5);
outputSamples=LabelsToBinaryMasks.exec(outputSamples,true);
for (int b = 0; b < outputSamples.getBDim(); b++) {
Image samp = samples.getImage4D(b, Image.B);
Image clas = outputSamples.getImage4D(b, Image.B);
Image rec = FastBinaryReconstruction.exec(samp, clas);
int area = 50;
// CritÚre : composante de taille > 50% du marqueur le plus petit
rec = clas;
int se = 5;
// Tolérance d'un pixel d'erreur dans le voisinage
rec = GrayMedian.exec(rec, FlatStructuringElement2D
.createSquareFlatStructuringElement(3));
// On ne conserve que les zones d'au moins 11x11, soit 4m*4m
rec = BinaryOpening.exec(rec, FlatStructuringElement2D
.createSquareFlatStructuringElement(11));
// Erosion pour éviter les marqueurs qui se touchent
rec = BinaryErosion.exec(rec, FlatStructuringElement2D
.createSquareFlatStructuringElement(se));
outputSamples.setImage4D(rec, b, Image.B);
}
result = BinaryMasksToLabels.exec((BooleanImage) outputSamples);
if (result != null)
ImageSave.exec(result, outfile);
}
}