I have a list of 20 colors, each is like this (0,0,0)(rgb) but with different values, and i need to find the closest to the color i am giving, for example (200, 191, 231). problem is i am not sure how i should check what color is the closes, and how am i suppose to set all these color values, in a list? in an array?
I've been thinking maybe add all the color for exmaple (1,2,3) = 4 an then find the closest but i am not sure if its a good idea..
Here's a list of the colors:
#(0, 0, 0) - Black
#(127, 127, 127) - Gray
#(136, 0, 21) - Bordeaux
#(237, 28, 36) - red
#(255, 127, 39) - orange
#(255, 242, 0) - yellow
#(34, 177, 76) - green
#(203, 228, 253) - blue
#(0, 162, 232) - dark blue
#(63, 72, 204) - purple
#(255, 255, 255) - white
#(195, 195, 195) - light gray
#(185, 122, 87) - light brown
#(255, 174, 201) - light pink
#(255, 201, 14) - dark yellow
#(239, 228, 176) - light yellow
#(181, 230, 29) - light green
#(153, 217, 234) - light blue
#(112, 146, 190) - dark blue
#(200, 191, 231) - light purple
And here is the function:
def paint(pixel):
r,g,b,a = pix[x,y]
print(str(r) + ' '+ str(g) + ' ' + str(b))
sleep(0.20)
If you come up with a good solution or have any question please replay thank you for your help!
You want to find the sum of the absolute difference between the red, green and blue numbers and choose the smallest one.
from math import sqrt
COLORS = (
(181, 230, 99),
(23, 186, 241),
(99, 23, 153),
(231, 99, 29),
)
def closest_color(rgb):
r, g, b = rgb
color_diffs = []
for color in COLORS:
cr, cg, cb = color
color_diff = sqrt((r - cr)**2 + (g - cg)**2 + (b - cb)**2)
color_diffs.append((color_diff, color))
return min(color_diffs)[1]
closest_color((12, 34, 156))
# => (99, 23, 153)
closest_color((23, 145, 234))
# => (23, 186, 241)
EDIT: Improved code and used Euclidian distance calculation Sven mentioned above instead of basic diff sum.