Re: Find nearest color in an RGB list

2012-01-11 Thread Nonsanity
Yeay! One always worries about code written IN the email... :)

 ~ Nonsanity


On Tue, Jan 10, 2012 at 3:31 PM, Michael Doub m...@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 9 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 m...@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@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@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@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@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode


Find nearest color in an RGB list

2012-01-10 Thread Michael Doub
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@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode


Re: Find nearest color in an RGB list

2012-01-10 Thread Nonsanity
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 9 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 m...@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@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@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode


Re: Find nearest color in an RGB list

2012-01-10 Thread Michael Doub
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 9 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 m...@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@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@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@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode