Domanda

Ho implementato alcuni metodi di binarizzazione adattiva, utilizzano una piccola finestra e ad ogni pixel viene calcolato il valore di soglia.Ci sono problemi con questi metodi:Se selezioniamo la dimensione della finestra troppo piccola otterremo questo effetto (penso che il motivo sia dovuto alla dimensione della finestra piccola)alt text
(fonte: piccy.info)

Nell'angolo in alto a sinistra c'è un'immagine originale, nell'angolo in alto a destra c'è il risultato della soglia globale.In basso a sinistra - esempio di divisione dell'immagine in alcune parti (ma sto parlando dell'analisi dei pixel circostanti dell'immagine, ad esempio una finestra di dimensioni 10X10).Quindi puoi vedere il risultato di tali algoritmi nell'immagine in basso a destra, abbiamo un'area nera, ma deve essere bianca.Qualcuno sa come migliorare un algoritmo per risolvere questo problema?

È stato utile?

Soluzione

Ci shpuld essere un bel po 'di ricerca in corso in questo settore, ma purtroppo non ho buoni collegamenti da dare.

Un'idea, che potrebbe funzionare, ma non ho ancora testato, è quello di cercare di stimare le variazioni di illuminazione e quindi rimuovere che prima di sogliatura (che è un termine migliore di "binarizzazione"). Il problema è quindi spostato da soglia adattativa a trovare un buon modello di illuminazione.

Se si sa nulla circa le fonti di luce allora si potrebbe, naturalmente, costruire un modello da questo.

In caso contrario, un trucco veloce che potrebbe funzionare è quello di applicare un filtro passa-basso davvero pesante per la vostra immagine (sfocatura) e poi utilizzarlo come modello di illuminazione. Quindi creare un'immagine differenza tra l'originale e la versione sfocata, e la soglia di questo.

Modifica : Dopo il test rapido, sembra che il mio "mod rapida" non è realmente di andare a lavorare a tutti. Dopo averci pensato io non sono molto sorpreso sia:)

I = someImage
Ib = blur(I, 'a lot!')
Idiff = I - Idiff
It = threshold(Idiff, 'some global threshold')

Modifica 2 Ha ottenuto un altro un'idea che potrebbe funzionare a seconda di come le immagini vengono generate. Prova la stima del modello di illuminazione dalle prime righe nell'immagine:

  1. Prendere le prime N righe nell'immagine
  2. Creare una riga medio da N righe raccolto. Sai avere una riga come modello di sfondo.
  3. Per ogni riga nell'immagine sottrarre la riga di fondo del modello (la riga media).
  4. Soglia l'immagine risultante.

Purtroppo sono a casa senza buoni strumenti per testare questo.

Altri suggerimenti

Sembra che si sta facendo adaptive thresholding sbagliato. Le immagini appaiono come se diviso l'immagine in piccoli blocchi, calcolato una soglia per ogni blocco e applicata che la soglia per l'intero blocco. Questo spiegherebbe i manufatti "scatola". Di solito, soglia adattativa significa trovare una soglia per ogni pixel a parte, con una finestra separata centrato intorno al pixel.

Un altro suggerimento sarebbe quello di costruire un modello globale per l'illuminazione: Nella tua immagine campione, sono abbastanza sicuro che si potrebbe montare un piano (in X / Y / spazio Luminosità) per l'immagine utilizzando dei minimi quadrati, quindi separare i pixel in pixel più luminoso (primo piano) e più scuro di quello aereo (sfondo). È quindi possibile inserire piani separati per lo sfondo e il pixel di primo piano, la soglia utilizzando la media tra questi piani ancora e migliorare la segmentazione in modo iterativo. Quanto bene che avrebbe funzionato in pratica dipende da quanto bene il vostro fulmine può essere modellata con un modello lineare.

Se gli oggetti reali si tenta di settore sono "sottili" (hai detto qualcosa su codici a barre in un commento), si potrebbe provare una semplice operazione di apertura / chiusura della ottenere un modello di illuminazione. (Cioè chiudere l'immagine per rimuovere i pixel di primo piano, quindi usare [immagine chiuso + X] come soglia).

In alternativa, si potrebbe provare il filtraggio media-shift per ottenere i pixel di primo piano e di sfondo per la stessa luminosità. (Personalmente, mi piacerebbe provare che uno prima)

Hai un'illuminazione molto non uniforme e abbastanza grande oggetto (in tal modo, un modo semplice universale per estrarre lo sfondo e correggere la non uniformità). Questo significa che in fondo non si può usare della soglia globale a tutto, è necessario soglia adattativa.

Vuoi provare Niblack binarizzazione. codice Matlab è disponibile qui http: // www.uio.no/studier/emner/matnat/ifi/INF3300/h06/undervisningsmateriale/week-36-2006-solution.pdf (pagina 4). Ci sono due parametri si dovrà sintonizzare manualmente:. Dimensione della finestra (N nel codice qui sopra) e di peso

Prova ad applicare una soglia adattiva locale utilizzando questa procedura:

  1. convolgere l'immagine con un filtro medio o mediano
  2. sottrarre l'immagine originale da quella convoluta
  3. soglia l'immagine della differenza

Il metodo della soglia adattiva locale seleziona una soglia individuale per ciascun pixel.

Sto utilizzando ampiamente questo approccio e funziona bene con immagini con sfondo non uniforme.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top