Find nearest color in an RGB list

Nonsanity form at nonsanity.com
Tue Jan 10 15:03:12 EST 2012


Both look like good suggestions for getting the closest color a human would
think is a "match", but both involve converting Livecode's native RGB to
another format. I may be wrong, but I don't think those conversions are
available built-in. I'm sure functions have been written to do this many
times, but it's not trivial to do from scratch. If you can get one, then
the following code will still work - It'll just work better. (Replace the
r, g, b variable names with the appropriate letters for clarity.)

Depending on your use case, you may not need to be that human-accurate, in
which case you can do the same calculation in RGB space. The square root
calculation in your two solutions is a way to get the distance between any
two points in three dimensional space. All three color formats have three
values, so they can all be pictured as a cube of space with colors as
points within that space. Your starting color is in there too, and you just
have to check the distance from it to all the other color points, and
return the shortest.

I'm typing this in a mail program, so it is untested...

function Distance3D( x1, y1, z1, x2, y2, z2 )
    return sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) + (z1-z2)*(z1-z2) )
end Distance3D

function GetClosestColor( r, g, b )
    put 99999 into ClosestDist
    put r &"," g &","& b into ClosestColor
    repeat for each line c of gColorList
        get Distance3D( r, g, b, item 1 of c, item 2 of c, item 3 of c )
        if it < ClosestDist then
            put it into ClosestDist
            put c into ClosestColor
        end if
    end repeat
    return ClosestColor
end GetClosestColor


You'd have your colors in gColorList like this:
    32,32,128
    255,255,255
    0,0,0
    128,128,256
    (etc)


 ~ Chris Innanen
 ~ Nonsanity



On Tue, Jan 10, 2012 at 1:13 PM, Michael Doub <mike at doub.com> wrote:

> I have a list of RGB colors that represent different color samples.   I
> need to create a function that will return the closest perceived RGB entry
> in the list when supplied a single RGB value.  Is anyone aware of a library
> or some sample code that would help with this task?
>
> From searching I found the follow two suggestions for solving this
> problem.  Neither are not intuitively obvious to the casual
> observer...namely me. ;-)
>
>
> 1) "Convert RGB to  CIE Lab color space, then compute the distance in that
> space ( deltaE = sqrt(deltaL^2 + deltaA^2 + deltaB^2).  Colors with the
> lowest deltaE are the most perceptually similar to each other."
>
> 2) "Convert to RGB to HSL and consider an HSL color value a vector and
> define a weighted modulus function for the vector like this:
> modulus = sqrt(a*H1*H1 + b*S1*S1 + c*L1*L1);  where a,b,c are weights you
> should decide based on your visual definition of what creates a bigger
> difference in perceived color - a 1% change in Hue or a 1% change in
> Saturation.  I would suggest you use a = b = 0.5 and c = 1 Finally, find
> out the range your modulus would take and define similar colors to be those
> which have their moduli very close to each other (say 5%)"
>
> Regards,
>   Mike
>
>
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode
>



More information about the use-livecode mailing list