Rev 50803 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
% File src/library/grDevices/man/rgb2hsv.Rd% Part of the R package, http://www.R-project.org% Copyright 1995-2007 R Core Development Team% Distributed under GPL 2 or later\name{rgb2hsv}\alias{rgb2hsv}\title{RGB to HSV Conversion}\concept{color space conversion}\description{\code{rgb2hsv} transforms colorsfrom RGB space (red/green/blue)into HSV space (hue/saturation/value).}\usage{rgb2hsv(r, g = NULL, b = NULL, gamma = 1, maxColorValue = 255)}\arguments{\item{r}{vector of \sQuote{red} values in \eqn{[0, M]}, (\eqn{M= }\code{maxColorValue}) or 3-row rgb matrix.}\item{g}{vector of \sQuote{green} values, or \code{\link{NULL}} when\code{r} is a matrix.}\item{b}{vector of \sQuote{blue} values, or \code{\link{NULL}} when\code{r} is a matrix.}\item{gamma}{a gamma-correction (supposedly applied to ther,g,b values previously), see \code{\link{hsv}(...., gamma)}.}\item{maxColorValue}{number giving the maximum of the RGB color valuesrange. The default \code{255} corresponds to the typical \code{0:255}RGB coding as in \code{\link{col2rgb}()}.}}\details{Value (brightness) gives the amount of light in the color.\crHue describes the dominant wavelength.\crSaturation is the amount of Hue mixed into the color.}\value{A matrix with a column for each color. The three rows of the matrixindicate hue, saturation and value and are named \code{"h"},\code{"s"}, and \code{"v"} accordingly.}\seealso{\code{\link{hsv}}, \code{\link{col2rgb}}, \code{\link{rgb}}.}\author{\R interface by Wolfram Fischer \email{wolfram@fischer-zim.ch};\crC code mainly by Nicholas Lewin-Koh \email{nikko@hailmail.net}.}\examples{## These (saturated, bright ones) only differ by hue(rc <- col2rgb(c("red", "yellow","green","cyan", "blue", "magenta")))(hc <- rgb2hsv(rc))6 * hc["h",] # the hues are equispaced\testonly{set.seed(151)}(rgb3 <- floor(256 * matrix(stats::runif(3*12), 3,12)))(hsv3 <- rgb2hsv(rgb3))## Consistency :stopifnot(rgb3 == col2rgb(hsv(h=hsv3[1,], s=hsv3[2,], v=hsv3[3,])),all.equal(hsv3, rgb2hsv(rgb3/255, maxColorValue = 1)))## A (simplified) pure R version -- originally by Wolfram Fischer --## showing the exact algorithm:rgb2hsvR <- function(rgb, gamma = 1, maxColorValue = 255){if(!is.numeric(rgb)) stop("rgb matrix must be numeric")d <- dim(rgb)if(d[1] != 3) stop("rgb matrix must have 3 rows")n <- d[2]if(n == 0) return(cbind(c(h=1,s=1,v=1))[,0])rgb <- rgb/maxColorValueif(gamma != 1) rgb <- rgb ^ (1/gamma)## get the max and minv <- apply( rgb, 2, max)s <- apply( rgb, 2, min)D <- v - s # range## set hue to zero for undefined values (gray has no hue)h <- numeric(n)notgray <- ( s != v )## blue hueidx <- (v == rgb[3,] & notgray )if (any (idx))h[idx] <- 2/3 + 1/6 * (rgb[1,idx] - rgb[2,idx]) / D[idx]## green hueidx <- (v == rgb[2,] & notgray )if (any (idx))h[idx] <- 1/3 + 1/6 * (rgb[3,idx] - rgb[1,idx]) / D[idx]## red hueidx <- (v == rgb[1,] & notgray )if (any (idx))h[idx] <- 1/6 * (rgb[2,idx] - rgb[3,idx]) / D[idx]## correct for negative redidx <- (h < 0)h[idx] <- 1+h[idx]## set the saturations[! notgray] <- 0;s[notgray] <- 1 - s[notgray] / v[notgray]rbind( h=h, s=s, v=v )}## confirm the equivalence:all.equal(rgb2hsv (rgb3),rgb2hsvR(rgb3), tol=1e-14) # TRUE}\keyword{color}\keyword{dplot}