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]]
];