Skip to content

Mean of hexadecimal numbers

9 messages · Atte Tenkanen, Bert Gunter, William Dunlap +2 more

#
Hi,

How would you calculate the "mean colour" of several colours, for 
example c("#FF7C00","#00BF40","#FFFF00")?

Yours,

Atte Tenkanen
#
?strtoi

You'll have to remove the "#" first, e.g. via substring()

-- Bert


Bert Gunter

"The trouble with having an open mind is that people keep coming along
and sticking things into it."
-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )
On Sat, Apr 16, 2016 at 5:47 AM, Atte Tenkanen <attenka at utu.fi> wrote:
#
... and if you need to convert back:  ?as.hexmode


-- Bert


Bert Gunter

"The trouble with having an open mind is that people keep coming along
and sticking things into it."
-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )
On Sat, Apr 16, 2016 at 8:20 AM, Bert Gunter <bgunter.4567 at gmail.com> wrote:
#
Since these are color strings, you can use functions in the grDevices
package (other others) to manipulate them.  E.g., you can convert them
to various color spaces and perhaps use the mean in one of those
spaces as your 'average color'.

  > myColors <- c(One="#FF7C00",Two="#00BF40",Three="#FFFF00")
  > col2rgb(myColors)
        One Two Three
  red   255   0   255
  green 124 191   255
  blue    0  64     0
  > rgb2hsv(col2rgb(myColors))
           One       Two     Three
  h 0.08104575 0.3891798 0.1666667
  s 1.00000000 1.0000000 1.0000000
  v 1.00000000 0.7490196 1.0000000



Bill Dunlap
TIBCO Software
wdunlap tibco.com
On Sat, Apr 16, 2016 at 8:27 AM, Bert Gunter <bgunter.4567 at gmail.com> wrote:

            

  
  
#
Thanks to William and Bert!

Atte

16.4.2016, 18.56, William Dunlap kirjoitti:

  
  
#
On 16/04/2016 8:47 AM, Atte Tenkanen wrote:
Bert answered your subject line question.  Your text is asking something 
else:  if those are colours, you don't want to treat each of them as a 
single integer.

A simple-minded approach would split them into 3 hex numbers, and 
average those (using Bert's solution).

A more sophisticated approach would take into account that they are 
really colours.  You could probably put together something using the 
colorRamp or colorRampPalette functions to average in perception space. 
  For example,

# Average the 1st two by taking the middle colour of a 3 colour palette
x <- colorRampPalette(c("#FF7C00","#00BF40"), space = "Lab")(3)[2]

# Average in the third by taking the 2nd of a 4 colour palette, so x
# gets twice the weight
colorRampPalette(c(x, "#FFFF00"), space = "Lab")(4)[2]

Duncan Murdoch
#
Hm...,

Should these two versions produce the same solution? Unfortunately and 
shame to confess, I don't know much about the colors in R:

myColors <- c("#FF7C00","#00BF40","#FFFF00")
Colors=rgb2hsv(col2rgb(myColors))
apply(Colors,1,mean)

         h         s         v
0.2122974 1.0000000 0.9163399

* * * * *

# Average the 1st two by taking the middle colour of a 3 colour palette
x <- colorRampPalette(c("#FF7C00","#00BF40"), space = "Lab")(3)[2]

# Average in the third by taking the 2nd of a 4 colour palette, so x
# gets twice the weight
colorRampPalette(c(x, "#FFFF00"), space = "Lab")(4)[2]

rgb2hsv(col2rgb(colorRampPalette(c(x, "#FFFF00"), space = "Lab")(4)[2]))

        [,1]
h 0.1597633
s 0.8407960
v 0.7882353

Atte T.


16.4.2016, 19.03, Duncan Murdoch kirjoitti:
#
grDevices has `convertColor()` and the `colorspace` has other
functions that can convert from RBG to Lab space. You should convert
the RGB colors to Lab and average them that way (or us other functions
to convert to HSL or HSV). It all depends on what you are trying to
accomplish with the "average" color determination.

-Bob

On Sat, Apr 16, 2016 at 12:03 PM, Duncan Murdoch
<murdoch.duncan at gmail.com> wrote:
#
On 16/04/2016 12:33 PM, Atte Tenkanen wrote:
I wouldn't expect them to.

Duncan Murdoch


  Unfortunately and