From 763884f1a5fd3c98e53112f2d136b7e5ecea3343 Mon Sep 17 00:00:00 2001 From: Tomas Musil Date: Mon, 25 Nov 2013 00:16:38 +0100 Subject: [PATCH] color auto levels --- imago_pack/filters.py | 33 ++++++++++++++++++++++++++++++--- imago_pack/intrsc.py | 7 ++++++- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/imago_pack/filters.py b/imago_pack/filters.py index 8c1c21b..3a64039 100644 --- a/imago_pack/filters.py +++ b/imago_pack/filters.py @@ -2,13 +2,40 @@ from PIL import Image, ImageFilter import pcf +def color_enhance(image): + image_l = image.load() + min_r, min_g, min_b = 999, 999, 999 + max_r, max_g, max_b = -1, -1, -1 + + for x in xrange(image.size[0]): + for y in xrange(image.size[1]): + min_r = min(min_r, image_l[x, y][0]) + max_r = max(max_r, image_l[x, y][0]) + min_g = min(min_g, image_l[x, y][1]) + max_g = max(max_g, image_l[x, y][1]) + min_b = min(min_b, image_l[x, y][2]) + max_b = max(max_b, image_l[x, y][2]) + + new_image = Image.new('RGB', image.size) + new_image_l = new_image.load() + for x in xrange(image.size[0]): + for y in xrange(image.size[1]): + r, g, b = image_l[x, y] + r = (r - min_r) * 255 / (max_r - min_r) + g = (g - min_g) * 255 / (max_g - min_g) + b = (b - min_b) * 255 / (max_b - min_b) + new_image_l[x, y] = (r, g, b) + # print min_r, max_r, r, g, b + + return new_image + def edge_detection(image): - image = image.filter(ImageFilter.GaussianBlur()) + new_image = image.filter(ImageFilter.GaussianBlur()) # GaussianBlur is undocumented class, it might not work in future versions # of PIL - image = Image.fromstring('L', image.size, + new_image = Image.fromstring('L', image.size, pcf.edge(image.size, image.tostring())) - return image + return new_image def peaks(image): image_l = image.load() diff --git a/imago_pack/intrsc.py b/imago_pack/intrsc.py index 45308b1..c64386f 100644 --- a/imago_pack/intrsc.py +++ b/imago_pack/intrsc.py @@ -5,6 +5,7 @@ from operator import itemgetter import ImageDraw +import filters import k_means import output @@ -36,10 +37,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, []) -- 2.4.2