X-Git-Url: http://git.tomasm.cz/imago.git/blobdiff_plain/ecc0929cb0e011db2825e79d7495d7ef7b113e1e..45b6aba3bbf3aea1bacad077387ae77a1deb1a3c:/imago_pack/intrsc.py?ds=sidebyside diff --git a/imago_pack/intrsc.py b/imago_pack/intrsc.py index 445c447..9fabcd5 100644 --- a/imago_pack/intrsc.py +++ b/imago_pack/intrsc.py @@ -1,11 +1,13 @@ -"""Imago intersections module""" +"""Imago intersections module.""" from math import cos, tan, pi from operator import itemgetter import ImageDraw +import filters import k_means +import output def dst(line): """Return normalized line.""" @@ -24,6 +26,7 @@ def dst_sort(lines): def board(image, lines, show_all, do_something): """Compute intersections, find stone colors and return board situation.""" + # TODO refactor show_all, do_something lines = [dst_sort(l) for l in lines] intersections = intersections_from_angl_dist(lines, image.size) @@ -35,10 +38,14 @@ def board(image, lines, show_all, do_something): draw.point((x , y), fill=(120, 255, 120)) do_something(image_g, "intersections") + image_c = filters.color_enhance(image) + if show_all: + do_something(image_c, "white balance") + board_raw = [] for line in intersections: - board_raw.append([stone_color_raw(image, intersection) for intersection in + board_raw.append([stone_color_raw(image_c, intersection) for intersection in line]) board_raw = sum(board_raw, []) @@ -49,12 +56,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: @@ -64,6 +75,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]] @@ -76,17 +89,19 @@ def board(image, lines, show_all, do_something): board_r = [] + #TODO 19 should be a size parameter try: for i in xrange(19): - board_r.append([]) for _ in xrange(19): - board_r[i].append(board_rg.next()) + board_r.append(board_rg.next()) except StopIteration: pass + - return board_r + return output.Board(19, board_r) def mean_luma(cluster): + """Return mean luma of the *cluster* of points.""" return sum(c[0][0] for c in cluster) / float(len(cluster)) def intersections_from_angl_dist(lines, size, get_all=True): @@ -106,19 +121,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