Некорректный перевод RGB в HSV в C#
столкнулся с проблемой перевода RGB в HSV в C#. Сначала использовал HSL модель но она не подошла под мои задачи, то есть нужна конкретно HSV модель. В C# нет встроенного перевода Color в HSV поэтому я попытался написать сам и нашел несколько готовых решений, но всегда возникал непонятный артефакт с цветом. там где предположительно должен быть красный цвет в итоге преобразований я получаю зеленый. Нужна помощь. Функция перевода:
public float[] rgbToHSV(Color color)
{
float[] output = new float[3];
float hue, saturation, value;
int max = Math.Max(color.R, Math.Max(color.G, color.B));
int min = Math.Min(color.R, Math.Min(color.G, color.B));
hue = color.GetHue();
saturation = (max == 0) ? 0 : 1f - (1f * min / max);
value = max / 255f;
output[0] = hue;
output[1] = saturation;
output[2] = value;
return output;
}
Задача стоит в том чтобы взять RGB фигуры из .JSON файла после обработки изображения программой Geoemtrize, конвертировать в HSV для обьекта из игры, применить HSV на обьект в игре и задать черный полупрозрачный цвет. Но всегда непонятно откуда появляется зеленый цвет. file_1.json первой картинки: https://pastebin.com/6GV7tt1S file_2.json второй картинки: https://pastebin.com/NdjNW0DK
Ответы (2 шт):
В нижепредставленном методе используются преобразования описанные здесь.
public static void ColorToHSV(Color color, out double hue, out double saturation, out double value)
{
int max = Math.Max(color.R, Math.Max(color.G, color.B));
int min = Math.Min(color.R, Math.Min(color.G, color.B));
hue = color.GetHue();
saturation = (max == 0) ? 0 : 1d - (1d * min / max);
value = max / 255d;
}
Использование
double hue;
double saturation;
double value;
ColorToHSV(original, out hue, out saturation, out value);
Взято здесь
Проблема была в самой игре, вместо того чтобы обьект был условно темно красным при значениях HSV: 0 1 x>0.24, при value > 0.24 все обьекты становились зелеными. Решение простое, добавить условие в конец конструктора HSV:
public HSV(Color color)
{
double hue, saturation, value;
ColorToHSV(color, out hue, out saturation, out value);
this.hue = (float)hue; this.saturation = (float)saturation; this.value = (float)value;
if (hue == 0 && saturation == 1 && value > 0.24) this.hue = 1;
/*
* float[] hsv = rgbToHSV(color);
hue = hsv[0]; saturation = hsv[1]; value = hsv[2];
*/
/*
HSV hsv = color_to_hsv(color);
hue = hsv.hue; saturation = hsv.saturation; value = hsv.value;
*/
}
Градации зеленого встречаются только тогда, когда HUE == 0 И Saturation == 1, Значит достаточно изменить HUE на 1 чтобы исправить ошибку. Да это приведет к небольшой не точности, но это полностью решает все остальные артефакты при применении HSV на объект. Спасибо за помощь.