Login  Register

Re: Flood Fill

Posted by Michael Schmid on Jul 21, 2011; 4:00pm
URL: http://imagej.273.s1.nabble.com/Flood-Fill-tp3683773p3683774.html

Hi Colin,

there is a lot of overhead needed for the Point objects. Even if you  
have no memory problem, Garbage collection of some 100000 Point  
objects will make it unnecessarily slow.
Also, this code is not very efficient because you will enter many  
points into the queue more than once.

ImageJ has an efficient built-in flood fill algorithm, why not use  
it? See
   http://pacific.mpi-cbg.de/cgi-bin/gitweb.cgi?
p=imagej.git;a=blob;f=ij/process/FloodFiller.java

Michael
________________________________________________________________

On 21 Jul 2011, at 17:06, ColinWhite wrote:

> Hi,
>
> I've written a short program to flood fill a simple black and white  
> image of
> the outline of a cell. The image is too big to do this recursively  
> (about
> 400x400 pixels) so I've used queues. However, my program only runs  
> for a
> short while and then returns and out of memory error. I'm really  
> not sure
> why it ends up using an upwards of 400MB of memory before it crashes.
>
> Any help is appreciated.
> -Colin
>
> import ij.*;
> import ij.plugin.filter.PlugInFilter;
> import ij.process.*;
> import ij.gui.*;
> import java.awt.*;
> import java.util.*;
> import java.lang.Math.*;
>
> public class Filopodia_Analyzer implements PlugInFilter{
> ImagePlus analyzed;
>
> public int setup(String arg, ImagePlus analyzed){
> return DOES_ALL;
> }
>
> public void run(ImageProcessor anal_ip){
>
> Point n = new Point();
>
> ArrayDeque<Point> q = new ArrayDeque<Point>();
>
> if(anal_ip.getPixelValue(12, 10) == 255.0) q.offer(new Point(12,  
> 10));
>
> while(q.size() != 0){
> n = q.poll();
> if(anal_ip.getPixelValue(n.x, n.y) == 255.0) anal_ip.putPixel
> (n.x, n.y,
> 223);
>
> if(anal_ip.getPixelValue(n.x-1, n.y) == 255.0) q.offer(new Point
> (n.x-1,
> n.y));
> if(anal_ip.getPixelValue(n.x+1, n.y) == 255.0) q.offer(new Point
> (n.x+1,
> n.y));
> if(anal_ip.getPixelValue(n.x, n.y-1) == 255.0) q.offer(new Point
> (n.x,
> n.y-1));
> if(anal_ip.getPixelValue(n.x, n.y+1) == 255.0) q.offer(new Point
> (n.x,
> n.y+1));
> analyzed.updateAndDraw();
> }
> }
> }
>
> --
> View this message in context: http://imagej.588099.n2.nabble.com/ 
> Flood-Fill-tp6607146p6607146.html
> Sent from the ImageJ mailing list archive at Nabble.com.