【问题标题】:What am I doing wrong with this RGB to HSV colour conversion equation?这个 RGB 到 HSV 颜色转换方程我做错了什么?
【发布时间】:2019-07-01 00:14:03
【问题描述】:

对于一个 uni 项目,我正在制作自己的 RGB 到 HSV 颜色转换器。

这是我写的代码

function calcSat() {
  s = (maxRGB() - minRGB()) / maxRGB();
  if (isNaN(s)) {
    s = 0;
  }
}

function calcVal() {
  v = maxRGB();
}

function calcHue() {
  var dr = (maxRGB() - r) /
    maxRGB() - minRGB();
  dr = Math.abs(dr);

  var dg = (maxRGB() - g) /
    maxRGB() - minRGB();
  dg = Math.abs(dg);

  var db = (maxRGB() - b) /
    maxRGB() - minRGB();
  db = Math.abs(db);

  console.log("red:" + r, "green:" + g, "blue:" + b);
  console.log("red d:" + dr, "green d:" + dg, "blue d:" + db);

  if (s == 0) {
    h = 0;
  } else if (r == maxRGB && g == minRGB) {
    h = 5 + db;
  } else if (r == maxRGB && g != minRGB) {
    h = 1 - dg;
  } else if (g == maxRGB && b == minRGB) {
    h = dr + 1;
  } else if (g == maxRGB && b != minRGB) {
    h = 3 - db;
  } else if (r == maxRGB) {
    h = 3 + dg;
  } else {
    h = 5 - dr;
  }

  h = h * 60;
}

您还可以在此处访问该项目的副本:https://editor.p5js.org/eeu8cc/sketches/tYfnkWrA-

基本上,我正在尝试创建 3 个函数来计算 RGB 颜色的色调、饱和度和值。一切运行良好,但我的输出完全错误。

据我所知,我已经正确地复制了方程式。

这是我试图用代码重写的等式:

对于那些感兴趣的人,屏幕截图来自一个 PDF,可以在here 找到。

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript colors rgb p5.js hsv


    【解决方案1】:

    你为什么要为 dr,dg,db 取绝对值?并不是说应该有任何方法使这些变为负数,事实上,如果他们这样做,我会认为这表明存在进一步的错误。

    我是 C 和 VHDL 的人,而不是 javascript,但肯定是

    if (r == maxRGB && g == minRGB)

    应该是类似的东西

    if (r == maxRGB() && g == minRGB())?

    我假设 == & && 以正确的方式绑定,并且您不需要额外的大括号(我会将它们放在 C 中,只是因为它有一些不值得记住的晦涩案例)。

    我也在这里质疑浮点相等比较的智慧,它很少有好的结果。没关系,如果不是定点类型的出色设计,但 IIRC javascript 倾向于将 FP 用于任何令人痛苦的数字内容(如果不涉及寄存器刷新,X86 会过度精度,这可能会刺痛 FP 等式)。如果您想学习数学,请参阅 Goldburgs 经典论文,或者如果您想要更简单的东西,请参阅此 https://floating-point-gui.de/

    maxRGB 和 minRGB 不应该带参数(你不显示这些函数),但我希望它们带 r,g,b 作为参数吗?

    我倾向于处理广播中的颜色(我们住在 Y'CbCr 空间中),但我也认为您可能应该在进行转换之前转换为线性光空间,否则伽马曲线会搞砸你,但是这是一个不错的选择。

    【讨论】:

    • 感谢您的精彩评论。我想你已经解决了我的问题。绝对值是我乱来的,我分享时忘记删除它们,所以我把它们拿走了。您使用 maxRGB() 而不是 maxRGB 是对的。这似乎解决了问题!我也会看看你提到的数学。如果我这个项目更专业, maxRGB() 和 minRGB() 将采用参数,但现在我使用的是全局变量。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2012-11-02
    • 2018-12-14
    • 2010-09-26
    • 2015-05-30
    • 1970-01-01
    • 2019-12-03
    相关资源
    最近更新 更多