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
źródło
Odpowiedzi:
Rzeczywiście istnieje wersja 2D dla twojej próby # 2 - jest podobna w teorii, ale nie można jej rozłożyć na dwie operacje 1D. Przeczytaj o „Filtrowaniu morfologicznym w skali szarości 2D”. Jest szybszy niż dopasowanie krzywej.
Filtrowanie medianowe może być również przydatne, jeśli próbujesz usunąć plamki. Bardziej zaawansowaną formą filtrowania median jest „filtrowanie porządkowe”.
We wszystkich przypadkach wymaganie nr 1 można spełnić w sposób trywialny, biorąc minimum pikselowe między wyjściem a wejściem. Jest to ważne kryterium jakości, ale nie ograniczy wyboru algorytmów.
Filtrowanie Gaussa (i wiele innych przydatnych filtrów) można rozkładać (najpierw z operacji 2D na 1D, a następnie za pomocą transformacji Fouriera), ale istnieje wiele innych przydatnych technik przetwarzania obrazu, które nie podlegają rozkładowi, co powoduje, że są one powolne, ale nie zmniejszają się ich przydatność.
źródło
Sugeruję użycie wygładzającego splajnu.
Oto, jak możesz to zrobić za pomocą Matlaba z solidną funkcją wygładzania splajnu SMOOTHN z Matlab File Exchange (która zawiera pełny kod źródłowy, aby w razie potrzeby można go zaimplementować gdzie indziej). Pamiętaj, że działa również z danymi n-wymiarowymi:
źródło