comments for pso
[imago.git] / imago_pack / hough.py
index ec8058c..deeb9d8 100644 (file)
@@ -1,49 +1,73 @@
-from math import sin, cos, pi
+"""Hough transform module."""
+
+from math import pi
 
 from PIL import Image
 
 import pcf
 
 class Hough:
 
 from PIL import Image
 
 import pcf
 
 class Hough:
-    def __init__(self, size):
-        self.size = size
-        self.dt = pi / size[1]
-        self.initial_angle = (pi / 4) + (self.dt / 2)
+    """Hough transform.
+
+    This class stores the transformed image and metainformation.
+    """
+    def __init__(self, size, dt, init_angle, image):
+        self.size = size # this is a tuple (width, height)
+        self.dt = dt     # this is the angle step in hough transform
+        self.initial_angle = init_angle
+        self.image = image
+
+    @classmethod
+    def Transform(cls, image):
+        """Create Hough transform of the *image* with default parameters."""
+        # TODO rename to transform?
+        size = image.size
+        dt = pi / size[1]
+        initial_angle = (pi / 4) + (dt / 2)
+        image_s = pcf.hough(size, image.tostring(), initial_angle, dt)
+        image_t = Image.fromstring('L', size, image_s)
+        return cls(size, dt, initial_angle, image_t)
 
 
-    def transform(self, image):
-        image_s = pcf.hough(image.size, image.tostring(), self.initial_angle, self.dt)
-        image = Image.fromstring('L', image.size, image_s)
-        return image
+    def apply_filter(self, filter_f):
+        return Hough(self.size, self.dt, self.initial_angle,
+                     filter_f(self.image))
 
     def lines_from_list(self, p_list):
 
     def lines_from_list(self, p_list):
+        """Take a list of transformed points and return a list of corresponding
+        lines as (angle, distance) tuples."""
         lines = []
         for p in p_list:
             lines.append(self.angle_distance(p))
         return lines
 
         lines = []
         for p in p_list:
             lines.append(self.angle_distance(p))
         return lines
 
-    def all_lines_h(self, image):
-        im_l = image.load()
+    def all_lines_h(self):
+        # TODO what is this?
+        im_l = self.image.load()
         lines1 = []
         lines1 = []
-        for x in xrange(image.size[0] / 2):
-            for y in xrange(image.size[1]):
+        for x in xrange(self.size[0] / 2):
+            for y in xrange(self.size[1]):
                 if im_l[x, y]:
                     lines1.append(self.angle_distance((x, y)))
         lines2 = []
                 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]):
+        for x in xrange(self.size[0] / 2, self.size[0]):
+            for y in xrange(self.size[1]):
                 if im_l[x, y]:
                     lines2.append(self.angle_distance((x, y)))
         return [lines1, lines2]
 
                 if im_l[x, y]:
                     lines2.append(self.angle_distance((x, y)))
         return [lines1, lines2]
 
-    def all_lines(self, image):
-        im_l = image.load()
+    def all_lines(self):
+        # TODO what is this? how does it differ from the upper one?
+        im_l = self.image.load()
         lines = []
         lines = []
-        for x in xrange(image.size[0]):
-            for y in xrange(image.size[1]):
+        for x in xrange(self.size[0]):
+            for y in xrange(self.size[1]):
                 if im_l[x, y]:
                     lines.append(self.angle_distance((x, y)))
         return lines
     
     def angle_distance(self, point):
                 if im_l[x, y]:
                     lines.append(self.angle_distance((x, y)))
         return lines
     
     def angle_distance(self, point):
-        return (self.dt * point[1] + self.initial_angle, point[0] - self.size[0] / 2)
+        """Take a point from the transformed image and return the corresponding
+        line in the original as (angle, distance) tuple."""
+        return (self.dt * point[1] + self.initial_angle,
+                point[0] - self.size[0] / 2)