Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Efficient floodfill algorithm

27 views
Skip to first unread message

Yaroslav Linder

unread,
Apr 26, 2012, 5:35:24 AM4/26/12
to
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]]
];

0 new messages