spacepaste

  1.  
  2. def euclidean(a, b):
  3. '''returns the euclidean distance between two pixel RGB values.'''
  4. r = (a[0] - b[0]) * (a[0] - b[0])
  5. g = (a[1] - b[1]) * (a[1] - b[1])
  6. b = (a[2] - b[2]) * (a[2] - b[2])
  7. return math.sqrt(r + g + b)
  8. def kmeans(source_colors, k):
  9. '''takes a list of source colors as tuples and returns a kmeans generated color palette'''
  10. kmeans = {}
  11. for i in range(k):
  12. r = random.choice(source_colors)
  13. kmeans[r] = []
  14. while True:
  15. for color in source_colors:
  16. distances = {}
  17. for mean in kmeans:
  18. distances[mean] = euclidean(color, mean)
  19. mdist = min(distances.values())
  20. for key, val in distances.items():
  21. if val == mdist:
  22. kmeans[key].append(color)
  23. new_kmeans = {}
  24. for mean, colors in kmeans.items():
  25. r, g, b = 0, 0, 0
  26. for i in colors:
  27. r += i[0]
  28. g += i[1]
  29. b += i[2]
  30. r = r // len(colors)
  31. g = g // len(colors)
  32. b = b // len(colors)
  33. new_kmeans[(r, g, b)] = []
  34. if kmeans.keys() == new_kmeans.keys():
  35. break
  36. else:
  37. kmeans = new_kmeans
  38. palette = list(kmeans.keys())
  39. return palette
  40.