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