如何使用HSL(色相,饱和度,亮度)圆柱色彩模型?

5
我想使用 HSL(色相饱和度亮度)颜色模型(圆柱形)。也许我错过了什么,但我找不到一个根据该方案返回颜色的函数。{{code}}中的colorspace包使用色度而不是饱和度。我想使用一种模型,其中最大亮度/光度将始终返回白色,如下图所示。如何在R中使用HSL模型指定颜色?
TIA 添加 使用hcl获取不同亮度级别的结果如下(此处的代码)。 enter image description here 我想要的是HSL模型。

enter image description here


看起来 colorscience 包中的 RGB2HSL 函数是进行此转换的唯一现有函数(通过 library("sos") 然后 findFn("HSL") 找到)。 - Bryan Hanson
这个函数是否可能是HLS(来自colorspace)?这三个字母有一些排列组合,但函数描述是关于色相、亮度和饱和度的吗? - bergant
1个回答

9

以下内容是从维基百科和Java代码中改编而来,诚实地说,用时不到90秒钟(我计时了):

# specify h as whole input degrees (e.g 0-360)
# s = 0.0 - 1 (0 - 100%)
# l = 0.0 - 1, (0 - 100%)
# returns output from R's rgb() functin

hsl_to_rgb <- function(h, s, l) {
  h <- h / 360
  r <- g <- b <- 0.0
  if (s == 0) {
    r <- g <- b <- l
  } else {
    hue_to_rgb <- function(p, q, t) {
      if (t < 0) { t <- t + 1.0 }
      if (t > 1) { t <- t - 1.0 }
      if (t < 1/6) { return(p + (q - p) * 6.0 * t) }
      if (t < 1/2) { return(q) }
      if (t < 2/3) { return(p + ((q - p) * ((2/3) - t) * 6)) }
      return(p)
    }
    q <- ifelse(l < 0.5, l * (1.0 + s), l + s - (l*s))
    p <- 2.0 * l - q
    r <- hue_to_rgb(p, q, h + 1/3)
    g <- hue_to_rgb(p, q, h)
    b <- hue_to_rgb(p, q, h - 1/3)
  }
  return(rgb(r,g,b))
}

# r, g, b = 0.0 - 1 (0 - 100%)
# returns h/s/l in a vector, h = 0-360 deg, s = 0.0 - 1 (0-100%), l = 0.0 - 1 (0-100%)
rgb_to_hsl <- function(r, g, b) {
  val_max <- max(c(r, g, b))
  val_min <- min(c(r, g, b))
  h <- s <- l <- (val_max + val_min) / 2
  if (val_max == val_min){
    h <- s <- 0
  } else {
    d <- val_max - val_min
    s <- ifelse(l > 0.5, d / (2 - val_max - val_min), d / (val_max + val_min))
    if (val_max == r) { h <- (g - b) / d + (ifelse(g < b, 6, 0)) }
    if (val_max == g) { h <- (b - r) / d/ + 2 }
    if (val_max == b) { h <- (r - g) / d + 4 }
    h <- (h / 6) * 360
  }
  return(c(h=h, s=s, l=l))
}

谢谢。但我猜对于一个不熟悉颜色空间(像我一样)的人来说,时间计数不会使用“秒”这个度量单位 ;) - Mark Heckmann
嗯,重点不是理解HSL,而是将Java代码简单地翻译成R(代码示例之间没有太大区别)。 - hrbrmstr
3
很确定 if (val_max == g) { h <- (b - r) / d/ + 2 } 这一行应该是 if (val_max == g) { h <- (b - r) / d + 2 }。除此之外,非常有用! - waferthin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接