Skocz do zawartości

Eliminacja Fixed Pattern Noise - zmory CMOS-ów


Rekomendowane odpowiedzi

Cześć,

 

Ostatnio myślałem o tym "fixed pattern".

 

Zainspirował mnie post @trouvere

Cytat

 

Bining analogowy jest silnie utrudniony przez fakt, że każdy piksel ma swój własny "konwerter" ładunku (wyrażanego w elektronach) na napięcie (wyrażane w mikrowoltach), które jest podawane następnie na wejście odpowiedniego przetwornika analogowo cyfrowego (i to jest w gruncie rzeczy całe zło matryc CMOS polegające na istnieniu tzw. fixed pattern, które bardzo trudno jest wyeliminować w stakowaniu i późniejszym postprocessingu gdyż ze wzrostem ilości stakowanych klatek fiksed pattern staje się bardziej widoczny). Przy takiej architekturze matrycy binning przeprowadzany jest w domenie cyfrowej (procesor DSP w kamerze lub oprogramowanie przetwarzania obrazów w kompie.

 

 

Jeśli pojedynczy piksel CMOS-a jest liniowym przetwornikiem ładunek-napięcie to wystarczyłoby zrobić kilka (minimum dwa) flatów w różnych warunkach oświetleniowych (np. 10% i 90% nasycenia) następnie program obliczy współczynnik liniowy i offset do każdego piksela osobno. Następnie taka mapa może być używana jako flat, z tym że trzeba odjąć offsety najpierw, a dopiero potem podzielić przez współczynnik, jakby połączenie biasa i flata. Mając to na myśli ruszyłem na podbój internetu...

 

Niestety, nie okazałem się przełomowym geniuszem, wikipedia też wpadła na ten pomysł :) https://en.wikipedia.org/wiki/Fixed-pattern_noise#Suppression_of_FPN

:)

 

Czyli to nie jest takie trudne....

Chociaż - 

Cytat

Note that this correction usually is very sensitive to modifications of the system parameters (i.e., exposure time, temperature).

Trzeba by flaty robić w tej samej temperaturze co zdjęcia... Robi się z tego powoli połączenie darka, flata i biasa :)  

 

Teraz moje pytanie:

Ciekawe, czy ktoś już w Polsce tego próbował? Trzeba by mieć dobry materiał testowy (wyraźny pattern noise) i jakiś program, który to robi (chyba to najtrudniejsze - nie jestem pewien, czy taki program istnieje). Ewentualnie - dysponując operacjami matematycznymi na obrazach można to zrobić chyba w PixInsight: (jeśli ktoś nie lubi teorii/matematyki to proszę przewinąć wzory ;) )

 

Przypominam, że zakładamy, że każdy piksel jest opisany funkcją liniową postaci:

R = a*S + b

gdzie R - to rzeczywista odpowiedź piksela na sygnał S, a i b to współczynnik liniowości i offset.

 

Mierząc dwa flaty na poziomie niskim i wysokim (np. 10% i 90%, ale dokładne wartości nie mają znaczenia) możemy znaleźć dla każdego piksela wartości R_L i R_H (Low/High).

Dostajemy dwa równania liniowe z dwoma niewiadomymi, czyli zadanie z podstawówki w rodzaju "Staś za dwie gruszki i trzy jabłka zapłacił 5zł, a za pięć gruszek i jedno jabłko - 6zł. Ile kosztuje jabłko, a ile gruszka?)

Spoiler

(po złotówce :D) 

 

Równanie wygląda tak:

R_L = a*S_L + b

R_H =a*S_H + b

Oczywiście rozwiązanie to:

a = (R_H - R_L) /( S_H - S_L)

b = R_H - a * S_H.

Problem tylko znaleźć S_L i S_H, czyli sygnał, jak powinien być w przeciwieństwie do R, czyli sygnału, jaki rzeczywiście mamy na matrycy.

Wydaje się, że naiwne podejście z uśrednieniem obu flatów po wszystkich pikselach powinno dać przynajmniej wstęp do dalszej pracy.

 

Jak wyglądałaby procedura w programie? Załóżmy, że mamy pliki FL i FH (flat low - 10% i flat high - 90%)

1. FL uśredniamy (nie wiem, mediana/średnia z nieskończonym promieniem?) i zapisujemy jako SL

2. FH - to samo, zapisujemy jako SH

 

 

(Alternatywnie:

Dla FL i FH znajdujemy reprezentacyjny piksel referencyjny (w teorii dowolny, tylko żeby miał te same współrzędne tu i tam) i tworzymy SL i SH jako obrazy wypełnione wartościami takimi, jak ten piksel, odpowiednio na FL i FH. Nie powinno mieć specjalnego wpływu, który piksel wybierzemy... Chyba :D )

 

 

3. Odejmujemy obrazy FH - FL i zapisujemy jako dF

4. Odejmujemy obrazy SH - SL i zapisujemy jako dS

5. Tworzymy nowy obraz sF podzielony przez dS i zapisujemy, jako GAIN_FLAT

6. Tworzymy nowy obraz TEMP = GAIN_FLAT * SH

7. Tworzymy nowy obraz FH - TEMP i zapisujemy jako OFFSET_FLAT

8. Od każdego "surowego" lighta - FITS-a czy tam RAW-a najpierw odejmujemy OFFSET_FLAT, a potem dzielimy przez GAIN_FLAT

potem normalnie stackowanie jak zawsze.

 

Ktoś chętny? :)

Przypominam - Flaty low i high trzeba zrobić tak, jak zwykłe flaty, tylko jeden z saturacją ok. 10% a drugi ok. 90%, najlepiej w tej samej temperaturze, co lighty, oczywiście to samo ISO, czas naświetlania siłą rzeczy bez znaczenia, choć lepiej nie za krótko ani nie za długo :)

 

 

Pozdrawiam!

 

 

Edytowane przez Behlur_Olderys
  • Lubię 5
Odnośnik do komentarza
Udostępnij na innych stronach

41 minut temu, Tayson napisał:

@Behlur_Olderys zakładam że znasz istniejący, działający sposób na usunięcie FPN. 

Dithering :)

Ale jestem ciekaw alternatywy, czy jest równie skuteczna. Może szybsza?

 

@trouvere

Jak to dobrze, że można tak skomplikowane mechanizmy zamodelować dwoma parametrami :)

 

Edytowane przez Behlur_Olderys
  • Lubię 1
Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.