这个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颜色的色调,饱和度和值。一切运行正常,但我的输出是完全错误的。
据我所知,我已经正确地复制了这个等式。
对于那些感兴趣的人,截图来自可以找到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颜色转换方程我做错了什么?的主要内容,如果未能解决你的问题,请参考以下文章