Konwersja RGB->XYZ->LUV

0

Witam, próbuję napisać konwersję pomiędzy przestrzeniami barw z RGB do LUV i z powrotem. Krokiem pośrednim jest konwersja na XYZ. Korzystałem ze wzorów i stałych opisanych na stronie: http://www.brucelindbloom.com/index.html?Math.html
Konwersja RGB<->XYZ wydaje się działać jak należy, napisałem dodatkowo XYZ<->LAB i wszystko jest w porządku. LUV wydawał się mieć mniej złożone wzory jednak napotkałem na pewne trudności.
Konwertuję obrazek RGB->XYZ->LUV następnie zmieniam wartości L,U,V i sprawdzam co się dzieje na obrazie. Dla LAB działało to tak, że zmiana L powodowała przyciemnienie/rozjaśnienie obrazka, zmiana A powodowała zmianę kolorów ku zieleni lub czerwieni, a zmiana B zmieniała kolory na niebieskie/żółte zależnie od tego w którą stronę modyfikuję wartości.
LUV ma w działaniu być taki sam podobno. Po konwersji zmieniam wartości L,U oraz V. Dla U wszystko jest dobrze - w jedną stronę obraz robi się zielony, a w drugą czerwony. Dla L obraz się rozjaśnia i przyciemnia, ale przy przyciemnianiu pojawiają się jakieś dziwne kolorowe pixele w niektórych miejscach. Największy problem jest jednak z V, w stronę żółci jest ok, natomiast w stronę niebieskiego obraz robi się fioletowy i pojawiają się zielone pixele.
Zrobiłem następującą rzecz: pobrałem kolor rgb pixela który robi się później zielony, skonwertowałem go na LUV i zgodnie z kalkulatorem na stronie lindblooma otrzymałem dobre wartości. Potem zmieniłem wartość V na -140 czyli minimalną i skonwertowałem do XYZ a potem do RGB i pojawiają się problemy... Konwersja LUV->XYZ wygląda w porządku, natomiast otrzymuję ujemne X oraz Z i przy konwersji XYZ->RGB jest podnoszenie do potęgi 1/2.2 czyli tak jakby pierwiastkowanie i dostaję w wyniku nany. To powoduje powstawanie artefaktów. Próbowałem ucinać liczby do zakresu <0,1> albo robić na nich abs, ale to nie daję wciąż dobrego wyniku.
Czy ktoś ma na to jakieś rady? Bo przeglądałem już różne strony, dokumenty i artykuły o tych przestrzeniach barw i nigdzie nic na ten temat nie znalazłem.

0

Największy problem jest jednak z V, w stronę żółci jest ok, natomiast w stronę niebieskiego obraz robi się fioletowy i pojawiają się zielone pixele.
Najprawdopodobniej przekraczasz gdzieś zakres, czyli np. otrzymujesz wartość powyżej 255 dla jednego bajta.

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