當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R rgb2hsv RGB 到 HSV 轉換


R語言 rgb2hsv 位於 grDevices 包(package)。

說明

rgb2hsv 將顏色從 RGB 空間(紅/綠/藍)轉換為 HSV 空間(色調/飽和度/值)。

用法

rgb2hsv(r, g = NULL, b = NULL, maxColorValue = 255)

參數

r

、( maxColorValue ) 或 3 行 RGB 矩陣中的 ‘red’ 值向量。

g

‘green’ 值的向量,或 NULL(當 r 是矩陣時)。

b

‘blue’ 值的向量,或 NULL(當 r 是矩陣時)。

maxColorValue

給出 RGB 顏色值範圍最大值的數字。默認 255 對應於 col2rgb() 中的典型 0:255 RGB 編碼。

細節

值(亮度)給出顏色中的光量。
色調說明了主波長。
飽和度是混合到顏色中的色相量。

HSV 顏色空間是相對於 RGB 顏色空間而言的,R是 sRGB,它具有隱式伽瑪校正。

每種顏色都有一列的矩陣。矩陣的三行表示色調、飽和度和明度,並相應地命名為"h""s""v"

例子

## 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


(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/maxColorValue
    if(gamma != 1) rgb <- rgb ^ (1/gamma)

    ## get the max and min
    v <- 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 hue
    idx <- (v == rgb[3,] & notgray )
    if (any (idx))
        h[idx] <- 2/3 + 1/6 * (rgb[1,idx] - rgb[2,idx]) / D[idx]
    ## green hue
    idx <- (v == rgb[2,] & notgray )
    if (any (idx))
        h[idx] <- 1/3 + 1/6 * (rgb[3,idx] - rgb[1,idx]) / D[idx]
    ## red hue
    idx <- (v == rgb[1,] & notgray )
    if (any (idx))
        h[idx] <-       1/6 * (rgb[2,idx] - rgb[3,idx]) / D[idx]

    ## correct for negative red
    idx <- (h < 0)
    h[idx] <- 1+h[idx]

    ## set the saturation
    s[! 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), tolerance = 1e-14) # TRUE

作者

R interface by Wolfram Fischer wolfram@fischer-zim.ch;
C code mainly by Nicholas Lewin-Koh nikko@hailmail.net.

也可以看看

hsvcol2rgbrgb

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 RGB to HSV Conversion。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。