这个 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转换,否则伽马曲线会让你搞砸,但这是一个很好的选择。
对于 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转换,否则伽马曲线会让你搞砸,但这是一个很好的选择。