Skip to content

Instantly share code, notes, and snippets.

@ssledz
Last active August 4, 2017 12:13
Show Gist options
  • Save ssledz/b43c45d8662402a837e2ad59f42087e8 to your computer and use it in GitHub Desktop.
Save ssledz/b43c45d8662402a837e2ad59f42087e8 to your computer and use it in GitHub Desktop.
import json
import scipy
import scipy.misc
import scipy.cluster
import webcolors
COLOR_TO_COLOR_GROUP = {
u'pink': u'pink',
u'lightpink': u'pink',
u'hotpink': u'pink',
u'deeppink': u'pink',
u'palevioletred': u'pink',
u'mediumvioletred': u'pink',
u'lavender': u'purple',
u'thistle': u'purple',
u'plum': u'purple',
u'orchid': u'purple',
u'violet': u'purple',
u'fuchsia': u'purple',
u'magenta': u'purple',
u'mediumorchid': u'purple',
u'darkorchid': u'purple',
u'darkviolet': u'purple',
u'blueviolet': u'purple',
u'darkmagenta': u'purple',
u'purple': u'purple',
u'mediumpurple': u'purple',
u'mediumslateblue': u'purple',
u'slateblue': u'purple',
u'darkslateblue': u'purple',
u'rebeccapurple': u'purple',
u'indigo': u'purple',
u'lightsalmon': u'red',
u'salmon': u'red',
u'darksalmon': u'red',
u'lightcoral': u'red',
u'indianred': u'red',
u'crimson': u'red',
u'red': u'red',
u'firebrick': u'red',
u'darkred': u'red',
u'orange': u'orange',
u'darkorange': u'orange',
u'coral': u'orange',
u'tomato': u'orange',
u'orangered': u'orange',
u'gold': u'yellow',
u'yellow': u'yellow',
u'lightyellow': u'yellow',
u'lemonchiffon': u'yellow',
u'lightgoldenrodyellow': u'yellow',
u'papayawhip': u'yellow',
u'moccasin': u'yellow',
u'peachpuff': u'yellow',
u'palegoldenrod': u'yellow',
u'khaki': u'yellow',
u'darkkhaki': u'yellow',
u'greenyellow': u'green',
u'chartreuse': u'green',
u'lawngreen': u'green',
u'lime': u'green',
u'limegreen': u'green',
u'palegreen': u'green',
u'lightgreen': u'green',
u'mediumspringgreen': u'green',
u'springgreen': u'green',
u'mediumseagreen': u'green',
u'seagreen': u'green',
u'forestgreen': u'green',
u'green': u'green',
u'darkgreen': u'green',
u'yellowgreen': u'green',
u'olivedrab': u'green',
u'darkolivegreen': u'green',
u'mediumaquamarine': u'green',
u'darkseagreen': u'green',
u'lightseagreen': u'green',
u'darkcyan': u'green',
u'teal': u'green',
u'aqua': u'cyan',
u'cyan': u'cyan',
u'lightcyan': u'cyan',
u'paleturquoise': u'cyan',
u'aquamarine': u'cyan',
u'turquoise': u'cyan',
u'mediumturquoise': u'cyan',
u'darkturquoise': u'cyan',
u'cadetblue': u'blue',
u'steelblue': u'blue',
u'lightsteelblue': u'blue',
u'lightblue': u'blue',
u'powderblue': u'blue',
u'lightskyblue': u'blue',
u'skyblue': u'blue',
u'cornflowerblue': u'blue',
u'deepskyblue': u'blue',
u'dodgerblue': u'blue',
u'royalblue': u'blue',
u'blue': u'blue',
u'mediumblue': u'blue',
u'darkblue': u'blue',
u'navy': u'blue',
u'midnightblue': u'blue',
u'cornsilk': u'brown',
u'blanchedalmond': u'brown',
u'bisque': u'brown',
u'navajowhite': u'brown',
u'wheat': u'brown',
u'burlywood': u'brown',
u'tan': u'brown',
u'rosybrown': u'brown',
u'sandybrown': u'brown',
u'goldenrod': u'brown',
u'darkgoldenrod': u'brown',
u'peru': u'brown',
u'chocolate': u'brown',
u'olive': u'brown',
u'saddlebrown': u'brown',
u'sienna': u'brown',
u'brown': u'brown',
u'maroon': u'brown',
u'white': u'white',
u'snow': u'white',
u'honeydew': u'white',
u'mintcream': u'white',
u'azure': u'white',
u'aliceblue': u'white',
u'ghostwhite': u'white',
u'whitesmoke': u'white',
u'seashell': u'white',
u'beige': u'white',
u'oldlace': u'white',
u'floralwhite': u'white',
u'ivory': u'white',
u'antiquewhite': u'white',
u'linen': u'white',
u'lavenderblush': u'white',
u'mistyrose': u'white',
u'gainsboro': u'grey',
u'lightgray': u'grey',
u'silver': u'grey',
u'darkgray': u'grey',
u'dimgray': u'grey',
u'gray': u'grey',
u'lightslategray': u'grey',
u'slategray': u'grey',
u'darkslategray': u'grey',
u'black': u'grey'
}
def get_top_colors_from_img(im, colors_cnt=3):
def closest_colour(requested_colour):
min_colours = {}
for key, name in webcolors.css3_hex_to_names.items():
r_c, g_c, b_c = webcolors.hex_to_rgb(key)
rd = (r_c - requested_colour[0]) ** 2
gd = (g_c - requested_colour[1]) ** 2
bd = (b_c - requested_colour[2]) ** 2
min_colours[(rd + gd + bd)] = name
return min_colours[min(min_colours.keys())]
def get_colour_name(requested_colour, cnt):
try:
name = webcolors.rgb_to_name(requested_colour)
except ValueError:
name = closest_colour(requested_colour)
return {
"color": name,
"group": COLOR_TO_COLOR_GROUP[name],
"hex": webcolors.name_to_hex(name),
"counts": cnt
}
im = im.resize((150, 150)) # optional, to reduce time
ar = scipy.misc.fromimage(im=im, mode='RGB')
shape = ar.shape
ar = ar.reshape(scipy.product(shape[:2]), shape[2])
ar = ar.astype(float)
codes, dist = scipy.cluster.vq.kmeans(ar, colors_cnt)
vecs, dist = scipy.cluster.vq.vq(ar, codes) # assign codes
counts, bins = scipy.histogram(vecs, len(codes)) # count occurrences
c_sum = sum(counts)
colors = [get_colour_name(codes[i], 100 * counts[i] / c_sum) for i in range(0, len(codes))]
colors.sort(key=lambda x: -x['counts'])
return colors
@ssledz
Copy link
Author

ssledz commented Aug 4, 2017

pip install webcolors
pip install scipy

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment