Find nearest color in an RGB list

Nonsanity form at nonsanity.com
Wed Jan 11 15:39:30 EST 2012


Yeay! One always worries about code written IN the email... :)

 ~ Nonsanity


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

> This works like a charm!
>
> Thanks,
>   Mike
>
>
>
> On 2012-01-10, at 3:03 PM, Nonsanity wrote:
>
> > 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
> >>
> > _______________________________________________
> > 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
>
>
> _______________________________________________
> 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