Skocz do zawartości

Problem teoretyczny: jak stakować piksele?


Gajowy

Rekomendowane odpowiedzi

Cześć!

Temat może trochę jak z kosmosu ;-), ale dla mnie ważny w kontekście projektu, który chcę zrealizować. Muszę zestakować ze sobą n zdjęć, każde lekko przesunięte i obrócone. Przesunięcie i obrót są określone (np. poprzez dx, dy i kąt fi). I tutaj pojawia się problem właściwego sumowania wartości pikseli na obrazie wynikowym.

Najlepiej wyjaśnię to na poniższym rysunku (1 kwadrat = 1 piksel):

 Ilustracja.png.8e4e0f19ab179dd38ea7e27a92073337.png

 

Problem jest następujący: jaka część jasności czerwonego piksela powinna zostać dodana do pikseli B,C,E,F,H oraz I ?

Ponieważ jasność pojedynczego piksela jest jednorodna, to problem sprowadza się do pytania jaki procent powierzchni czerwonego kwadratu znajduje się w kwadratach B,C,E,F,H oraz I. Uproszczenie jest takie, że piksele są właśnie kwadratami, a rozmiar pikseli wynikowych (czarne kwadraty) równy jest rozmiarom pikseli stakowanych (żółte kwadraty i czerwony).

 

Pzdr,

Gajowy

 

 

 

Edytowane przez Gajowy
Odnośnik do komentarza
Udostępnij na innych stronach

problem który opisujesz to resampling (widziany od drugiej strony)

patrząc od właściwej strony sprowadza sie to do obrócenia i przesunięcia obrazu tak żeby piksele nałożyły się na siebie.

w procesie tym stosujemy interpolację czyli wyznaczanie wartości próbek w miejscach gdzie nie było próbek źródłowych, zgodnie z przyjętym modelem (często spotykane nazwy w programach graficznych - linear, bilinear, lanczos, itd.)

Odnośnik do komentarza
Udostępnij na innych stronach

Masz rację, nie patrzyłem na to jako na odwrócenie resamplingu, a rzeczywiście chodzi prawie o to samo. U mnie jednak odpada jakakolwiek metoda interpolacji wyniku - jasność przekrzywionego piksela chcę proporcjonalnie rozdystrybuować na maskę. W kolejnym kroku będę ewaluował uzyskany obraz pod kątem wystąpienia lub nie wzmocnień sygnału. Nie chcę wiec bazować na interpolacjach, które mogłyby zakłócić wynik ewaluacji.

Pytanie więc - jak określić % powierzchni czerwonego piksela przypadający na każdy piksel na masce - pozostaje otwarte.

 

Pzdr,

Gajowy

Odnośnik do komentarza
Udostępnij na innych stronach

Jest jeszcze jeden problem. Piksele maja niejednorodna czulosc na swojej powierzchni. Dlatego tez czesto stosuje sie mikrosoczewki skupiajace swiatlo na srodek powierzchni piksela.

 

Do obliczenia % powierzchni wspolnej siatki przed i po transformacji mozna uzyc np calkowania numerycznego. Problem w tym, ze bedzie to chyba bardzo obliczeniozerne dla calej matrycy.

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

2 godziny temu, Gajowy napisał:

Nie chcę wiec bazować na interpolacjach, które mogłyby zakłócić wynik ewaluacji.

Pytanie więc - jak określić % powierzchni czerwonego piksela przypadający na każdy piksel na masce - pozostaje otwarte.

określenie tego % jest już formą interpolacji i nie ma jedynego poprawnego sposobu bo zależy jakie przyjmiesz założenie - dokładnie tak samo jak w interpolacji/resamplingu.

wyobraź sobie że oprócz obrócenia klatki, którą chcesz stackować, obrócisz z takimi samymi parametrami resamplingu zerojedynkową maskę, w której wypełniłeś tylko ten czerwony piksel. dostaniesz piksele, których jasność to właśnie % udziału czerwonego piksela w obrazie wynikowym. to ta sama operacja.

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

5 godzin temu, Gajowy napisał:

to problem sprowadza się do pytania jaki procent powierzchni czerwonego kwadratu znajduje się w kwadratach B,C,E,F,H oraz I

Faktycznie, to typowe zagadnienie interpolacji. Żeby było przejrzyściej, zrób taki sam rysunek, ale zaznacz tylko środki pikseli (pierwszego i drugiego obrazka). Będzie to wyglądało mniej więcej tak (czerwona kropka to środej czerwonego):

 

Gajowy.thumb.png.0590a6a95ca5e919e2e7180d543f96cd.png

 

Najprościej zrobić interpolację (dwu)liniową, czyli:

 

wartość czerwonego = (1−ty) · [(1−tx)·E + tx·F] + ty · [(1−tx)·B + tx·C]

 

gdzie tx i ty są liczbami z przedziału [0; 1] i określają względną pozycję czerwonego wobec otaczających go pikseli pierwszego obrazka (na rysunku tx ≅ 0,8 i ty ≅ 0,75).

Inne opcja to np. interpolacja sześcienna (ang. bicubic).

 

U mnie jednak odpada jakakolwiek metoda interpolacji wyniku - jasność przekrzywionego piksela chcę proporcjonalnie rozdystrybuować na maskę.

 

Tu chyba samozaprzeczenie - jeśli "proporcjonalnie rozdystrybuować", to jest to właśnie interpolacja (czyli taką lub inną metodą przypisujemy "wagi" sąsiadom).

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

Godzinę temu, AMR napisał:

wiem, że mało - ale sam algorytm występuje w wielu aplikacjach opensource 

W zasadzie mam więc 2 opcje:

  • Drizzling - im głębszy, tym wynik dokładniejszy. W implementacji myślałem, żeby każdy z pikseli podzielić np. na 10.000 mniejszych (100x100) i dokonywać przekształcenia każdego z takich mini-pikseli osobno. Wówczas można zastosować proste podejście polegające na dodawaniu całej wartości mini-piksela do jednego piksela maski.
  • Całkowanie numeryczne - tutaj chyba najprostsza metoda Monte Carlo powinna dać zadowalające wyniki.

Pozostaje zaimplementować i sprawdzić, czy czas obliczeń nie zabije pomysłu.

 

Dzięki za podpowiedzi!

 

Pzdr,

Gajowy

 

Odnośnik do komentarza
Udostępnij na innych stronach

Godzinę temu, WielkiAtraktor napisał:

Faktycznie, to typowe zagadnienie interpolacji. Żeby było przejrzyściej, zrób taki sam rysunek, ale zaznacz tylko środki pikseli (pierwszego i drugiego obrazka). Będzie to wyglądało mniej więcej tak (czerwona kropka to środej czerwonego):

 

[rysunek]

 

Najprościej zrobić interpolację (dwu)liniową, czyli:

 

wartość czerwonego = (1−ty) · [(1−tx)·E + tx·F] + ty · [(1−tx)·B + tx·C]

 

gdzie tx i ty są liczbami z przedziału [0; 1] i określają względną pozycję czerwonego wobec otaczających go pikseli pierwszego obrazka (na rysunku tx ≅ 0,8 i ty ≅ 0,75).

Inne opcja to np. interpolacja sześcienna (ang. bicubic).

 

Czy mylę się, że Twoje równanie jest słuszne, gdy nie mamy obrotu (i jeśli dobrze odczytuję tx=0,2 a ty=0,25)?

 

Cytuj

Tu chyba samozaprzeczenie - jeśli "proporcjonalnie rozdystrybuować", to jest to właśnie interpolacja (czyli taką lub inną metodą przypisujemy "wagi" sąsiadom).

Tak, niepoprawnie zawęziłem znaczenie pojęcia.

 

Pzdr,

Gajowy

Odnośnik do komentarza
Udostępnij na innych stronach

8 minut temu, Gajowy napisał:

Czy mylę się, że Twoje równanie jest słuszne, gdy nie mamy obrotu

Hm, chyba obrót jest bez znaczenia. Jeśli zastosować ten wzór do wszystkich czerwonych pikseli (i ich sąsiednich pikseli pierwszego obrazu), powinno wyjść to samo.

 

Co do tx i ty, na rysunku przyjąłem X rosnące w prawo i Y rosnące w górę (czyli tx = 0 i ty = 0 oznacza: czerwony dokładnie w miejscu E, a ty = 1 i ty = 1 to czerwony w miejscu C).

Odnośnik do komentarza
Udostępnij na innych stronach

4 minuty temu, WielkiAtraktor napisał:

Hm, chyba obrót jest bez znaczenia. Jeśli zastosować ten wzór do wszystkich czerwonych pikseli (i ich sąsiednich pikseli pierwszego obrazu), powinno wyjść to samo.

Hm... w ogólnym przypadku jasność piksela wynikowego może zależeć nawet od 6 pikseli klatki wejściowej.

 

Pzdr,

Gajowy

Odnośnik do komentarza
Udostępnij na innych stronach

3 minuty temu, szuu napisał:

ogólnie problem jest chyba z gatunku takich, gdzie dzięki kilku godzinom projektowania i programowania może udać nam się uniknąć konieczności spędzenia 5 minut na czytaniu o teorii przetwarzania obrazów :)

Żeby tylko 5 godzin :P. Póki co lektura to pomysły, które tak czy siak trzeba zaimplementować.

 

Pzdr,

Gajowy

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

Pochwalę się wynikami. Stakowałem (300x1s) 3 algorytmami (Mediana, Średnia, Maksium), stosując 2 interpolacje, które - jeśli dobrze rozumiem opisywane są jako POINT (piksel wynikowy przyjmuje wartość najbliższego piksela ze źródła) oraz BILINEAR (piksel wynikowy to ważona suma 4 najbliższych pikseli, czyli to chyba to, co opisał Wielki Atraktor). Ponieważ obrót miedzy poszczególnymi klatkami jest niewielki, jest to wystarczające przybliżenie problemu z pierwszego posta, mało złożone obliczeniowo. Zdjęcia były stakowane bez klatek kalibarcyjnych. W zdjęciach z prawej kolumny odjąłem "szum tła" rozumiany jako mediana wszystkich pikseli ze zdjęcia, co okazało się jednak zbyt mocną ingerencją. Dwa ostatnie wiersze to ten sam fragment nieba wg serwisu Aladin oraz mapa ze SkyChart - katalog gwiazd Gaia. Rozmiar klatki w poziomie to 2.5 minuty łuku, a zasięg gwiazdowy - ok. 19.5 mag. Zdjęcia są przeskalowane 4-krotnie.

Kreski na zdjęciach stakowanych algorytmem "Maksimum" to hot-pixele.

wynik.thumb.png.441f84bb75cc23766a6ed6c2e3827e2a.png

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ę.