Ho un'immagine 2D, che voglio filtrare passa basso, con questi vincoli / metriche di qualità:
- Non posso "aggiungere" luce all'immagine, quindi ogni pixel nel risultato dovrebbe essere <= il pixel corrispondente nell'input.
- La frequenza di taglio passa basso dovrebbe essere un parametro, da sperimentare
- L'applicazione ripetuta di questo filtro non dovrebbe modificare il risultato in modo significativo.
- Il tempo necessario per eseguire questo algoritmo (5 minuti per un'immagine da 5 MPix sembrano ragionevoli)
- Ridurre al minimo la quantità di luce filtrata.
Di seguito sono riportati alcuni approcci che ho provato, insieme alle loro carenze:
Filtro gaussiano come al solito, quindi abbassa il risultato per rispettare il vincolo 1. Ciò si adatta molto bene ai primi 3 punti, ma riduce molta più luce del necessario.
Montare le parabole "verso l'alto" attraverso i punti "bassi" e le parabole "verso il basso" per uniformarle. Funziona alla grande in 1D, ma applicandolo prima in orizzontale, quindi in verticale produce cattivi risultati in 2D. Ci vuole molto più tempo, ma non troppo a lungo per la mia applicazione. Tuttavia, l'applicazione ripetuta di questo filtro cambierà drasticamente il risultato. Se l'ingresso (1D) è una parabola "verso il basso" perfetta (che non dovrebbe essere affatto filtrata), sarà sostituito da 2 parabole "verso l'alto" che si trovano all'inizio / alla fine.
Utilizzando qualche altra forma di funzioni 2D "di base" e risoluzione lineare per trovare i parametri ottimali. Questa è un'idea solo attualmente, non ancora implementata / testata.
Il mio dominio di esperienza nell'elaborazione del segnale è quasi esclusivamente l'elaborazione di immagini, quindi spero di trovare alternative a questo problema con l'input di esperti attivi in altre aree dell'elaborazione del segnale.
aggiornamento 2011/08/18
Sulla base delle reazioni attuali, ho deciso di rendere le cose un po 'più chiare aggiungendo grafici di un input tipico e i risultati dei 3 approcci che ho descritto originariamente + i suggerimenti che ho ricevuto finora. Per un facile confronto, ho usato solo il filtro 1D in questi esempi.
Dati in ingresso:
Filtro gaussiano + abbattilo per soddisfare il requisito (1).
Si può vedere che l'abbattimento comporta riduzioni della luce non necessarie sul lato destro.
Parabole
Per quanto mi riguarda, questo è praticamente eccellente, purtroppo non si traduce perfettamente in 2D applicando prima orizzontale, poi verticale. In questo caso, vedi anche che posso valutare le parabole adattate nella risoluzione in virgola mobile, il che è un piccolo vantaggio, ma non assolutamente necessario.
Erosione della scala di grigi
Sulla base del suggerimento di rwong, ho provato l'erosione della scala di grigi. Ho usato un elemento strutturante con la stessa forma parabolica delle mie parabole "adattate". Il risultato è quasi esattamente lo stesso, quindi questo sembra promettente. Tuttavia, ci sono ancora alcuni problemi: 1. Il mio elemento strutturante non era "abbastanza grande" (sebbene fosse già largo 801 pixel) 1. Ho solo parabole "verso l'alto", nessuna "parabola verso il basso per facilitare la transizione da una parabola al prossimo.
Filtro mediano
Incluso solo per completezza, non è proprio quello che voglio.
dati grezzi
Ho incollato i dati grezzi di input + i vari comandi di Python su pastebin, in modo da poter sperimentare anche gli stessi dati.
http://pastebin.com/ASnJ9M0p