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