1.1 --- a/optimiser.py Thu Oct 01 18:39:59 2015 +0200
1.2 +++ b/optimiser.py Fri Oct 02 13:52:42 2015 +0200
1.3 @@ -1,6 +1,6 @@
1.4 #!/usr/bin/env python
1.5
1.6 -from random import randint
1.7 +from random import random
1.8 from os.path import extsep, splitext
1.9 import EXIF
1.10 import PIL.Image
1.11 @@ -17,9 +17,6 @@
1.12 r2, g2, b2 = rgb2
1.13 return math.sqrt(pow(r1 - r2, 2) + pow(g1 - g2, 2) + pow(b1 - b2, 2))
1.14
1.15 -def brightness(rgb):
1.16 - return distance(rgb, (0, 0, 0))
1.17 -
1.18 def factor(start, end, rgb):
1.19 r1, g1, b1 = start
1.20 r2, g2, b2 = end
1.21 @@ -27,13 +24,7 @@
1.22 r, g, b = rgb
1.23 pr, pg, pb = r - r1, g - g1, b - b1
1.24 dp = pr * gr + pg * gg + pb * gb
1.25 - return dp / pow(distance(start, end), 2)
1.26 -
1.27 -def darklight(rgb1, rgb2):
1.28 - if brightness(rgb1) <= brightness(rgb2):
1.29 - return rgb1, rgb2
1.30 - else:
1.31 - return rgb2, rgb1
1.32 + return float(dp) / pow(distance(start, end), 2)
1.33
1.34 def nearest(rgb, values=None):
1.35 l = map(lambda c: (distance(rgb, c), c), values or corners)
1.36 @@ -44,27 +35,15 @@
1.37 l = nearest(rgb, values)
1.38 start, end = l[0][1], l[1][1]
1.39 f = factor(start, end, rgb)
1.40 - #if f > 0.5:
1.41 - # start, end = end, start
1.42 - # f = 1 - f
1.43 return start, end, f
1.44
1.45 -def choose(seq, f):
1.46 - last = int(seq * f)
1.47 - current = int((seq + 1) * f)
1.48 - return last != current
1.49 -
1.50 -def get_value(xy, rgb, width, height, values=None):
1.51 - x, y = xy
1.52 +def get_value(rgb, values=None):
1.53 rgb1, rgb2, f = pattern(rgb, values)
1.54 - if choose(x + randint(0, width), f) and choose(y + randint(0, height), f):
1.55 + if random() < pow(f, 2):
1.56 return rgb2
1.57 else:
1.58 return rgb1
1.59
1.60 -def get_best(rgb, values):
1.61 - return nearest(rgb, values)[0][1]
1.62 -
1.63 def sign(x):
1.64 return x >= 0 and 1 or -1
1.65
1.66 @@ -80,7 +59,7 @@
1.67 im = PIL.Image.new("RGB", (size, size))
1.68 for g in range(0, size):
1.69 for b in range(0, size):
1.70 - value = get_value((g, b), (r, (g * 256) / size, (b * 256 / size)), size, size)
1.71 + value = get_value((r, (g * 256) / size, (b * 256 / size)))
1.72 im.putpixel((g, b), value)
1.73 im.save("rgb%d.png" % r)
1.74
1.75 @@ -89,7 +68,7 @@
1.76 im = PIL.Image.new("RGB", (size, size))
1.77 for y in range(0, size):
1.78 for x in range(0, size):
1.79 - im.putpixel((x, y), get_value((x, y), rgb, size, size))
1.80 + im.putpixel((x, y), get_value(rgb))
1.81 im.save("rgb%02d%02d%02d.png" % rgb)
1.82
1.83 def rotate_and_scale(im, width, height, rotate):
1.84 @@ -148,7 +127,7 @@
1.85
1.86 # Count the number of requested colours.
1.87
1.88 - value = get_value((x, y), rgb, width, height)
1.89 + value = get_value(rgb)
1.90 if not c.has_key(value):
1.91 c[value] = 1
1.92 else:
1.93 @@ -174,9 +153,9 @@
1.94 # Get the requested colours and choose the closest alternative for
1.95 # less common colours.
1.96
1.97 - value = get_value((x, y), rgb, width, height)
1.98 + value = get_value(rgb)
1.99 if value in least:
1.100 - value = get_value((x, y), rgb, width, height, most)
1.101 + value = get_value(rgb, most)
1.102 im.putpixel((x, y), value)
1.103
1.104 im.save(output_filename)