Cześć,
przechwytuję za pomocą kamerki umieszczonej pod kątem obraz z monitora. Z tego względu kolory pod kątem się zmieniają. Toteż wyświetlam sobie filmik kalibracyjny złożony z narastających kanałów RGB oddzielnie, a na początku jest kawałek białego aby ustawić balans białego oraz zmniejszyć wzmocnienie,aby otrzymać nieprzesycony obraz.
To jest jedna próbka tego jak kamera widzi obraz z monitora.
Temat teoretycznie prosty, ale nie doszedłem do perfekcyjnego rozwiązania. To co robiłem to:
1. Znalezienie najjaśniejszej białej próbki i wygenerowanie krzywych kolorów w zależności od max wartości tej próbki dla każdego pixela. Działa ok, ale tylko dla odcieni szarości. Powodem jest pewnie to, ze dla kamery R+G+B <>W, ze względu na nieliniową charakterystykę (wyświetlanie tylko kanałów RGB nie wypełnia pasm pomiędzy). Dlatego też dla kolorowych obrazów ta metoda się nie sprawdza.
2. Druga metoda wykorzystuje oddzielenie kanałów RGB (opis poniżej sporo uproszczony):
- z najjaśniejszej próbek dla kolejno R,G,B, zapisuje np. wartości linii na górze, czyli np dla ułatwienia mamy obraz 2x2 pixele, więc otrzymuję max wartości dla poszczególnych kolorów i pixeli:
Format: [kolor(max dla pixela 1, max dla pixel 2)]
R(220,190)
G(240,210)
B(170,140)
Widzimy, ze pixel 2 musi leżeć dalej, bo ma ciemniejsze wartości. Przy przechwytywaniu na wprost, wartości dla pixela 1 i 2 byłyby zbliżone i do tego dążymy.
-podobnie znajdujemy wartości minimalne (nieco wyższe niż przy zupełnej czerni, aby otrzymać tendecję spadku wartości):
R(10,5)
G(20,7)
B(15,7)
Tutaj szukam wartości min czyli RGB(5,7,7) i patrze pod którym indeksem znajdowały się te wartości aby później odciąć w jaśniejszych próbkach "dół" - powoduje to, że kolory zaczynają pojawiać się w jednym momencie (w jasnych rejonach kiedy będziemy mieli np. wartości 10, to w rejonie 2 może być jeszcze 0).
- tworzę krzywe dla kolorów i dla każdego pixela biorąc pod uwagę powyższe punkty. Tu jeszcze jest kilka pomocniczych kroków.
Ta metoda działa dobrze jeśli mamy kolorowe obrazy, szczególnie w kolorach RGB, natomiast dla odcieni szarości zaczyna czasem wariować i dokładność odwzorowania jest gorsza o wiele.
Możliwe, że wystarczy zmieszać te metody, choć ten niby prosty problem jest już tak rozbudowany, że nie wiem czy to właściwe podejście. Oczywiście też nie chcę robić tablic LUT[256][256][256] dla każdego pixela
To byłoby najłatwiejsze, ale tu muszę pogodzić jakoś kolory z odcieniami jasności.
Zastanawiałem się czy też macierz transformacji perspektywy może się tu przydać, ewentualnie czy ktoś wie jak ją zastosować, aby filmik kalibracyjny kolorów stał się zbędny lub niekonieczny
Zabawa na ARM9 z OpenCV.
przechwytuję za pomocą kamerki umieszczonej pod kątem obraz z monitora. Z tego względu kolory pod kątem się zmieniają. Toteż wyświetlam sobie filmik kalibracyjny złożony z narastających kanałów RGB oddzielnie, a na początku jest kawałek białego aby ustawić balans białego oraz zmniejszyć wzmocnienie,aby otrzymać nieprzesycony obraz.
To jest jedna próbka tego jak kamera widzi obraz z monitora.
![[ARM9] Korekcja kolorów z kamery w perspektywie [ARM9] Korekcja kolorów z kamery w perspektywie](https://obrazki.elektroda.pl/4016167000_1510686732_thumb.jpg)
Temat teoretycznie prosty, ale nie doszedłem do perfekcyjnego rozwiązania. To co robiłem to:
1. Znalezienie najjaśniejszej białej próbki i wygenerowanie krzywych kolorów w zależności od max wartości tej próbki dla każdego pixela. Działa ok, ale tylko dla odcieni szarości. Powodem jest pewnie to, ze dla kamery R+G+B <>W, ze względu na nieliniową charakterystykę (wyświetlanie tylko kanałów RGB nie wypełnia pasm pomiędzy). Dlatego też dla kolorowych obrazów ta metoda się nie sprawdza.
2. Druga metoda wykorzystuje oddzielenie kanałów RGB (opis poniżej sporo uproszczony):
- z najjaśniejszej próbek dla kolejno R,G,B, zapisuje np. wartości linii na górze, czyli np dla ułatwienia mamy obraz 2x2 pixele, więc otrzymuję max wartości dla poszczególnych kolorów i pixeli:
Format: [kolor(max dla pixela 1, max dla pixel 2)]
R(220,190)
G(240,210)
B(170,140)
Widzimy, ze pixel 2 musi leżeć dalej, bo ma ciemniejsze wartości. Przy przechwytywaniu na wprost, wartości dla pixela 1 i 2 byłyby zbliżone i do tego dążymy.
-podobnie znajdujemy wartości minimalne (nieco wyższe niż przy zupełnej czerni, aby otrzymać tendecję spadku wartości):
R(10,5)
G(20,7)
B(15,7)
Tutaj szukam wartości min czyli RGB(5,7,7) i patrze pod którym indeksem znajdowały się te wartości aby później odciąć w jaśniejszych próbkach "dół" - powoduje to, że kolory zaczynają pojawiać się w jednym momencie (w jasnych rejonach kiedy będziemy mieli np. wartości 10, to w rejonie 2 może być jeszcze 0).
- tworzę krzywe dla kolorów i dla każdego pixela biorąc pod uwagę powyższe punkty. Tu jeszcze jest kilka pomocniczych kroków.
Ta metoda działa dobrze jeśli mamy kolorowe obrazy, szczególnie w kolorach RGB, natomiast dla odcieni szarości zaczyna czasem wariować i dokładność odwzorowania jest gorsza o wiele.
Możliwe, że wystarczy zmieszać te metody, choć ten niby prosty problem jest już tak rozbudowany, że nie wiem czy to właściwe podejście. Oczywiście też nie chcę robić tablic LUT[256][256][256] dla każdego pixela

Zastanawiałem się czy też macierz transformacji perspektywy może się tu przydać, ewentualnie czy ktoś wie jak ją zastosować, aby filmik kalibracyjny kolorów stał się zbędny lub niekonieczny

Zabawa na ARM9 z OpenCV.