e77072451f61c75ade480161760521f47fd1ca8b
[imago.git] / filters.py
1 from PIL import Image
2
3 from commons import clear
4
5 def edge_detection(image):
6     clear()
7     print "edge detection"
8
9     image_l = image.load()
10     new_image = Image.new('L', image.size)
11     new_image_l = new_image.load()
12     
13     for x in range(2, image.size[0] - 2):
14         for y in range(2, image.size[1] - 2):
15             pix = (sum([sum([
16                 image_l[a, b] 
17                     for b in range(y - 2, y + 3)]) 
18                     for a in range(x - 2, x + 3)])
19                 - (25 * image_l[x, y]))
20             if pix > 255:
21                 pix = 255
22             if pix < 0:
23                 pix = 0 
24             new_image_l[x, y] = pix
25     return new_image
26
27 def peaks(image):
28     clear()
29     print "peak extraction"
30
31     image_l = image.load()
32     new_image = Image.new('L', image.size)
33     new_image_l = new_image.load()
34     
35     for x in range(2, image.size[0] - 2):
36         for y in range(2, image.size[1] - 2):
37             pix = (sum([sum([
38                 - image_l[a, b] 
39                     for b in range(y - 2, y + 3)]) 
40                     for a in range(x - 2, x + 3)])
41                 + (16 * image_l[x, y]))
42             if pix > 255:
43                 pix = 255
44             if pix < 0:
45                 pix = 0 
46             new_image_l[x, y] = pix
47     return new_image
48
49 def high_pass(image, height):
50     clear()
51     print "high pass filter"
52
53     image_l = image.load()
54     new_image = Image.new('L', image.size)
55     new_image_l = new_image.load()
56     
57     for x in xrange(image.size[0]):
58         for y in xrange(image.size[1]):
59             if image_l[x, y] < height:
60                 new_image_l[x, y] = 0
61             else:
62                 new_image_l[x, y] = image_l[x, y]
63
64     return new_image
65
66 def components(image):
67     clear()
68     print "components center filter"
69
70     image_l = image.load()
71     new_image = Image.new('L', image.size)
72     new_image_l = new_image.load()
73
74     components = []
75     comp_counter = 0
76
77     for y in xrange(1, image.size[1] - 1):
78         for x in xrange(1, image.size[0] - 1):
79             if image_l[x, y]:
80                 s = {0}
81                 s.add(new_image_l[x - 1, y - 1])
82                 s.add(new_image_l[x, y - 1])
83                 s.add(new_image_l[x + 1, y - 1])
84                 s.add(new_image_l[x - 1, y])
85                 if len(s) == 1:
86                     components.append(set())
87                     new_image_l[x, y] = comp_counter
88                     components[comp_counter].add((x, y))
89                     comp_counter += 1
90                 elif len(s) == 2:
91                     s.remove(0)
92                     c = s.pop()
93                     new_image_l[x, y] = c
94                     components[c].add((x,y))
95                 else:
96                     s.remove(0)
97                     c1, c2 = s.pop(), s.pop()
98                     components[c2].add((x, y))
99                     for (x1, y1) in components[c2]:
100                         new_image_l[x1, y1] = c1
101                     components[c1] = components[c1] | components[c2]
102                     components[c2] = None
103
104     new_image = Image.new('L', image.size)
105     new_image_l = new_image.load()
106
107     for component in components:
108         if component:
109             x_c = 0
110             y_c = 0
111             c = 0
112             for (x, y) in component:
113                 x_c += x
114                 y_c += y
115                 c += 1
116         new_image_l[int(round(float(x_c)/c)), int(round(float(y_c)/c))] = 255
117
118
119     return new_image