Skip to content

Instantly share code, notes, and snippets.

@baverman
Last active January 4, 2016 06:29
Show Gist options
  • Select an option

  • Save baverman/8582680 to your computer and use it in GitHub Desktop.

Select an option

Save baverman/8582680 to your computer and use it in GitHub Desktop.

Revisions

  1. baverman revised this gist Jan 23, 2014. 1 changed file with 36 additions and 4 deletions.
    40 changes: 36 additions & 4 deletions tcolor.py
    100644 → 100755
    Original file line number Diff line number Diff line change
    @@ -251,15 +251,47 @@ def get_parts(c):
    return tuple(int(r, 16) for r in [c[:2], c[2:4], c[4:]])


    def get_dist(a, b):
    def dumb(a, b):
    return (a[0] - b[0])**2 + (a[1] - b[1])**2 + (a[2] - b[2])**2


    def rgb2xyz((r, g, b)):
    r /= 255.0
    g /= 255.0
    b /= 255.0

    r = (((r + 0.055) / 1.055) ** 2.4) if r > 0.04045 else r / 12.92
    g = (((g + 0.055) / 1.055) ** 2.4) if g > 0.04045 else g / 12.92
    b = (((b + 0.055) / 1.055) ** 2.4) if b > 0.04045 else b / 12.92

    x = r * 0.4124 + g * 0.3576 + b * 0.1805
    y = r * 0.2126 + g * 0.7152 + b * 0.0722
    z = r * 0.0193 + g * 0.1192 + b * 0.9505

    return x, y, z


    def xyz2lab((x, y, z)):
    x /= 95.047
    y /= 100.000
    z /= 108.883

    x = (x ** (1/3.0)) if x > 0.008856 else 7.787*x + 16/116.0
    y = (y ** (1/3.0)) if y > 0.008856 else 7.787*y + 16/116.0
    z = (z ** (1/3.0)) if z > 0.008856 else 7.787*z + 16/116.0

    return 116*y - 16, 500 * (x - y), 200 * (y - z)


    def CIE76(a, b):
    return dumb(xyz2lab(rgb2xyz(a)), xyz2lab(rgb2xyz(b)))


    PARTED_COLORS = [(get_parts(c), idx, c) for idx, c in COLORS]
    def find_nearest(c):
    def find_nearest(c, metric=dumb):
    cparts = get_parts(c)
    return min(PARTED_COLORS, key=lambda r: get_dist(r[0], cparts))
    return min(PARTED_COLORS, key=lambda r: metric(r[0], cparts))


    if __name__ == '__main__':
    print '{1} {2}'.format(*find_nearest(sys.argv[1]))
    print '{1} {2}'.format(*find_nearest(sys.argv[1], CIE76))
  2. baverman renamed this gist Jan 23, 2014. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  3. baverman created this gist Jan 23, 2014.
    265 changes: 265 additions & 0 deletions gistfile1.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,265 @@
    #!/usr/bin/env python2
    import sys

    COLORS = [
    ('16', '000000'),
    ('17', '00005f'),
    ('18', '000087'),
    ('19', '0000af'),
    ('20', '0000d7'),
    ('21', '0000ff'),
    ('22', '005f00'),
    ('23', '005f5f'),
    ('24', '005f87'),
    ('25', '005faf'),
    ('26', '005fd7'),
    ('27', '005fff'),
    ('28', '008700'),
    ('29', '00875f'),
    ('30', '008787'),
    ('31', '0087af'),
    ('32', '0087d7'),
    ('33', '0087ff'),
    ('34', '00af00'),
    ('35', '00af5f'),
    ('36', '00af87'),
    ('37', '00afaf'),
    ('38', '00afd7'),
    ('39', '00afff'),
    ('40', '00d700'),
    ('41', '00d75f'),
    ('42', '00d787'),
    ('43', '00d7af'),
    ('44', '00d7d7'),
    ('45', '00d7ff'),
    ('46', '00ff00'),
    ('47', '00ff5f'),
    ('48', '00ff87'),
    ('49', '00ffaf'),
    ('50', '00ffd7'),
    ('51', '00ffff'),
    ('52', '5f0000'),
    ('53', '5f005f'),
    ('54', '5f0087'),
    ('55', '5f00af'),
    ('56', '5f00d7'),
    ('57', '5f00ff'),
    ('58', '5f5f00'),
    ('59', '5f5f5f'),
    ('60', '5f5f87'),
    ('61', '5f5faf'),
    ('62', '5f5fd7'),
    ('63', '5f5fff'),
    ('64', '5f8700'),
    ('65', '5f875f'),
    ('66', '5f8787'),
    ('67', '5f87af'),
    ('68', '5f87d7'),
    ('69', '5f87ff'),
    ('70', '5faf00'),
    ('71', '5faf5f'),
    ('72', '5faf87'),
    ('73', '5fafaf'),
    ('74', '5fafd7'),
    ('75', '5fafff'),
    ('76', '5fd700'),
    ('77', '5fd75f'),
    ('78', '5fd787'),
    ('79', '5fd7af'),
    ('80', '5fd7d7'),
    ('81', '5fd7ff'),
    ('82', '5fff00'),
    ('83', '5fff5f'),
    ('84', '5fff87'),
    ('85', '5fffaf'),
    ('86', '5fffd7'),
    ('87', '5fffff'),
    ('88', '870000'),
    ('89', '87005f'),
    ('90', '870087'),
    ('91', '8700af'),
    ('92', '8700d7'),
    ('93', '8700ff'),
    ('94', '875f00'),
    ('95', '875f5f'),
    ('96', '875f87'),
    ('97', '875faf'),
    ('98', '875fd7'),
    ('99', '875fff'),
    ('100', '878700'),
    ('101', '87875f'),
    ('102', '878787'),
    ('103', '8787af'),
    ('104', '8787d7'),
    ('105', '8787ff'),
    ('106', '87af00'),
    ('107', '87af5f'),
    ('108', '87af87'),
    ('109', '87afaf'),
    ('110', '87afd7'),
    ('111', '87afff'),
    ('112', '87d700'),
    ('113', '87d75f'),
    ('114', '87d787'),
    ('115', '87d7af'),
    ('116', '87d7d7'),
    ('117', '87d7ff'),
    ('118', '87ff00'),
    ('119', '87ff5f'),
    ('120', '87ff87'),
    ('121', '87ffaf'),
    ('122', '87ffd7'),
    ('123', '87ffff'),
    ('124', 'af0000'),
    ('125', 'af005f'),
    ('126', 'af0087'),
    ('127', 'af00af'),
    ('128', 'af00d7'),
    ('129', 'af00ff'),
    ('130', 'af5f00'),
    ('131', 'af5f5f'),
    ('132', 'af5f87'),
    ('133', 'af5faf'),
    ('134', 'af5fd7'),
    ('135', 'af5fff'),
    ('136', 'af8700'),
    ('137', 'af875f'),
    ('138', 'af8787'),
    ('139', 'af87af'),
    ('140', 'af87d7'),
    ('141', 'af87ff'),
    ('142', 'afaf00'),
    ('143', 'afaf5f'),
    ('144', 'afaf87'),
    ('145', 'afafaf'),
    ('146', 'afafd7'),
    ('147', 'afafff'),
    ('148', 'afd700'),
    ('149', 'afd75f'),
    ('150', 'afd787'),
    ('151', 'afd7af'),
    ('152', 'afd7d7'),
    ('153', 'afd7ff'),
    ('154', 'afff00'),
    ('155', 'afff5f'),
    ('156', 'afff87'),
    ('157', 'afffaf'),
    ('158', 'afffd7'),
    ('159', 'afffff'),
    ('160', 'd70000'),
    ('161', 'd7005f'),
    ('162', 'd70087'),
    ('163', 'd700af'),
    ('164', 'd700d7'),
    ('165', 'd700ff'),
    ('166', 'd75f00'),
    ('167', 'd75f5f'),
    ('168', 'd75f87'),
    ('169', 'd75faf'),
    ('170', 'd75fd7'),
    ('171', 'd75fff'),
    ('172', 'd78700'),
    ('173', 'd7875f'),
    ('174', 'd78787'),
    ('175', 'd787af'),
    ('176', 'd787d7'),
    ('177', 'd787ff'),
    ('178', 'd7af00'),
    ('179', 'd7af5f'),
    ('180', 'd7af87'),
    ('181', 'd7afaf'),
    ('182', 'd7afd7'),
    ('183', 'd7afff'),
    ('184', 'd7d700'),
    ('185', 'd7d75f'),
    ('186', 'd7d787'),
    ('187', 'd7d7af'),
    ('188', 'd7d7d7'),
    ('189', 'd7d7ff'),
    ('190', 'd7ff00'),
    ('191', 'd7ff5f'),
    ('192', 'd7ff87'),
    ('193', 'd7ffaf'),
    ('194', 'd7ffd7'),
    ('195', 'd7ffff'),
    ('196', 'ff0000'),
    ('197', 'ff005f'),
    ('198', 'ff0087'),
    ('199', 'ff00af'),
    ('200', 'ff00d7'),
    ('201', 'ff00ff'),
    ('202', 'ff5f00'),
    ('203', 'ff5f5f'),
    ('204', 'ff5f87'),
    ('205', 'ff5faf'),
    ('206', 'ff5fd7'),
    ('207', 'ff5fff'),
    ('208', 'ff8700'),
    ('209', 'ff875f'),
    ('210', 'ff8787'),
    ('211', 'ff87af'),
    ('212', 'ff87d7'),
    ('213', 'ff87ff'),
    ('214', 'ffaf00'),
    ('215', 'ffaf5f'),
    ('216', 'ffaf87'),
    ('217', 'ffafaf'),
    ('218', 'ffafd7'),
    ('219', 'ffafff'),
    ('220', 'ffd700'),
    ('221', 'ffd75f'),
    ('222', 'ffd787'),
    ('223', 'ffd7af'),
    ('224', 'ffd7d7'),
    ('225', 'ffd7ff'),
    ('226', 'ffff00'),
    ('227', 'ffff5f'),
    ('228', 'ffff87'),
    ('229', 'ffffaf'),
    ('230', 'ffffd7'),
    ('231', 'ffffff'),

    # Gray-scale range.
    ('232', '080808'),
    ('233', '121212'),
    ('234', '1c1c1c'),
    ('235', '262626'),
    ('236', '303030'),
    ('237', '3a3a3a'),
    ('238', '444444'),
    ('239', '4e4e4e'),
    ('240', '585858'),
    ('241', '626262'),
    ('242', '6c6c6c'),
    ('243', '767676'),
    ('244', '808080'),
    ('245', '8a8a8a'),
    ('246', '949494'),
    ('247', '9e9e9e'),
    ('248', 'a8a8a8'),
    ('249', 'b2b2b2'),
    ('250', 'bcbcbc'),
    ('251', 'c6c6c6'),
    ('252', 'd0d0d0'),
    ('253', 'dadada'),
    ('254', 'e4e4e4'),
    ('255', 'eeeeee'),
    ]


    def get_parts(c):
    return tuple(int(r, 16) for r in [c[:2], c[2:4], c[4:]])


    def get_dist(a, b):
    return (a[0] - b[0])**2 + (a[1] - b[1])**2 + (a[2] - b[2])**2


    PARTED_COLORS = [(get_parts(c), idx, c) for idx, c in COLORS]
    def find_nearest(c):
    cparts = get_parts(c)
    return min(PARTED_COLORS, key=lambda r: get_dist(r[0], cparts))


    if __name__ == '__main__':
    print '{1} {2}'.format(*find_nearest(sys.argv[1]))