Przekłamania w konwersji HSV na RGB i odwrotnie

Odpowiedz Nowy wątek
2011-06-27 20:01

Rejestracja: 11 lat temu

Ostatnio: 8 lat temu

0

Hej.
Nie wiem dlaczego, ale czasami podczas konwersji z jednego modelu barw na drugi mam przerażające różnice (nie raz wyskakujące poza zakres), a czasami mam idealne wartości.

Funkcja działa zawsze tak samo dla danych wejściowych. Dla jednych dobrze dla innych źle.
Przypuszczam, że błąd jest gdzieś w algorytmie.
Bardzo proszę o pomoc.

Moje dane wejściowe z modelu RGB to zasięg liczb od 0 do 255 dla każdej składowej
zaś model HSV to zasięg od 0 do 240 dla każdej składowej
np dla danych:
RGB(50, 228, 113)
dostaję składowe HSV:
HSV(48, 93, 77);

a powinienem dostać:
HSV(94, 184, 131);

Z kolei dla danych jak np:
RGB(188, 100, 90);
Otrzymuję 100% zgodności czyli:
HSV(4, 101, 131);

Kod funkcji wygląda tak:

void RGBToHSV(int r, int g, int b, int &h, int &s, int &v)
{
 int cMin = min(r, min(g, b));
 int cMax = max(r, min(g, b));
 double RDelta, GDelta, BDelta;
 v = (((cMax + cMin)*240) + 255 ) / (510);

     if (cMax == cMin)
     {
      s = 0;
      h = 160;
     }
     else
     {
       if (v < (120))
        s = (((cMax - cMin)*240) + ((cMax + cMin) / 2)) / (cMax + cMin);
       else
        s = (((cMax - cMin)*240) + ((510 - cMax - cMin) / 2)) / (510 - cMax - cMin);

        RDelta = (((cMax - r)*(40)) + ((cMax - cMin) / 2)) / (cMax - cMin);
        GDelta = (((cMax - g)*(40)) + ((cMax - cMin) / 2)) / (cMax - cMin);
        BDelta = (((cMax - b)*(40)) + ((cMax - cMin) / 2)) / (cMax - cMin);

         if (r == cMax)
          h = BDelta - GDelta;
         else
          if (g == cMax)
           h = (80) + RDelta - BDelta;
          else
           h = (160) + GDelta - RDelta;

     }
}

Bardzo proszę o pomoc.

Pozostało 580 znaków

2011-06-27 20:07

Rejestracja: 12 lat temu

Ostatnio: 9 miesięcy temu

0

Piszesz PhotoYebatora w DevC++? Co to za wcięcia robione randomem?


Women were the reason I became a monk - and, ah, the reason I switched back...

Pozostało 580 znaków

2011-06-27 20:09

Rejestracja: 11 lat temu

Ostatnio: 8 lat temu

0

Prosze skupić się na problemie. Kod jest pisany na brudno bo najpierw pisze funkcję testujące. Ta funkcja nawet nie widziała kodu PhotoYebatora od wewnątrz, póki co przynajmniej :)
A wcięcia są takie jak ja lubię.

Pozostało 580 znaków

2011-06-27 20:35

Rejestracja: 11 lat temu

Ostatnio: 8 lat temu

0

Ok już wiem gdzie był błąd :) W warunku jednym. Można zamknąć lub usunąć topic :)

Pozostało 580 znaków

2011-06-27 21:55

Rejestracja: 13 lat temu

Ostatnio: 30 sekund temu

2

JA dostałem odpowiedz, a was mam gdzieś!

Pozostało 580 znaków

2011-06-27 22:05

Rejestracja: 10 lat temu

Ostatnio: 16 minut temu

0

dokładnie zgadzam się z pelsta napisz gdzie był błąd dla pokoleń.


...

Pozostało 580 znaków

2011-06-27 22:19

Rejestracja: 15 lat temu

Ostatnio: 3 dni temu

Lokalizacja: ~Koszalin

0

Nie był tu?:

int cMax = max(r, min(g, b));

Pozostało 580 znaków

2011-06-27 22:24

Rejestracja: 11 lat temu

Ostatnio: 8 lat temu

Błąd był tam gdzie pokazał -=mAkAbrAs=- oraz tu:
if (v < (120))
powinno byc:
if (v <= (120))

No i największy błąd dotyczył typów danych gdzie każdy typ powinien być intem a nie double.

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0