Что я делаю не так с этим уравнением преобразования цветов RGB в HSV? - PullRequest
0 голосов
/ 07 февраля 2019

Для универсального проекта я делаю свой собственный конвертер цветов 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

Для тех, кто заинтересован, скриншоты взяты из PDF, который можно найти здесь .

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 07 февраля 2019

Почему вы берете абсолютные значения для dr, dg, db?Не то чтобы у них был какой-то путь к отрицательному результату, и на самом деле, если бы они это сделали, я бы воспринял это как указание на ошибку в дальнейшем.

Я человек с C и VHDL, а не javascript, но, конечно же,

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

должно быть что-то вроде

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

Я предполагаю, что == & && связывают верные пути, и вам не нужны дополнительные скобки (я бы вставил их в C только потому, что в нем есть некоторые неясные случаи, которые не стоит запоминать).

Я также подвергаю сомнению целесообразность сравнений равенства с плавающей точкой здесь, которые редко заканчиваются хорошо.Было бы хорошо, если бы не отличный дизайн в типе с фиксированной запятой, но Javascript IIRC имеет тенденцию использовать FP для любых числовых вещей, которые просто болезненны (И X86 делает избыточную точность, если не задействована очистка регистра, которая может жаловаться на равенства FP).Посмотрите классическую статью Goldburgs, если вы хотите получить математику, или это, если вы хотите что-то более простое https://floating -point-gui.de /

Не должны maxRGB и minRGB принимать аргументы(Вы не показываете эти функции), но я ожидаю, что они будут принимать r, g, b в качестве параметров?

Я склонен иметь дело с цветом в широковещании (где мы живем в пространствах Y'CbCr), ноЯ также думаю, что вам, вероятно, следует перейти к линейному световому пространству перед выполнением преобразования, так как в противном случае гамма-кривые вас обидят, но это неприятно.

...