refactoring Hough class
[imago.git] / imago_pack / filters.py
1 from PIL import Image, ImageFilter
2
3 import pcf
4
5 def edge_detection(image):
6     image = image.filter(ImageFilter.GaussianBlur())
7     # GaussianBlur is undocumented class, it might not work in future versions
8     # of PIL
9     image = Image.fromstring('L', image.size,
10                              pcf.edge(image.size, image.tostring()))
11     return image
12
13 def peaks(image):
14     image_l = image.load()
15     new_image = Image.new('L', image.size)
16     new_image_l = new_image.load()
17     
18     for x in range(2, image.size[0] - 2):
19         for y in range(2, image.size[1] - 2):
20             pix = (sum([sum([
21                 - image_l[a, b] 
22                     for b in range(y - 2, y + 3)]) 
23                     for a in range(x - 2, x + 3)])
24                 + (17 * image_l[x, y]))
25             if pix > 255:
26                 pix = 255
27             if pix < 0:
28                 pix = 0 
29             new_image_l[x, y] = pix
30     return new_image
31
32 def high_pass(image, height):
33     image_l = image.load()
34     new_image = Image.new('L', image.size)
35     new_image_l = new_image.load()
36     
37     for x in xrange(image.size[0]):
38         for y in xrange(image.size[1]):
39             if image_l[x, y] < height:
40                 new_image_l[x, y] = 0
41             else:
42                 new_image_l[x, y] = image_l[x, y]
43
44     return new_image
45
46 def components(image):
47     image_l = image.load()
48     new_image = Image.new('L', image.size)
49     new_image_l = new_image.load()
50
51     components = [None]
52     comp_counter = 1
53
54     for y in xrange(1, image.size[1] - 1):
55         for x in xrange(1, image.size[0] - 1):
56             if image_l[x, y]:
57                 s = {0}
58                 s.add(new_image_l[x - 1, y - 1])
59                 s.add(new_image_l[x, y - 1])
60                 s.add(new_image_l[x + 1, y - 1])
61                 s.add(new_image_l[x - 1, y])
62                 if len(s) == 1:
63                     components.append(set())
64                     new_image_l[x, y] = comp_counter
65                     components[comp_counter].add((x, y))
66                     comp_counter += 1
67                 elif len(s) == 2:
68                     s.remove(0)
69                     c = s.pop()
70                     new_image_l[x, y] = c
71                     components[c].add((x,y))
72                 else:
73                     s.remove(0)
74                     c1, c2 = s.pop(), s.pop()
75                     components[c2].add((x, y))
76                     for (x1, y1) in components[c2]:
77                         new_image_l[x1, y1] = c1
78                     components[c1] = components[c1] | components[c2]
79                     components[c2] = None
80
81     new_image = Image.new('L', image.size)
82     new_image_l = new_image.load()
83
84     for component in components:
85         if component:
86             x_c = 0
87             y_c = 0
88             c = 0
89             for (x, y) in component:
90                 x_c += x
91                 y_c += y
92                 c += 1
93             new_image_l[int(round(float(x_c)/c)), int(round(float(y_c)/c))] = 255
94
95
96     return new_image
97
98 def components2(image):
99     image_l = image.load()
100     new_image = Image.new('L', image.size)
101     new_image_l = new_image.load()
102
103     components = [None]
104     comp_counter = 1
105
106     for y in xrange(2, image.size[1] - 2):
107         for x in xrange(2, image.size[0] - 2):
108             if image_l[x, y]:
109
110                 s = {0}
111                 for (a, b) in [(a,b) for a in range(x - 2, x + 3) 
112                           for b in range(y - 2, y + 1)]:
113                     if not (b == y and a >= x):
114                         s.add(new_image_l[a, b])
115
116                 if len(s) == 1:
117                     components.append(set())
118                     new_image_l[x, y] = comp_counter
119                     components[comp_counter].add((x, y))
120                     comp_counter += 1
121                 elif len(s) == 2:
122                     s.remove(0)
123                     c = s.pop()
124                     new_image_l[x, y] = c
125                     components[c].add((x,y))
126                 else:
127                     s.remove(0)
128                     c1 = s.pop()
129                     components[c1].add((x, y))
130                     new_image_l[x, y] = c1
131                     for c2 in s:
132                         for (x1, y1) in components[c2]:
133                             new_image_l[x1, y1] = c1
134                         components[c1] = components[c1] | components[c2]
135                         components[c2] = None
136
137     new_image = Image.new('L', image.size)
138     new_image_l = new_image.load()
139
140     for component in components:
141         if component:
142             x_c = 0
143             y_c = 0
144             c = 0
145             for (x, y) in component:
146                 x_c += x
147                 y_c += y
148                 c += 1
149             new_image_l[int(round(float(x_c)/c)), int(round(float(y_c)/c))] = 255
150
151     return new_image