Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the best algorithm for finding the closest color in an array to another color? [closed]

Tags:

I have a color (RGB) being read from a sensor. I also have a list of "known" colors, each paired with a string name.

What would the best way (ie behave like a human choosing colors) to pull the name of the nearest color out of this list?

I've tried a shortest cartesian distance with RGB, but that makes grey closer to green than to black or white.

like image 450
Eric Avatar asked Nov 12 '09 07:11

Eric


2 Answers

Rather than using RGB, try using an HSL (Hue, Saturation, Lightness) or HSV (Hue, Saturation and Value) color model. Then experiment with different elements of bias, e.g. hue being more important than luminance when you're calculating the distance.

like image 194
Jon Skeet Avatar answered Oct 01 '22 11:10

Jon Skeet


Jon Skeet is right. You need to use a system with Hue as a component instead of RGB if you are concerned about the color component of the match differing too much. HSL or HSV will both work fine for this purpose.

Then you need to fiddle with the distance formula to weight up hue until you are happy with the results. Note that you will find the problem is actually essentially insoluble unless you have a large number of colors to match against or your input colors are confined to a small range of possible values. This is because although it might seem you can pin any color you want to one of 8 (red, orange yellow, green, blue, violet, black and white) or one of 16, in reality you'll find your algorithm will always find what seem to be obviously incorrect matches because with 3 axis of movement (hue, saturation, value or red, green, blue), there are a lot more "basic" colors than you might think at first glance.

like image 27
Southern Hospitality Avatar answered Oct 01 '22 11:10

Southern Hospitality