# [R] measuring distances between colours?

Michael Friendly friendly at yorku.ca
Fri May 31 16:23:31 CEST 2013

```Hi John
This has been an interesting discussion.
Though you have a solution for your needs, you might be interested in
this javascript implementation that allows you to visually compare color
distances in various color spaces

http://stevehanov.ca/blog/index.php?id=116

And, all the theory of color distance is described in
http://en.wikipedia.org/wiki/Color_difference

PS: This is a very handy function.  When I last tried
aplpack::bagplot(), it was annoying that the colors could *only*
be specified in hex.

-Michael

On 5/30/2013 5:14 PM, John Fox wrote:
> Dear all,
>
> My thanks to everyone who addressed my question. I've incorporated Eik
> Vettorazzi's suggestion for improved conversion of hexadecimal RGB colours
> to decimal numbers, and Martin Maechler's hint to look at demo(colors). I've
> loosened the default definition of "close enough" from the latter, since the
> following seems to work well for my purposes.
>
> r2c <- function(){
>      hex2dec <- function(hexnums) {
>          # suggestion of Eik Vettorazzi
>          sapply(strtoi(hexnums, 16L), function(x) x %/% 256^(2:0) %% 256)
>      }
>      findMatch <- function(dec.col) {
>          sq.dist <- colSums((hsv - dec.col)^2)
>          rbind(which.min(sq.dist), min(sq.dist))
>      }
>      colors <- colors()
>      hsv <- rgb2hsv(col2rgb(colors))
>      function(cols, near=0.25){
>          cols <- sub("^#", "", toupper(cols))
>          dec.cols <- rgb2hsv(hex2dec(cols))
>          which.col <- apply(dec.cols, 2, findMatch)
>          matches <- colors[which.col[1, ]]
>          unmatched <- which.col[2, ] > near^2
>          matches[unmatched] <- paste("#", cols[unmatched], sep="")
>          matches
>      }
> }
>
> rgb2col <- r2c()
>
> For example,
>
>> rgb2col(c("010101", "EEEEEE", "AA0000", "00AA00", "0000AA", "AAAA00",
> "AA00AA", "00AAAA"))
> [1] "black"         "gray93"        "darkred"       "green4"
> [5] "blue4"         "darkgoldenrod" "darkmagenta"   "cyan4"
>
>> rgb2col(c("010101", "090909", "090000", "000900", "000009", "090900",
> "090009", "000909"))
> [1] "black"   "gray3"   "#090000" "#000900" "#000009" "#090900"
> [7] "#090009" "#000909"
>
> Thanks again,
>   John

--
Michael Friendly     Email: friendly AT yorku DOT ca
Professor, Psychology Dept. & Chair, Quantitative Methods
York University      Voice: 416 736-2100 x66249 Fax: 416 736-5814
4700 Keele Street    Web:   http://www.datavis.ca