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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这个RGB到HSV颜色转换方程我做错了什么?相关的知识,希望对你有一定的参考价值。

对于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颜色的色调,饱和度和值。一切运行正常,但我的输出是完全错误的。

据我所知,我已经正确地复制了这个等式。

这是我试图在代码中重写的等式:enter image description here enter image description here

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

任何帮助将不胜感激。

答案

你为什么要为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空间中),但我也认为你应该在转换之前转换为线性光空间,否则伽马曲线会让你感到麻烦,但这是一个准确。

以上是关于这个RGB到HSV颜色转换方程我做错了什么?的主要内容,如果未能解决你的问题,请参考以下文章

javascript中的RGB到HSV颜色? [关闭]

如何将 RGB 颜色转换为 HSV?

RGB与HSV之间的转换公式及颜色表

图像RGB到HSV色彩空间转换及其逆变换

HSV转换

带有颜色资源的Android LinearLayout:我做错了啥?