Некорректный перевод 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

Обработанное изображение #1 в Geometrize Изображение #1 в игре Обработанное изображение #2 в Geometrize Изображение #2 в игре


Ответы (2 шт):

Автор решения: XelaNimed

В нижепредставленном методе используются преобразования описанные здесь.

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);

Взято здесь

→ Ссылка
Автор решения: CoCuCka

Проблема была в самой игре, вместо того чтобы обьект был условно темно красным при значениях 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 на объект. Спасибо за помощь.

→ Ссылка