better color distinction
[imago.git] / imago_pack / intrsc.py
index d26bea4..45308b1 100644 (file)
@@ -50,12 +50,16 @@ def board(image, lines, show_all, do_something):
     if show_all:
         import matplotlib.pyplot as pyplot
         pyplot.scatter(luma, saturation, 
-                       color=[(s[2][0]/255., s[2][1]/255., s[2][2]/255., 1.) 
-                              for s in board_raw])
+                       color=[(s[2][0]/255.,
+                               s[2][1]/255.,
+                               s[2][2]/255., 1.) 
+                                   for s in board_raw])
+        pyplot.xlim(0,1)
+        pyplot.ylim(0,1)
         pyplot.show()
 
     clusters = k_means.cluster(3, 2,zip(zip(luma, saturation), range(len(luma))),
-                               [[0., 0.], [0.5, 0.5], [1., 1.]])
+                               [[0., 0.5], [0.5, 0.5], [1., 0.5]])
    #clusters.sort(key=mean_luma)
 
     if show_all:
@@ -65,6 +69,8 @@ def board(image, lines, show_all, do_something):
                                                  color=(0,1,0,1))
         pyplot.scatter([d[0][0] for d in clusters[2]], [d[0][1] for d in clusters[2]],
                                                  color=(0,0,1,1))
+        pyplot.xlim(0,1)
+        pyplot.ylim(0,1)
         pyplot.show()
 
     clusters[0] = [(p[1], 'B') for p in clusters[0]]
@@ -108,19 +114,29 @@ def intersections_from_angl_dist(lines, size, get_all=True):
         intersections.append(line)
     return intersections
    
+def RGBtoSat(c):
+    """Using the HSI color model."""
+    max_diff = max(c) - min(c)
+    if max_diff == 0:
+        return 0
+    else:
+        return 1. - ((3. * min(c)) / sum(c)) 
+
 def stone_color_raw(image, (x, y)):
     """Given image and coordinates, return stone color."""
+    size = 3 
     suma = []
-    for i in range(-2, 3):
-        for j in range(-2, 3):
+    t = 0
+    for i in range(-size, size + 1):
+        for j in range(-size, size + 1):
             try:
                 suma.append(image.getpixel((x + i, y + j)))
+                t += 1
             except IndexError:
                 pass
-    luma = sum([0.30 * sum(s[0] for s in suma) / 25., 0.59 * sum(s[1] for s in suma) / 25., 
-            0.11 * sum(s[2] for s in suma) / 25.]) / 255.
-    saturation = sum(max(s) - min(s) / float(255. - abs(max(s) + min(s) - 255))
-                     for s in suma) / (25. * 255.)
-    color = [sum(s[0] for s in suma) / 25., sum(s[1] for s in suma) / 25.,
-             sum(s[2] for s in suma) / 25.]
+    luma = sum([0.30 * sum(s[0] for s in suma) / t, 0.59 * sum(s[1] for s in suma) / t, 
+            0.11 * sum(s[2] for s in suma) / t]) / 255.
+    saturation = sum(RGBtoSat(s) for s in suma) / t
+    color = [sum(s[0] for s in suma) / t, sum(s[1] for s in suma) / t,
+             sum(s[2] for s in suma) / t]
     return luma, saturation, color