Bounding box on clusters in a 2D list
bearophileHUGS at lycos.com
bearophileHUGS at lycos.com
Mon Apr 25 19:33:40 EDT 2005
Then you can probably use something like this:
. def boxesArea(m, foreground=1, background=0):
. maxr = len(m)
. maxc = len(m[0])
. newCol = 2
. oldCol = foreground
. for r,row in enumerate(m):
. for c,e in enumerate(row):
. if e == oldCol:
. # Flood fill by Lonnie Princehouse
. stack = [ (r, c) ]
. while stack:
. r, c = stack.pop()
. if c>=0 and c<maxc and r>=0 and r<maxr and
m[r][c]==oldCol:
. m[r][c] = newCol
. stack += [ (r+1, c), (r-1, c), (r, c+1), (r,
c-1) ]
. newCol += 1
. box = {}
. for r,row in enumerate(m):
. for c,e in enumerate(row):
. if e in box:
. box[e] = ( min(c, box[e][0]), min(r, box[e][1]),
. max(c, box[e][2]), max(r, box[e][3] ) )
. else:
. box[e] = (c, r, c, r)
. del box[background]
. return [(b[2]-b[0]+1)*(b[3]-b[1]+1) for b in box.values()]
.
. try: import psyco
. except ImportError: pass
. else: psyco.bind(boxesArea)
Note that this version modifies the given m still.
Hugs,
Bearophile
More information about the Python-list
mailing list