MathGroup Archive 2012

[Date Index] [Thread Index] [Author Index]

Search the Archive

Efficient floodfill algorithm

  • To: mathgroup at smc.vnet.net
  • Subject: [mg126240] Efficient floodfill algorithm
  • From: Yaroslav Linder <yaroslav.linder at gmail.com>
  • Date: Thu, 26 Apr 2012 05:31:42 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com

G is two-dimensional matrix (for example, binarized image) On the
picture 800x662 working time was 0.662 seconds.

FloodFill =
  Compile[{{G, _Real,
     2}, {p1, _Integer}, {p2, _Integer}, {tar, _Real}, {rep, _Real}},
   Module[{Gdata = G, Q = {{p1, p2}}, QNew = {{0, 0}}, ind, x, y, u,
     dim, MaxLen, Maxl},
    If [Gdata[[p1, p2]] != tar, Return[Gdata]];
    dim = Dimensions[Gdata];
    QNew = Table[{0, 0}, {i, 1, 2*Total[dim]}];
    While [Length[Q] > 0,
     ind = 0;
     For [u = 1, u <= Length[Q], u = u + 1,
      {x, y} = Q[[u]];
      If [Gdata[[x, y]] == tar,
       Gdata[[x, y]] = rep;
       If [x > 1 && Gdata[[x - 1, y]] == tar,
        QNew[[++ind]] = {x - 1, y}];
       If [x < dim[[1]] && Gdata[[x + 1, y]] == tar,
        QNew[[++ind]] = {x + 1, y}];
       If [y > 1 && Gdata[[x, y - 1]] == tar,
        QNew[[++ind]] = {x, y - 1}];
       If [y < dim[[2]] && Gdata[[x, y + 1]] == tar,
        QNew[[++ind]] = {x, y + 1}];
       ];
      ];
     Q = Take[QNew, ind];
     Q = DeleteDuplicates[Q];
     ];
    Return[Gdata]]
   ];



  • Prev by Date: a bug in V8 when computing hypergeometric function 2F0 ?
  • Next by Date: Re: how to check for NumericQ arbitrary data structure
  • Previous by thread: a bug in V8 when computing hypergeometric function 2F0 ?
  • Next by thread: Unsatisfactory view of Panel, when transformed to pdf