manual mode works
[imago.git] / filters.py
index df3b49f..825834f 100644 (file)
@@ -1,20 +1,39 @@
-from PIL import Image
-
-from commons import clear
+from PIL import Image, ImageFilter
 
 def edge_detection(image):
 
 def edge_detection(image):
+    image = image.filter(ImageFilter.GaussianBlur())
+    # GaussianBlur is undocumented class, it might not work in future versions
+    # of PIL
     image_l = image.load()
     new_image = Image.new('L', image.size)
     new_image_l = new_image.load()
     image_l = image.load()
     new_image = Image.new('L', image.size)
     new_image_l = new_image.load()
-    clear()
-    print "edge detection"
+    
+    for x in xrange(2, image.size[0] - 2):
+        for y in xrange(2, image.size[1] - 2):
+            pix = (sum([sum([
+                image_l[a, b] 
+                    for b in range(y - 2, y + 3)]) 
+                    for a in range(x - 2, x + 3)])
+                - (25  * image_l[x, y]))
+            if pix > 255:
+                pix = 255
+            if pix < 0:
+                pix = 0 
+            new_image_l[x, y] = pix
+    return new_image
+
+def peaks(image):
+    image_l = image.load()
+    new_image = Image.new('L', image.size)
+    new_image_l = new_image.load()
+    
     for x in range(2, image.size[0] - 2):
         for y in range(2, image.size[1] - 2):
     for x in range(2, image.size[0] - 2):
         for y in range(2, image.size[1] - 2):
-            pix = (sum([sum(
-                [image_l[a, b] 
+            pix = (sum([sum([
+                image_l[a, b] 
                     for b in range(y - 2, y + 3)]) 
                     for a in range(x - 2, x + 3)])
                     for b in range(y - 2, y + 3)]) 
                     for a in range(x - 2, x + 3)])
-                - (25 * image_l[x, y]))
+                + (16 * image_l[x, y]))
             if pix > 255:
                 pix = 255
             if pix < 0:
             if pix > 255:
                 pix = 255
             if pix < 0:
@@ -26,8 +45,7 @@ def high_pass(image, height):
     image_l = image.load()
     new_image = Image.new('L', image.size)
     new_image_l = new_image.load()
     image_l = image.load()
     new_image = Image.new('L', image.size)
     new_image_l = new_image.load()
-    clear()
-    print "high pass filter"
+    
     for x in xrange(image.size[0]):
         for y in xrange(image.size[1]):
             if image_l[x, y] < height:
     for x in xrange(image.size[0]):
         for y in xrange(image.size[1]):
             if image_l[x, y] < height:
@@ -36,3 +54,111 @@ def high_pass(image, height):
                 new_image_l[x, y] = image_l[x, y]
 
     return new_image
                 new_image_l[x, y] = image_l[x, y]
 
     return new_image
+
+def components(image):
+    image_l = image.load()
+    new_image = Image.new('L', image.size)
+    new_image_l = new_image.load()
+
+    components = [None]
+    comp_counter = 1
+
+    for y in xrange(1, image.size[1] - 1):
+        for x in xrange(1, image.size[0] - 1):
+            if image_l[x, y]:
+                s = {0}
+                s.add(new_image_l[x - 1, y - 1])
+                s.add(new_image_l[x, y - 1])
+                s.add(new_image_l[x + 1, y - 1])
+                s.add(new_image_l[x - 1, y])
+                if len(s) == 1:
+                    components.append(set())
+                    new_image_l[x, y] = comp_counter
+                    components[comp_counter].add((x, y))
+                    comp_counter += 1
+                elif len(s) == 2:
+                    s.remove(0)
+                    c = s.pop()
+                    new_image_l[x, y] = c
+                    components[c].add((x,y))
+                else:
+                    s.remove(0)
+                    c1, c2 = s.pop(), s.pop()
+                    components[c2].add((x, y))
+                    for (x1, y1) in components[c2]:
+                        new_image_l[x1, y1] = c1
+                    components[c1] = components[c1] | components[c2]
+                    components[c2] = None
+
+    new_image = Image.new('L', image.size)
+    new_image_l = new_image.load()
+
+    for component in components:
+        if component:
+            x_c = 0
+            y_c = 0
+            c = 0
+            for (x, y) in component:
+                x_c += x
+                y_c += y
+                c += 1
+            new_image_l[int(round(float(x_c)/c)), int(round(float(y_c)/c))] = 255
+
+
+    return new_image
+
+def components2(image):
+    image_l = image.load()
+    new_image = Image.new('L', image.size)
+    new_image_l = new_image.load()
+
+    components = [None]
+    comp_counter = 1
+
+    for y in xrange(2, image.size[1] - 2):
+        for x in xrange(2, image.size[0] - 2):
+            if image_l[x, y]:
+
+                s = {0}
+                for (a, b) in [(a,b) for a in range(x - 2, x + 3) 
+                          for b in range(y - 2, y + 1)]:
+                    if not (b == y and a >= x):
+                        s.add(new_image_l[a, b])
+
+                if len(s) == 1:
+                    components.append(set())
+                    new_image_l[x, y] = comp_counter
+                    components[comp_counter].add((x, y))
+                    comp_counter += 1
+                elif len(s) == 2:
+                    s.remove(0)
+                    c = s.pop()
+                    new_image_l[x, y] = c
+                    components[c].add((x,y))
+                else:
+                    s.remove(0)
+                    c1 = s.pop()
+                    components[c1].add((x, y))
+                    new_image_l[x, y] = c1
+                    for c2 in s:
+                        for (x1, y1) in components[c2]:
+                            new_image_l[x1, y1] = c1
+                        components[c1] = components[c1] | components[c2]
+                        components[c2] = None
+
+    new_image = Image.new('L', image.size)
+    new_image_l = new_image.load()
+
+    for component in components:
+        if component:
+            x_c = 0
+            y_c = 0
+            c = 0
+            for (x, y) in component:
+                x_c += x
+                y_c += y
+                c += 1
+            new_image_l[int(round(float(x_c)/c)), int(round(float(y_c)/c))] = 255
+
+
+    return new_image