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