Jak mogę filtrować dolnoprzepustowo, zmniejszając tylko dane szczytowe?

16

Mam obraz 2D, który chcę filtr dolnoprzepustowy, z tymi ograniczeniami / miernikami jakości:

  1. Nie mogę „dodać” światła do obrazu, więc każdy piksel w wyniku powinien być <= odpowiadającym pikselowi na wejściu.
  2. Częstotliwość odcięcia dolnoprzepustowego powinna być parametrem, z którym należy eksperymentować
  3. Wielokrotne stosowanie tego filtra nie powinno znacząco zmienić wyniku.
  4. Czas potrzebny na uruchomienie tego algorytmu (5 minut dla obrazu 5 MPix wydaje się rozsądne)
  5. Minimalizowanie ilości odfiltrowanego światła.

Poniżej kilka podejść, które wypróbowałem, wraz z ich wadami:

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

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

  3. 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: 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. filtr Gaussa

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. dopasowanie do paraboli

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. erozja w skali szarości

Filtrowanie median
Uwzględniono tylko dla kompletności, nie jest to tak naprawdę to, czego chcę. filtr środkowy

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

Pieter-Jan Busschaert
źródło
1
Czy możesz wyjaśnić trochę więcej na temat ograniczeń 1 i 5? Wydają się być (na pierwszy rzut oka) sprzeczne.
Peter K.
Prawdopodobnie nie rozumiem, co rozumiesz przez „ten algorytm”, ale 5 minut na 5 MP wydaje się dużo dla zastosowania filtra dolnoprzepustowego.
bjoernz

Odpowiedzi:

8

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ść.

rwong
źródło
Cześć, dzięki za wskaźnik do filtrowania morfologicznego w skali szarości. Opis na Wikipedii wydaje się interesujący i zbadam to. Jednak w twoim linku do dokumentacji OpenCV widzę tylko normalne filtry morfologiczne, a nie filtry w skali szarości. Zdecydowanie sprawdzę tę opcję i dam znać o wynikach. Dzięki.
Pieter-Jan Busschaert
6
Czy sugestia rwong dotycząca filtrowania median w ogóle pomaga? Pomocne może być wyjaśnienie nieco więcej na temat tego, co próbujesz osiągnąć, przedstawiając prosty przykład danych i „fałszywy” przykład tego, co chcesz uzyskać.
Peter K.
Zaktualizowałem moje pytanie o przykładowe dane + wyniki z różnych sugestii. Mam nadzieję, że wszystko jest teraz bardziej jasne.
Pieter-Jan Busschaert
2

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:

%# - get inputlist from pastebin

%# - smoothen data. Lower factor means less smooth
smoothingFactor = 1000;
smoothData = smoothn(inputlist,smoothingFactor);

%# - shift down
smoothData = smoothData - max(inputlist-smoothData);

%# - show results
plot(inputlist,'b'),hold on,plot(smoothData,'r')

wprowadź opis zdjęcia tutaj

Jonas
źródło
Dzięki za sugestię, zbadam ją. Z twojego wykresu wydaje się, że potrzebuję znacznie wyższego współczynnika wygładzania niż twój przykład. Stroma krawędź wokół x = 700 nie jest usuwana i będzie wyraźnie widoczna. Również początkowa nierówność x = [0, 400] w ogóle nie jest usuwana. Czy nie uważasz, że będzie to miało taki sam problem jak w przypadku innych podejść (filtr dolnoprzepustowy + przejście w dół)? Możesz zobaczyć globalne przesunięcie między dwoma wykresami, które prawdopodobnie nawet wzrosną, gdy użyję wyższego współczynnika wygładzania.
Pieter-Jan Busschaert
@ Pieter-JanBusschaert: Oh, myślałem, że pierwszy szczyt był ci w jakiś sposób przydatny. W każdym razie wszystkie filtry dolnoprzepustowe + ruch w dół będą miały trudności z gwałtownym wzrostem przy ~ 650: Sprawią, że ta część będzie bardziej płaska, dlatego krzywa musi zostać znacznie przesunięta w dół. Pomaga nieco filtr środkowy, po którym następuje wygładzenie splajnu.
Jonas,