这个 RGB 到 HSV 颜色转换方程我做错了什么?

What am I doing wrong with this RGB to HSV colour conversion equation?

对于 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

如有任何帮助,我们将不胜感激。

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

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

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

应该是

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

我假设 == & && 以正确的方式绑定并且你不需要额外的大括号(我会把它们放在 C 中只是因为它有一些不值得记住的模糊情况)。

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

不应该 maxRGB 和 minRGB 接受参数(你没有显示这些函数)但我希望他们接受 r,g,b 作为参数?

我倾向于处理广播中的颜色(我们住在 Y'CbCr spaces),但我也认为你应该在做你的之前转换成线性光 space转换,否则伽马曲线会让你搞砸,但这是一个很好的选择。