diff options
Diffstat (limited to 'tools/py/colorz.py')
-rw-r--r-- | tools/py/colorz.py | 71 |
1 files changed, 0 insertions, 71 deletions
diff --git a/tools/py/colorz.py b/tools/py/colorz.py deleted file mode 100644 index 8c00f0c..0000000 --- a/tools/py/colorz.py +++ /dev/null @@ -1,71 +0,0 @@ -from collections import namedtuple -from math import sqrt -import random -try: - import Image -except ImportError: - from PIL import Image - -Point = namedtuple('Point', ('coords', 'n', 'ct')) -Cluster = namedtuple('Cluster', ('points', 'center', 'n')) - -def get_points(img): - points = [] - w, h = img.size - for count, color in img.getcolors(w * h): - points.append(Point(color, 3, count)) - return points - -rtoh = lambda rgb: '#%s' % ''.join(('%02x' % p for p in rgb)) - -def colorz(filename, n=3): - img = Image.open(filename) - img.thumbnail((200, 200)) - w, h = img.size - - points = get_points(img) - clusters = kmeans(points, n, 1) - rgbs = [map(int, c.center.coords) for c in clusters] - return map(rtoh, rgbs) - -def euclidean(p1, p2): - return sqrt(sum([ - (p1.coords[i] - p2.coords[i]) ** 2 for i in range(p1.n) - ])) - -def calculate_center(points, n): - vals = [0.0 for i in range(n)] - plen = 0 - for p in points: - plen += p.ct - for i in range(n): - vals[i] += (p.coords[i] * p.ct) - return Point([(v / plen) for v in vals], n, 1) - -def kmeans(points, k, min_diff): - clusters = [Cluster([p], p, p.n) for p in random.sample(points, k)] - - while 1: - plists = [[] for i in range(k)] - - for p in points: - smallest_distance = float('Inf') - for i in range(k): - distance = euclidean(p, clusters[i].center) - if distance < smallest_distance: - smallest_distance = distance - idx = i - plists[idx].append(p) - - diff = 0 - for i in range(k): - old = clusters[i] - center = calculate_center(plists[i], old.n) - new = Cluster(plists[i], center, old.n) - clusters[i] = new - diff = max(diff, euclidean(old.center, new.center)) - - if diff < min_diff: - break - - return clusters |