Which is most accurate way to distinguish one of 8 colors?

后端 未结 6 789
星月不相逢
星月不相逢 2021-02-09 06:00

Imagine we how some basic colors:

RED = Color ((196, 2, 51), \"RED\")
ORANGE = Color ((255, 165, 0), \"ORANGE\")
YELLOW = Color ((255, 205, 0), \"YELLOW\")
GREEN         


        
6条回答
  •  無奈伤痛
    2021-02-09 06:18

    I hope this is the way it's supposed to work: It converts the colors to hsv, then takes the (squared) euclidean distance to all available colors and returns the closest match.

    Mostly a fixed version of gnibblers code.

    from colorsys import rgb_to_hsv
    
    colors = dict((
    ((196, 2, 51), "RED"),
    ((255, 165, 0), "ORANGE"),
    ((255, 205, 0), "YELLOW"),
    ((0, 128, 0), "GREEN"),
    ((0, 0, 255), "BLUE"),
    ((127, 0, 255), "VIOLET"),
    ((0, 0, 0), "BLACK"),
    ((255, 255, 255), "WHITE"),))
    
    def to_hsv( color ): 
        """ converts color tuples to floats and then to hsv """
        return rgb_to_hsv(*[x/255.0 for x in color]) #rgb_to_hsv wants floats!
    
    def color_dist( c1, c2):
        """ returns the squared euklidian distance between two color vectors in hsv space """
        return sum( (a-b)**2 for a,b in zip(to_hsv(c1),to_hsv(c2)) )
    
    def min_color_diff( color_to_match, colors):
        """ returns the `(distance, color_name)` with the minimal distance to `colors`"""
        return min( # overal best is the best match to any color:
            (color_dist(color_to_match, test), colors[test]) # (distance to `test` color, color name)
            for test in colors)
    
    color_to_match = (127, 255, 255)
    print min_color_diff( color_to_match, colors)
    

    All the funky list comprehension would look much better with a simple Color class that supports sorting and distance (but you can do that for practice ;-).

提交回复
热议问题