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