Hola,
no creo que haga falta recursividad, a no ser que quieras tu implementar el floodfill. Puedes ir rastreando todos los pixels, y al encontrar uno blanco, llenar toda el area de otro color y aumentar el contador. Te dejo un ejemplo, usando el floodfill de delphi y otro casero, recursivo. (este ejemplo falla si se solapan dos zonas)
Código Delphi
[-]
type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Rellena_colonia(i,j : integer; col,rel : TColor; im : TImage);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
i,j : integer;
colonias : integer;
x,y,r: integer;
begin
Image1.Canvas.Brush.Color := clBlack;
Image1.Canvas.FillRect(Rect(0,0,Image1.Width,Image1.Height));
Image1.Canvas.Brush.Color := clWhite;
colonias := random(10);
for i := 0 to colonias do
begin
x := random(Image1.Width);
y := random(Image1.Height);
Image1.Canvas.Ellipse(Rect(x,y,x+random(50),y+random(50)));
end;
ShowMessage(inttostr(colonias));
colonias := 0;
for i := 0 to Image1.Width do
for j := 0 to Image1.Height do
if Image1.Canvas.Pixels[i,j] = clWhite then
begin
rellena_colonia(i,j,clWhite,clRed,Image1);
inc(colonias);
end;
Label1.Caption := inttostr(colonias);
end;
procedure TForm1.Rellena_colonia(i,j : integer; col,rel : TColor; im : TImage);
begin
Im.Canvas.Brush.Color := rel;
Im.Canvas.FloodFill(i,j,col,fsSurface);
end;
end.