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