Korekcja gamma, czyli moja taśma LED nie świeci we właściwym kolorze

dyi kotlin arduino 2017-08-17, 23:08,

Właśnie skończyłeś swój projekt sterownika RGB, ustawiasz jasność na 50%, a wydaje się jakby świeciło przynajmniej na 90%? A może chciałeś osiągnąć biały kolor a wyświetla się niebieski? Pierwsze to zasługa Twojego oka, które postrzega barwy zupełnie inaczej niż świeci dioda LED, drugie wynika najpewniej z tego, że producent taśmy RGB nie zadał sobie trudu jej odpowiedniej kalibracji.

Pierwszy problem można rozwiązać stosując odpowiednią korekcję gamma. Możesz o niej przeczytać więcej na Wikipedii (PL) oraz szczegółowo na Adafruit (EN). W wielkim skrócie chodzi o to, że ludzkie oko postrzega małe wzrosty jasności przy najciemniejszych barwach bardzo szybko i jako duże, gwałtowne zmiany, a w zakresie jasnych kolorów te same wzrosty postrzegane są jako niewielkie zmiany. Dlatego między 80% a 100% wypełnienia koloru dla nas zmiana jest praktycznie niezauważalna. Trzeba zatem wprowadzić tabelę, która będzie tłumaczyła oczekiwany poziom jasności na taki, który będzie dobrze odebrany przez nasze oko.

W podlinkowanym artykule Adafruit jest przykładowy fragment kodu, który to przelicza dla zadanego współczynnika i liczby poziomów, generując kod Arduino. Ponieważ jednak miałem do rozwiązania jeszcze problem nr 2 to przygotowałem aplikację, która robi to za jednym razem.

Problem nr 2 to taśma HC-T12V-16L-48/20 produkcji WORLDSEMI. Kolor niebieski jest w niej znacznie bardziej intensywny niż czerwony i zielony, dodatkowo jest bardziej fioletowy niż niebieski. Analogicznie zieleń jest jaśniejsza od czerwieni (chociaż już nie tak drastycznie). To wszystko powoduje, że dla każdej składowej potrzebuję innej krzywej korekcji gamma i innego maksymalnego poziomu wyjściowego.

Przygotowałem zatem aplikację, która mi to policzy. Zdecydowałem też, że skoro i tak większość poziomów jasności jest bezużyteczna to ograniczę się do 16 lub 32 poziomów, co da mi efektywnie około 4096 / 32768 odcieni kolorów, faktycznie różniących się od siebie.

Aplikacja napisana jest w Kotlinie, z użyciem JavaFX. Jej źródła znajdziesz na GitHubie

Zasady jej użytkowania są proste. Poziomy jasności liczone są od zera do maksymalnego poziomu jasności. Chcąc uzyskać 16 poziomów wpisujemy wartość 15, tym samym wygenerowana tablica będzie zawierała wartości od 0 do 15. Po wprowadzeniu wartości klikamy Przelicz i w dolnym oknie pojawi się gotowy kod do wklejenia do aplikacji, a na wykresie pojawi się ilustracja wygenerowanych tablic.

Ponieważ mój projekt bazuje na ESP8266 i nie chciałem bawić się z emulacją PROGMEM to domyślnie generowane tablice będą przechowywane w pamięci aplikacji. Jeśli przygotowujesz projekt na Arduino/AVR to warto zaznaczyć checkbox i mieć te same dane w pamięci programu.

Wartości gamma oraz maksymalne poziomy jasności są mocno eksperymentalne. W zasadzie trzeba je dopasować do swojej taśmy i własnych preferencji. W moim przypadku kalibracja polegała najlpierw na dopasowaniu poziomu maksymalnej jasności, tak by przełączając kolory na czerwony, zielony, niebieski postrzegana przeze mnie jasność była zbliżona, następnie korygowałem wartości tak, by kolor biały (wszystkie 3 składowe na maksymalnych poziomach) był mniej więcej taki, jakiego oczekuję.

Następnie, gdy maksymalny poziom jasności był już ustalony napisałem kawałek kodu, który generował 16 poziomów jasności na pasku LED i testowałem różne wartości krzywych, tak by mniej więcej ten sam kolor biały liniowo zmieniał się od ledwo widocznego do maksymalnie białego.

Po takiej kalibracji poziomów jasności mam pozornie mniej, ale przynajmniej osiągany kolor przypomina coś, co wybieram na monitorze. Moje ograniczenie do 16 czy 32 kolorów ułatwić ma mi życie w dalszej części projektu, ale jeśli masz już swój projekt, który działa na poziomach 0 - 255 to nie ma sensu na siłę ograniczać ich liczby, prościej może być po prostu zrobić tablice z maksymalnym poziomiem wejściowym ustawinym na 255.

Komentarze

Podobne wpisy