[pypy-commit] extradoc extradoc: add labeling to demo

hakanardo noreply at buildbot.pypy.org
Fri Sep 14 12:21:02 CEST 2012


Author: Hakan Ardo <hakan at debian.org>
Branch: extradoc
Changeset: r4815:fda7e221bdf9
Date: 2012-09-14 12:20 +0200
http://bitbucket.org/pypy/extradoc/changeset/fda7e221bdf9/

Log:	add labeling to demo

diff --git a/talk/dls2012/demo/demo.py b/talk/dls2012/demo/demo.py
--- a/talk/dls2012/demo/demo.py
+++ b/talk/dls2012/demo/demo.py
@@ -164,6 +164,48 @@
     vim.type('<CR>def erode(fg, r=1):<CR>return morph(fg, r, min)<CR><ESC>')
     vim.type('G27ggwwierode(<ESC>A, 4)<ESC>:w<CR>')
 
+    pause('Now, lets label each of the foreground pixels with one label\n' + 
+          'per segment using a floodfill like algorithm')
+    vim.type('25ggOdef bwlabel(seg):<CR>labels = seg.new()<CR>last_label = 0<CR>for x, y in seg.indexes():<CR>if seg[x, y]:<CR>ll = [labels[x, y], labels[x-1, y], labels[x-1, y-1],<CR>labels[x, y-1], labels[x+1, y-1]]<CR>neighbours = set(ll)<CR>neighbours.discard(0)<CR>if not neighbours:<CR>last_label += 1<CR>l = last_label<CR><BS>else:<CR>l = min(neighbours)<CR><BS>labels[x, y] = l<CR><BS><BS>return labels<CR><ESC>', 0.01)
+    vim.type('G45ggOlabels = bwlabel(seg)<ESC>')
+    vim.type('j4bcwlabels<ESC>:w<CR>', 0.2)
+
+    pause("We'r getting several labels per object so lets try to repeat the\n" + 
+          "floodfilling trversing the image in reversed order. But first, to\n" + 
+          "prevent code duplication we're moving the common parts to a Labler class.")
+    vim.type('25ggOclass Labler(object):<CR>def __init__(self, seg):<CR><CR><ESC>')
+    vim.type('30ggVjxkkkPVj', 0.2)
+    vim.send('>')
+    vim.type('Iself.<ESC>jIself.<ESC>')
+    vim.type('o<CR><BS>def update(self, x, y, ll):<ESC>')
+    vim.type('38ggVjjjjjjjx', 0.2)
+    vim.type('30ggpVjjjjjjj')
+    vim.send('<')
+    vim.type('34ggIself.<ESC>jiself.<ESC>')
+    vim.type('38ggIself.<ESC>')
+    vim.type('o<CR><BS>def __getitem__(self, (x, y)):<CR>return self.labels[x, y]<ESC>')
+    vim.type('G45ggOlabels = Labler(seg)<ESC>')
+    vim.type('49ggolabels.update(x, y, ll)<ESC>')
+    vim.type('51ggA.labels<ESC>:w<CR>')
+
+    pause("It still seems to work as before. Now lets add the second pass")
+    vim.type('O<CR><BS><BS>for x, y in reversed(seg.indexes()):<CR>if seg[x, y]:<CR>ll = [labels[x, y], labels[x+1, y], labels[x-1, y+1],<CR>labels[x, y+1], labels[x+1, y+1]]<CR>labels.update(x, y, ll)<CR><ESC>:w<CR>', 0.01)
+
+    pause("That's starting to look good, but in complicated cases we can still" + 
+          "get multiple lables per segment, so we need to repeat until convergance")
+    vim.type('56ggVkkkkkkkkkk', 0.2)
+    vim.send('>')
+    vim.type('Owhile not labels.done:<CR>labels.done = True<ESC>')
+    vim.type('28ggoself.done = False<ESC>')
+    vim.type('43gg39ggO<BS>if self.labels[x, y] != l:<CR>self.done = False<ESC>:w<CR>')
+
+    pause("As a final touch, lets renumber the labels be consecutative\n" + 
+          "integers.")
+    vim.type('44ggo<CR>def renumber(self):<CR>ll = list(set(self.labels))<CR>ll.sort()<CR>if ll[0] != 0:<CR>ll.insert(0, 0)<CR><BS>for x, y in self.labels.indexes():<CR>self.labels[x, y] = ll.index(self.labels[x, y])<CR><BS>self.last_label = len(ll) - 1<ESC>', 0.01)
+    vim.type('G72ggOlabels.renumber()<ESC>:w<CR>', 0.01)
+       
+
+
     pause("That's all! Feel free to make your own adjustments or (to quit),")
 
 
diff --git a/talk/dls2012/demo/detect.py b/talk/dls2012/demo/detect.py
--- a/talk/dls2012/demo/detect.py
+++ b/talk/dls2012/demo/detect.py
@@ -22,9 +22,60 @@
 def erode(fg, r=1):
     return morph(fg, r, min)
 
+class Labler(object):
+    def __init__(self, seg):
+        self.labels = seg.new()
+        self.last_label = 0
+        self.done = False
+
+    def update(self, x, y, ll):
+        neighbours = set(ll)
+        neighbours.discard(0)
+        if not neighbours:
+            self.last_label += 1
+            l = self.last_label
+        else:
+            l = min(neighbours)
+        if self.labels[x, y] != l:
+            self.done = False
+        self.labels[x, y] = l
+
+    def __getitem__(self, (x, y)):
+        return self.labels[x, y]
+
+    def renumber(self):
+        ll = list(set(self.labels))
+        ll.sort()
+        if ll[0] != 0:
+            ll.insert(0, 0)
+        for x, y in self.labels.indexes():
+            self.labels[x, y] = ll.index(self.labels[x, y])
+        self.last_label = len(ll) - 1
+
+
+def bwlabel(seg):
+    labels = Labler(seg)
+    while not labels.done:
+        labels.done = True
+        for x, y in seg.indexes():
+            if seg[x, y]:
+                ll = [labels[x, y], labels[x-1, y], labels[x-1, y-1],
+                      labels[x, y-1], labels[x+1, y-1]]
+                labels.update(x, y, ll)
+
+        for x, y in reversed(seg.indexes()):
+            if seg[x, y]:
+                ll = [labels[x, y], labels[x+1, y], labels[x-1, y+1],
+                      labels[x, y+1], labels[x+1, y+1]]
+                labels.update(x, y, ll)
+
+    labels.renumber()
+    return labels.labels
+
 @autoreload
 def find_objects(fg):
     seg = erode(dilate(fg, 3), 4)
-    viewsc(seg, 'segments')
+    labels = bwlabel(seg)
+    viewsc(labels, 'segments')
 
 


More information about the pypy-commit mailing list