Mam obraz 2D, który chcę filtr dolnoprzepustowy, z tymi ograniczeniami / miernikami jakości:
- Nie mogę „dodać” światła do obrazu, więc każdy piksel w wyniku powinien być <= odpowiadającym pikselowi na wejściu.
- Częstotliwość odcięcia dolnoprzepustowego powinna być parametrem, z którym należy eksperymentować
- Wielokrotne stosowanie tego filtra nie powinno znacząco zmienić wyniku.
- Czas potrzebny na uruchomienie tego algorytmu (5 minut dla obrazu 5 MPix wydaje się rozsądne)
- Minimalizowanie ilości odfiltrowanego światła.
Poniżej kilka podejść, które wypróbowałem, wraz z ich wadami:
Filtr gaussowski jak zwykle, a następnie pociągnij wynik w dół, aby zachować zgodność z ograniczeniem 1. Jest to bardzo dobrze zgodne z pierwszymi 3 punktami, ale zmniejsza znacznie więcej światła niż to konieczne.
Dopasowywanie parabol „w górę” poprzez „niskie” punkty i „parabol w dół” między nimi, aby wygładzić. Działa to świetnie w 1D, ale zastosowanie go najpierw w poziomie, a następnie w pionie daje złe wyniki w 2D. Moja aplikacja trwa znacznie dłużej, ale nie za długo. Jednak wielokrotne stosowanie tego filtra drastycznie zmieni wynik. Jeśli wejście (1D) jest idealną parabolą „w dół” (której w ogóle nie powinno się filtrować), zostanie zastąpione 2 parabolami „skierowanymi w górę” na początku / końcu.
Korzystanie z innej formy „podstawowych” funkcji 2D i rozwiązywanie liniowe w celu znalezienia optymalnych parametrów. Jest to pomysł tylko obecnie, jeszcze nie wdrożony / przetestowany.
Moją domeną doświadczenia w przetwarzaniu sygnałów jest prawie wyłącznie przetwarzanie obrazów, więc mam nadzieję znaleźć alternatywy dla tego problemu dzięki wkładowi ekspertów aktywnych w innych obszarach przetwarzania sygnałów.
aktualizacja 2011/08/18
W oparciu o bieżące reakcje postanowiłem wyjaśnić sprawę dodając wykresy typowego wkładu i wyniki 3 opisanych wcześniej podejść + sugestie, które otrzymałem do tej pory. Dla łatwego porównania w tych przykładach zastosowałem tylko filtrowanie 1D.
Dane wejściowe:
Filtr gaussowski + sprowadza go w dół, aby spełnić wymaganie (1).
Widać, że obniżenie go powoduje niepotrzebne zmniejszenie światła po prawej stronie.
Parabolas
Jeśli chodzi o mnie, jest to całkiem doskonałe, niestety nie przekłada się to idealnie na 2D poprzez zastosowanie najpierw poziomej, a następnie pionowej. W tym przypadku widzisz także, że mogę ocenić dopasowane parabole w rozdzielczości zmiennoprzecinkowej, co jest niewielką korzyścią, ale nie jest absolutnie wymagane.
Erozja w skali szarości
Na podstawie sugestii rwong próbowałem erozji w skali szarości. Użyłem elementu strukturalnego o tym samym kształcie parabolicznym, co moje „dopasowane” parabole. Wynik jest prawie dokładnie taki sam, więc wygląda to obiecująco. Pozostaje jednak kilka problemów: 1. Mój element strukturujący nie był „wystarczająco duży” (chociaż miał już szerokość 801 pikseli) 1. Mam tylko parabole „w górę”, brak „paraboli w dół”, aby wygładzić przejście z jednej paraboli do następnego.
Filtrowanie median
Uwzględniono tylko dla kompletności, nie jest to tak naprawdę to, czego chcę.
surowe dane
Wkleiłem surowe dane wejściowe + różne polecenia Pythona do pastebin, więc możesz eksperymentować z tymi samymi danymi.
http://pastebin.com/ASnJ9M0p