| BinaryFiller |

    package ij.plugin.filter;
    import ij.*;
    import ij.process.*;
    import ij.gui.*;
    import java.awt.*;

    /**Binary Fill (Process/Binary/Fill) by Gabriel Landini, G.Landini at bham.ac.uk. */
    public class BinaryFiller implements PlugInFilter {
        protected boolean backgroundIsZero;

        public int setup(String arg, ImagePlus imp) {
            if (imp==null)
                {IJ.noImage(); return DONE;}
            ImageStatistics stats=imp.getStatistics();
            if (stats.histogram[0]+stats.histogram[255]!=stats.pixelCount){
                IJ.error("8-bit binary image (0 and 255) required.");
                return DONE;
            }
            backgroundIsZero = Prefs.blackBackground;
            if (imp.isInvertedLut())
                backgroundIsZero = !backgroundIsZero;
            return IJ.setupDialog(imp, DOES_8G);
        }

        public void run(ImageProcessor ip) {
            int xe = ip.getWidth();
            int ye = ip.getHeight();
            int x, y;
            boolean b;
            int [][] pixel = new int [xe][ye];

            //original converted to white particles
            if (!backgroundIsZero)
                ip.invert();

            //get original
            for(y=0;y<ye;y++) {
                for(x=0;x<xe;x++)
                    pixel[x][y]=ip.getPixel(x,y);
            }

            //label background borders
            for (y=0; y<ye; y++){
                if(ip.getPixel(0,y)==0)
                    ip.putPixel(0,y,127);
                if(ip.getPixel(xe-1,y)==0)
                    ip.putPixel(xe-1,y,127);
            }

            for (x=0; x<xe; x++){
                if(ip.getPixel(x,0)==0)
                    ip.putPixel(x,0,127);
                if(ip.getPixel(x,ye-1)==0)
                    ip.putPixel(x,ye-1,127);
            }

            //flood background from borders
            //the background of 8-connected particles is 4-connected
            b=true;
            while(b){
                b=false;
                for(y=1;y<ye-1;y++) {
                    for(x=1;x<xe-1;x++) {
                        if (ip.getPixel(x,y)==0){
                            if(ip.getPixel(x,y-1)==127 || ip.getPixel(x-1,y)==127) {
                                ip.putPixel(x,y,127);
                                b=true;
                            }
                        }
                    }
                }
                for(y=ye-2;y>=1;y--) {
                    for(x=xe-2;x>=1;x--) {
                        if (ip.getPixel(x,y)==0){
                            if(ip.getPixel(x+1,y)==127 || ip.getPixel(x,y+1)==127) {
                                ip.putPixel(x,y,127);
                                b=true;
                            }
                        }
                    }
                }
            }//idempotent

            for(y=0;y<ye;y++) {
                for(x=0;x<xe;x++){
                    if(ip.getPixel(x,y)==0)
                        ip.putPixel(x,y,255);
                    else
                        ip.putPixel(x,y,pixel[x][y]);
                }
            }

            //return to original state
            if (!backgroundIsZero)
                ip.invert();
        }

    }

| BinaryFiller |