wtorek, 22 maja 2012

Średnia arytmetyczna warstw

Wprowadzałem zmiany w tym artykule tak często, że postanowiłem go przepisać częściowo od nowa.

Co to jest średnia arytmetyczna warstw (w programach graficznych)? Zdefiniuję ją dla każdego piksela:

Jeśli mamy n warstw, wartości każdego kanału dla każdego piksela obliczane są jako średnia arytmetyczna (tj. x = x1 + x2 + ... + xn n ).

Proste, prawda? Ale nie zauważyłem żeby można było coś takiego zrobić w GIMPie (nie wiem, czy w innych programach jest coś takiego). Widocznie to jest takie proste, że nikomu nie potrzebne. Da się to co prawda osiągnąć w prosty sposób, ale musiałem trochę się zastanowić, zanim wpadłem na odpowiedni przepis.

Wykorzystujemy do tego "krycie" (opacity). Warstwa na spodzie musi mieć krycie na 100%. Następna nad nią na 50%. Kolejna nad nią 33%, dalej 25%, 20% itd. Seria jest bardzo prosta - jeśli zamiast procentów użyjemy ułamków: 1, 1/2, 1/3, 1/4, 1/5... .

Proste obliczenia pokazują, że takie postępowanie jest właściwe - jako przykład obliczę udziały każdego piksela dla pięciu warstw:

15x5 + (1-15) × ( 14x4 + (1-14) × ( 13x3 + (1-13) × ( 12x2 + (1-12) × (1x1) ) ) ) = 15x5 + 45 × ( 14x4 + 34 × ( 13x3 + 23 × ( 12x2 + 12x1 ) ) ) = 15x5 + 45 × ( 14x4 + 34 × ( 13x3 + 13x2 + 13x1 ) ) = 15x5 + 45 × ( 14x4 + 14x3 + 14x2 + 14x1 ) = 15x5 + 15x4 + 15x3 + 15x2 + 15x1 QED

No dobra, ale po co to komu? Widocznie po nic, skoro nie zrobiono tego w jakimś osobnym narzędziu/trybie warstwy. Może się jednak przydać jeśli mamy serię identycznych zaszumionych zdjęć - uśredniając je ze sobą pozbywamy się sporej ilości szumów.

szumyśrednia z 3 zdjęć

Efekty jak widać nawet niezłe, i muszę powiedzieć, że parę razy skorzystałem już z tej metody.

Średnia ważona

Oprócz średniej arytmetycznej, możemy stosować średnią ważoną - gdzie końcowe udziały poszczególnych warstw nie są równomiernie:

Jeśli mamy n warstw, wartości każdego kanału dla każdego piksela obliczane są jako średnia ważona x = a1 x1 + a2 x2 + ... + an xn S , gdzie a1+a2+...+an=S.

Aby obliczyć wartości krycia dla poszczególnych warstw, użyję metody odwrotnej do przedstawionych wyżej obliczeń. Dla uproszczenia zrobię to na konkretnej liczbie warstw (3 powinno wystarczyć, aby pokazać zasadę). Wprowadzę też oznaczenia Si=a1+...+ai.

Najpierw zapiszę końcowy wynik (czyli znany udział warstw):

a1 x1 + a2 x2 + a3 x3 S

Dla wygody zapiszę to w odwrotnej kolejności podstawiając za S = S3 i wypisując całe współczynniki osobno przed x-ami:

a3 S3 x3 + a2 S3 x2 + a1 S3 x1

Teraz należy pierwszy element zostawić tak jak jest, a pozostałe zgrupować w nawias w taki sposób, aby współczynnik przed nawiasem był dopełnieniem współczynnika pozostawionego bez zmian (ponieważ to będzie dopełnienie tamtej warstwy). Nowe współczynniki przy x-ach muszą się skracać z tym przed nawiasem tak, aby doprowadzić do pierwotnych ich postaci:

a3 S3 x3 + S3 - a3 S3 ( a2 S3 - a3 x2 + a1 S3 - a3 x1 )

ale S3-a3 = S2, więc:

a3 S3 x3 + S2 S3 ( a2 S2 x2 + a1 S2 x1 )

Kontynuując:

a3 S3 x3 + S2 S3 ( a2 S2 x2 + S1 S2 ( a1 S1 x1 ) )

ostatniego elementu nie ma już jak wyciągnąć przed jakikolwiek nawias, więc na tym ten przykład się kończy.

Podsumowując: Jak widać nowe współczynniki przeznaczone na krycie warstw wynoszą:

ki = ai Si = ai a1 + ... + ai

gdzie ki - krycie i-tej warstwy.

Łatwo zauważyć, że dla i=1 ki = 100%.

Można też łatwo sprawdzić, że dla średniej arytmetycznej współczynniki wychodzą tak, jak powinny - jako ciąg harmoniczny.

Brak komentarzy:

Prześlij komentarz