PaletteOptimiser

Changeset

28:b645174fcbb8
2015-10-02 Paul Boddie raw files shortlog changelog graph Simplified get_value to use probabilities instead of pixel positions. Removed redundant functions.
optimiser.py (file)
     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)