more comments in pcf.c
[imago.git] / imago_pack / hough.py
1 """Hough transform module."""
2
3 from math import pi
4
5 from PIL import Image
6
7 import pcf
8
9 class Hough:
10     def __init__(self, size, dt, init_angle, image):
11         self.size = size # TODO is this a tuple? This language is crazy
12         self.dt = dt
13         self.initial_angle = init_angle
14         self.image = image
15
16     @classmethod
17     def Transform(cls, image):
18         size = image.size
19         dt = pi / size[1]
20         initial_angle = (pi / 4) + (dt / 2)
21         image_s = pcf.hough(size, image.tostring(), initial_angle, dt)
22         image_t = Image.fromstring('L', size, image_s)
23         return cls(size, dt, initial_angle, image_t)
24
25     def apply_filter(self, filter_f):
26         return Hough(self.size, self.dt, self.initial_angle,
27                      filter_f(self.image))
28
29     def lines_from_list(self, p_list):
30         lines = []
31         for p in p_list:
32             lines.append(self.angle_distance(p))
33         return lines
34
35     def all_lines_h(self):
36         im_l = self.image.load()
37         lines1 = []
38         for x in xrange(self.size[0] / 2):
39             for y in xrange(self.size[1]):
40                 if im_l[x, y]:
41                     lines1.append(self.angle_distance((x, y)))
42         lines2 = []
43         for x in xrange(self.size[0] / 2, self.size[0]):
44             for y in xrange(self.size[1]):
45                 if im_l[x, y]:
46                     lines2.append(self.angle_distance((x, y)))
47         return [lines1, lines2]
48
49     def all_lines(self):
50         im_l = self.image.load()
51         lines = []
52         for x in xrange(self.size[0]):
53             for y in xrange(self.size[1]):
54                 if im_l[x, y]:
55                     lines.append(self.angle_distance((x, y)))
56         return lines
57     
58     def angle_distance(self, point):
59         return (self.dt * point[1] + self.initial_angle,
60                 point[0] - self.size[0] / 2)
61