Преобразование RGB в HSV

Привет, я хочу преобразовать rgb в hsv, и я следовал алгоритму с easyRGB.com. Но не работает, он показывает больше красного, чем обычно. Я переписываю один и тот же алгоритм несколько раз и исправляю, но не могу найти ошибку. Есть идеи? Алгоритм есть.

    public static double[] RGB2HSV(double[] tmp){

    double R = tmp[0] / 255.0;
    double G = tmp[1] / 255.0;
    double B = tmp[2] / 255.0;

    double min = Math.min(Math.min(R, G), B);
    double max = Math.max(Math.max(R, G), B);
    double delta = max - min;

    double H = max;
    double S = max;
    double V = max;

    if(delta == 0){
        H = 0;
        S = 0;
    }else{

        S = delta / max;

        double delR = ( ( ( max - R ) / 6 ) + ( delta / 2 ) ) / delta;
        double delG = ( ( ( max - G ) / 6 ) + ( delta / 2 ) ) / delta;
        double delB = ( ( ( max - B ) / 6 ) + ( delta / 2 ) ) / delta;

        if(R == max){
            H = delB - delG;
        }else if(G == max){
            H = (1/3) + delR - delB;
        }else if(B == max){
            H = (2/3) + delG - delR;
        }

        if(H < 0) H += 1;
        if(H > 1) H -= 1;
    }

    double[] hsv = new double[3];
    hsv[0] = H;
    hsv[1] = S;
    hsv[2] = V;
    return hsv;
}

person Jota_sk    schedule 28.11.2015    source источник


Ответы (1)


Значения 1/3 и (2/3) равны 0, потому что вы работаете с двумя целыми числами, поэтому результатом также является целое число.

Вместо этого используйте 1.0 / 3.0 и 2.0 / 3.0.

person medvedNick    schedule 28.11.2015
comment
Спасибо правда, глупая ошибка с моей стороны честно говоря. Я не могу поверить, что пытался исправить это и не осознавал этого. Спасибо! - person Jota_sk; 28.11.2015