package fr.unistra.pelican.algorithms.segmentation.labels; import fr.unistra.pelican.Algorithm; import fr.unistra.pelican.Image; import fr.unistra.pelican.IntegerImage; /** * This class remove border pixels from a segmentation map by assigning them to * the biggest connected region. * * Works only in X Y dimension. * * @author Lefevre */ public class DeleteFrontiers extends Algorithm { /** * The input image */ public Image input; /** * The output image */ public Image output; /** * The label of border pixels */ public static final int WSHED = 0; /** * Constructor */ public DeleteFrontiers() { super.inputs = "input"; super.outputs = "output"; } /** * Remove border pixels from a segmentation map by assigning them to the * biggest connected region. * * @param input * The input image * @return The output image */ public static Image exec(Image input) { return (Image) new DeleteFrontiers().process(input); } /* * (non-Javadoc) * * @see fr.unistra.pelican.Algorithm#launch() */ public void launch() { int xDim = input.getXDim(); int yDim = input.getYDim(); int bDim = input.getBDim(); int labels[][] = new int[input.getBDim()][]; for (int b = 0; b < input.getBDim(); b++) { // Calcul du nombre de labels dans l'image d'origine int max = 0; for (int x = 0; x < input.getXDim(); x++) for (int y = 0; y < input.getYDim(); y++) if (input.getPixelXYBInt(x, y, b) > max) max = input.getPixelXYBInt(x, y, b); labels[b] = new int[max + 1]; // Calcul de la taille de chaque region for (int i = 0; i < max; i++) labels[b][i] = 0; for (int x = 0; x < input.getXDim(); x++) for (int y = 0; y < input.getYDim(); y++) { int label = input.getPixelXYBInt(x, y, b); // System.out.println(label); labels[b][label]++; } } output = new IntegerImage(input); int nbval; int tab[] = new int[8]; int val; for (int b = 0; b < bDim; b++) for (int x = 0; x < xDim; x++) for (int y = 0; y < yDim; y++) // On ne traite que les pixels de contours if (input.getPixelXYBInt(x, y, b) == WSHED) { nbval = 0; // for every pixel in the 8-neighbourhood of p for (int l = y - 1; l <= y + 1; l++) for (int k = x - 1; k <= x + 1; k++) { if (k < 0 || k >= input.getXDim() || l < 0 || l >= input.getYDim()) continue; if (!(k == x && l == y) && input.getPixelXYBInt(k, l, b) != WSHED) { val = input.getPixelXYBInt(k, l, b); tab[nbval++] = val; } } // Affectation a la plus grande region voisinne int max = 0, imax = -1; for (int i = 0; i < nbval; i++) if (labels[b][tab[i]] > max) { max = labels[b][tab[i]]; imax = i; } if (imax != -1) output.setPixelXYBInt(x, y, b, tab[imax]); else if (nbval == 0)// System.out.println("point // isole"); // Affectation aleatoire a partir des labels des // voisins output.setPixelXYBInt(x, y, b, tab[(int) (Math .random() * nbval)]); } } }