second hough -- better center-finding mechanism
authorTomas Musil <tomik.musil@gmail.com>
Sat, 25 Aug 2012 15:13:12 +0000 (17:13 +0200)
committerTomas Musil <tomik.musil@gmail.com>
Sat, 25 Aug 2012 15:13:12 +0000 (17:13 +0200)
filters.py
hough.py
imago.py

index a5d00e6..2f3c12d 100644 (file)
@@ -103,33 +103,3 @@ def components(image):
 
 
     return new_image
-
-def half_centers(image):
-    image_l = image.load()
-    new_image = Image.new('L', image.size)
-    new_image_l = new_image.load()
-    
-    x_s = 0
-    y_s = 0
-    n = 0
-    for x in range(0, image.size[0] / 2):
-        for y in range(0, image.size[1]):
-            if image_l[x, y] > 127:
-                x_s += x
-                y_s += y
-                n += 1
-    new_image_l[x_s / n, y_s / n] = 255
-
-    x_s = 0
-    y_s = 0
-    n = 0
-    for x in range(image.size[0] / 2, image.size[0]):
-        for y in range(0, image.size[1]):
-            if image_l[x, y] > 127:
-                x_s += x
-                y_s += y
-                n += 1
-    new_image_l[x_s / n, y_s / n] = 255
-
-    return new_image
-
index f39784b..9d44bcb 100644 (file)
--- a/hough.py
+++ b/hough.py
@@ -46,6 +46,26 @@ class Hough:
             
         return new_image
 
+    def lines_from_list(self, p_list):
+        lines = []
+        for p in p_list:
+            lines.append(self.angle_distance(p))
+        return lines
+
+    def all_lines_h(self, image):
+        im_l = image.load()
+        lines1 = []
+        for x in xrange(image.size[0] / 2):
+            for y in xrange(image.size[1]):
+                if im_l[x, y]:
+                    lines1.append(self.angle_distance((x, y)))
+        lines2 = []
+        for x in xrange(image.size[0] / 2, image.size[0]):
+            for y in xrange(image.size[1]):
+                if im_l[x, y]:
+                    lines2.append(self.angle_distance((x, y)))
+        return [lines1, lines2]
+
     def all_lines(self, image):
         im_l = image.load()
         lines = []
index 9e1697c..cf04f53 100755 (executable)
--- a/imago.py
+++ b/imago.py
@@ -100,7 +100,10 @@ def main():
     if verbose:
         print >> sys.stderr, "second hough transform"
 
-    hough2 = Hough(im_h2.size)
+    hough2 = Hough(im_h2.size) 
+    # im_hough might be used instead im_h2, but at the moment it brings a lot of
+    # noise to the second transform, which later confuses the center-finding
+    # mechanism (which is not very robust yet)
     im_hough2 = hough2.transform(im_h2)
     if show_all:
         do_something(im_hough2, "second hough transform")
@@ -109,26 +112,33 @@ def main():
     if show_all:
         do_something(im_h3, "third high pass filter")
      
-    im_h3 = filters.half_centers(im_h3)
+    im_h3 = filters.components(im_h3)
     if show_all:
         do_something(im_h3, "half centers")
 
     if verbose:
         print >> sys.stderr, "finding the grid"
 
-    lines_m = hough2.all_lines(im_h3)
+    lines_m = hough2.all_lines_h(im_h3)
     lines = []
+    im_c = im_h2.convert('RGB').convert('RGB', (1, 0.5, 0.5, 0))
+    draw_c = ImageDraw.Draw(im_c)
 
-    for line in lines_m:
+    for line_l in lines_m:
         im_line = Image.new('L', im_h2.size)
         draw = ImageDraw.Draw(im_line)
-        draw.line(line_from_angl_dist(line, im_h2.size), fill=255, width=5)
-        if show_all:
-            do_something(im_line, "line")
-        im_c = combine(im_h2, im_line)
-        if show_all:
-            do_something(im_c, "hough x lines")
-        lines.append(hough1.all_lines(im_c))
+        line_points = set()
+        for line in line_l:
+            draw.line(line_from_angl_dist(line, im_h2.size), fill=255, width=5)
+            draw_c.line(line_from_angl_dist(line, im_c.size), fill=(70, 70, 70), width=5)
+            for p in combine(im_h2, im_line):
+                line_points.add(p)
+        for point in line_points:
+            draw_c.point(point, fill=(120, 255, 120))
+        lines.append(hough1.lines_from_list(line_points))
+
+    if show_all:
+        do_something(im_c, "hough x lines")
 
     image_g = image.copy()
     draw = ImageDraw.Draw(image_g)
@@ -179,14 +189,13 @@ def combine(image1, image2):
     im_l1 = image1.load()
     im_l2 = image2.load()
 
-    im_n = Image.new('L', image1.size)
-    im_nl = im_n.load()
+    on_both = []
 
     for x in xrange(image1.size[0]):
         for y in xrange(image1.size[1]):
             if im_l1[x, y] and im_l2[x, y]:
-                im_nl[x, y] = 255
-    return im_n
+                on_both.append((x, y))
+    return on_both
 
 def line_from_angl_dist((angle, distance), size):
     x1 = - size[0] / 2
@@ -199,7 +208,7 @@ def intersections_from_angl_dist(lines, size):
     intersections = []
     for (angl1, dist1) in sorted(lines[1], key=itemgetter(1)):
         line = []
-        for (angl2, dist2) in lines[0]:
+        for (angl2, dist2) in sorted(lines[0], key=itemgetter(1)):
             if abs(angl1 - angl2) > 0.4:
                 x =  - ((dist2 / math.cos(angl2))-(dist1 / math.cos(angl1))) / (math.tan(angl1) - math.tan(angl2))
                 y = (math.tan(angl1) * x) - (dist1 / math.cos(angl1))