hough transform
authorTomas Musil <tomik.musil@gmail.com>
Fri, 6 Apr 2012 13:25:05 +0000 (15:25 +0200)
committerTomas Musil <tomik.musil@gmail.com>
Fri, 6 Apr 2012 13:25:05 +0000 (15:25 +0200)
filter.py
hough.py [new file with mode: 0644]
image_small.jpg [new file with mode: 0644]
imago.py

index c378f76..7421fea 100644 (file)
--- a/filter.py
+++ b/filter.py
@@ -1,6 +1,6 @@
 from PIL import Image
 
-def filter(image):
+def edge_detection(image):
     image_l = image.load()
     new_image = Image.new('L', image.size)
     new_image_l = new_image.load()
@@ -13,3 +13,16 @@ def filter(image):
                 pix = 0 
             new_image_l[x, y] = pix
     return new_image
+
+def high_pass(image, high_pass):
+    image_l = image.load()
+    new_image = Image.new('L', image.size)
+    new_image_l = new_image.load()
+    for x in range(image.size[0]):
+        for y in range(image.size[1]):
+            if image_l[x, y] < high_pass:
+                new_image_l[x, y] = 0
+            else:
+                new_image_l[x, y] = image_l[x, y]
+
+    return new_image
diff --git a/hough.py b/hough.py
new file mode 100644 (file)
index 0000000..22c52f3
--- /dev/null
+++ b/hough.py
@@ -0,0 +1,49 @@
+from PIL import Image
+from math import sin, cos, pi
+import os
+
+def clear():
+    if os.name == 'posix':
+        os.system('clear')
+    elif os.name == ('ce', 'nt', 'dos'):
+        os.system('cls')
+
+def transform(image):
+
+    image_l = image.load()
+    size = image.size
+       
+    dt = pi / size[1]
+    initial_angle = (pi / 4) + (dt / 2)
+
+    matrix = [[0]*size[1] for _ in xrange(size[0])]
+
+    for x in xrange(size[0]):
+        clear()
+        print "{0}/{1}".format(x + 1, size[0])
+        for y in xrange(size[1]):
+            if image_l[x, y]:
+                # for every angle:
+                for a in xrange(size[1]):
+                    # find the distance:
+                    # distance is the dot product of vector (x, y) - centerpoint
+                    # and a unit vector orthogonal to the angle
+                    distance = (((x - (size[0] / 2)) * sin((dt * a) + initial_angle)) + 
+                                ((y - (size[1] / 2)) * -cos((dt * a) + initial_angle)) +
+                                size[0] / 2)
+                    column = int(round(distance)) # column of the matrix closest to the distance
+                    if column >= 0 and column < size[0]:
+                        matrix[column][a] += 1
+
+    new_image = Image.new('L', size)
+    new_image_l = new_image.load()
+
+    minimum = min([min(m) for m in matrix])
+
+    maximum = max([max(m) for m in matrix]) - minimum
+
+    for y in xrange(size[1]):
+        for x in xrange(size[0]):
+            new_image_l[x, y] = (float(matrix[x][y] - minimum) / maximum) * 255
+            
+    return new_image
diff --git a/image_small.jpg b/image_small.jpg
new file mode 100644 (file)
index 0000000..f8714ad
Binary files /dev/null and b/image_small.jpg differ
index 94f90a0..0fee41f 100755 (executable)
--- a/imago.py
+++ b/imago.py
@@ -1,39 +1,47 @@
 #!/usr/bin/env python
 """Usage: imago.py file"""
 
+import sys
 import Image
 import im_debug
-import sys
-from filter import filter
+import filter
+import hough
 
-class Usage(Exception):
+class UsageError(Exception):
     def __init__(self, msg):
         self.msg = msg
 
-def main(argv=None):
+def main(*argv):
     """Main function of the program."""
     try:
-        if argv is None:
-            try:
-                argv = sys.argv[1]
-            except IndexError:
-                raise Usage('no arguments given')
-    except Usage, err:
-        print >>sys.stderr, err.msg
-        print >>sys.stderr, "for help use --help"
+        if argv is ():
+            argv = sys.argv[1:]
+            if argv == []:
+                raise UsageError('Missing filename')
+        if "--help" in argv:
+                print __doc__
+                return 0    
+    except UsageError, err:
+        print >>sys.stderr, err.msg, "(\"imago.py --help\" for help)"
         return 2
 
-    #TODO exception on empty argument
     #TODO exception on file error
-    image = Image.open(argv)
-    im_debug.show(image, "original image")
+    image = Image.open(argv[0])
+    #im_debug.show(image, "original image")
 
     im_l = image.convert('L')
-    im_debug.show(im_l, "ITU-R 601-2 luma transform")
+    #im_debug.show(im_l, "ITU-R 601-2 luma transform")
+
+    im_edges = filter.edge_detection(im_l)
+    #im_debug.show(im_edges, "edge detection")
+
+    im_h = filter.high_pass(im_edges, 80)
+    #im_debug.show(im_h, "high pass filter")
+
+    im_hough = hough.transform(im_h)
+    im_debug.show(im_hough, "hough transform")
 
-    im_edges = filter(im_l)
-    im_debug.show(im_edges, "edge detection")
+    return 0
 
 if __name__ == '__main__':
-    main() #sys.exit(main())
-    
+    sys.exit(main())