/** * */ package fr.unistra.pelican.algorithms.morphology.connected; import java.util.ArrayList; import fr.unistra.pelican.Algorithm; import fr.unistra.pelican.AlgorithmException; import fr.unistra.pelican.Image; import fr.unistra.pelican.IntegerImage; import fr.unistra.pelican.algorithms.io.ImageLoader; import fr.unistra.pelican.algorithms.segmentation.labels.LabelsToRandomColors; import fr.unistra.pelican.algorithms.visualisation.MViewer; import fr.unistra.pelican.gui.MultiViews.MultiView; import fr.unistra.pelican.util.Point3D; import fr.unistra.pelican.util.connectivityTrees.UnionFindHelper; import fr.unistra.pelican.util.connectivityTrees.connectivity.Connectivity3D; import fr.unistra.pelican.util.connectivityTrees.connectivity.FlatConnectivity; import fr.unistra.pelican.util.connectivityTrees.connectivity.TrivialConnectivity; /** * Performs labeling of connected component with respect to a given a connectivity. * * Note that input image is only there to provide information on dimensions * as the connectivity contains all informations needed for construction * of connected components... * * * @author Benjamin Perret * */ public class ConnectedComponentMap extends Algorithm { public Image inputImage; public Connectivity3D connectivity; public IntegerImage labelMap; private UnionFindHelper pSet ; private int xdim,ydim,zdim; private ArrayList<Point3D> pList; /** * */ public ConnectedComponentMap() { super.inputs="inputImage,connectivity"; super.outputs="labelMap"; } /* (non-Javadoc) * @see fr.unistra.pelican.Algorithm#launch() */ @Override public void launch() throws AlgorithmException { xdim=inputImage.xdim; ydim=inputImage.ydim; zdim=inputImage.zdim; pSet = new UnionFindHelper(xdim,ydim,zdim); labelMap=new IntegerImage(xdim,ydim,zdim,1,1); pList = new ArrayList<Point3D>(xdim*ydim*zdim); for(int z=0;z<zdim;z++) for(int y=0;y<ydim;y++) for(int x=0;x<xdim;x++) { Point3D p= new Point3D(x,y,z); pList.add(p); pSet.MakeSet(p); } for(Point3D p:pList) { Point3D compp = pSet.find(p); connectivity.setCurrentPoint(p.x, p.y, p.z); //System.out.println(p + " " + compp); for(Point3D q: connectivity) { /*System.out.println(p + " " +q); try { Thread.sleep(200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }*/ Point3D compq = pSet.find(q); if(compp != compq) compp = pSet.link(compq, compp); } } for (Point3D p:pList) { Point3D r=pSet.find(p); labelMap.setPixelXYZInt(p.x, p.y, p.z, r.z*xdim*ydim + r.y*xdim +r.x); } } public static IntegerImage exec(Image inputImage, Connectivity3D connectivity) { return (IntegerImage)(new ConnectedComponentMap()).process(inputImage,connectivity); } /** * @param args */ public static void main(String[] args) { Image im = ImageLoader.exec("samples/binary.png"); MultiView mView= MViewer.exec(im); Connectivity3D con = new FlatConnectivity(im, TrivialConnectivity.getHeightNeighbourhood()); IntegerImage label = ConnectedComponentMap.exec(im, con); mView.add(LabelsToRandomColors.exec(label)); } }