# HG changeset patch # User Paul Boddie # Date 1443786762 -7200 # Node ID b645174fcbb838a2b991fb34b07091de67c7a30e # Parent cd815af3effc57bd3a92b4861b7bb293ac104af3 Simplified get_value to use probabilities instead of pixel positions. Removed redundant functions. diff -r cd815af3effc -r b645174fcbb8 optimiser.py --- a/optimiser.py Thu Oct 01 18:39:59 2015 +0200 +++ b/optimiser.py Fri Oct 02 13:52:42 2015 +0200 @@ -1,6 +1,6 @@ #!/usr/bin/env python -from random import randint +from random import random from os.path import extsep, splitext import EXIF import PIL.Image @@ -17,9 +17,6 @@ r2, g2, b2 = rgb2 return math.sqrt(pow(r1 - r2, 2) + pow(g1 - g2, 2) + pow(b1 - b2, 2)) -def brightness(rgb): - return distance(rgb, (0, 0, 0)) - def factor(start, end, rgb): r1, g1, b1 = start r2, g2, b2 = end @@ -27,13 +24,7 @@ r, g, b = rgb pr, pg, pb = r - r1, g - g1, b - b1 dp = pr * gr + pg * gg + pb * gb - return dp / pow(distance(start, end), 2) - -def darklight(rgb1, rgb2): - if brightness(rgb1) <= brightness(rgb2): - return rgb1, rgb2 - else: - return rgb2, rgb1 + return float(dp) / pow(distance(start, end), 2) def nearest(rgb, values=None): l = map(lambda c: (distance(rgb, c), c), values or corners) @@ -44,27 +35,15 @@ l = nearest(rgb, values) start, end = l[0][1], l[1][1] f = factor(start, end, rgb) - #if f > 0.5: - # start, end = end, start - # f = 1 - f return start, end, f -def choose(seq, f): - last = int(seq * f) - current = int((seq + 1) * f) - return last != current - -def get_value(xy, rgb, width, height, values=None): - x, y = xy +def get_value(rgb, values=None): rgb1, rgb2, f = pattern(rgb, values) - if choose(x + randint(0, width), f) and choose(y + randint(0, height), f): + if random() < pow(f, 2): return rgb2 else: return rgb1 -def get_best(rgb, values): - return nearest(rgb, values)[0][1] - def sign(x): return x >= 0 and 1 or -1 @@ -80,7 +59,7 @@ im = PIL.Image.new("RGB", (size, size)) for g in range(0, size): for b in range(0, size): - value = get_value((g, b), (r, (g * 256) / size, (b * 256 / size)), size, size) + value = get_value((r, (g * 256) / size, (b * 256 / size))) im.putpixel((g, b), value) im.save("rgb%d.png" % r) @@ -89,7 +68,7 @@ im = PIL.Image.new("RGB", (size, size)) for y in range(0, size): for x in range(0, size): - im.putpixel((x, y), get_value((x, y), rgb, size, size)) + im.putpixel((x, y), get_value(rgb)) im.save("rgb%02d%02d%02d.png" % rgb) def rotate_and_scale(im, width, height, rotate): @@ -148,7 +127,7 @@ # Count the number of requested colours. - value = get_value((x, y), rgb, width, height) + value = get_value(rgb) if not c.has_key(value): c[value] = 1 else: @@ -174,9 +153,9 @@ # Get the requested colours and choose the closest alternative for # less common colours. - value = get_value((x, y), rgb, width, height) + value = get_value(rgb) if value in least: - value = get_value((x, y), rgb, width, height, most) + value = get_value(rgb, most) im.putpixel((x, y), value) im.save(output_filename)