2010-02-17 15 views
5

Ho implementato alcuni metodi di binarizzazione adattivi, usano una piccola finestra e per ciascun pixel viene calcolato il valore di soglia. Ci sono problemi con questi metodi: Se selezioniamo la dimensione della finestra troppo piccola avremo questo effetto (penso che il motivo è a causa della dimensione della finestra è piccola) alt text http://i.piccy.info/i4/3d/bc/773b7df74ff7dadfd11c09372b7e.jpegSoglia adattiva Effetti negativi della binarizzazione

Nell'angolo in alto a sinistra c'è un immagine originale , angolo superiore destro - risultato 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 la finestra della dimensione 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?

risposta

2

Ci sono un sacco di ricerche in corso in questo settore, ma sfortunatamente non ho buoni collegamenti da dare.

Un'idea, che potrebbe funzionare ma non l'ho testata, è provare a stimare le variazioni di illuminazione e quindi rimuoverla prima della soglia (che è un termine migliore di "binarizzazione"). Il problema viene quindi spostato dalla soglia adattativa alla ricerca di un buon modello di illuminazione.

Se sapete qualcosa sulle sorgenti di luce, potreste ovviamente costruire un modello.

In caso contrario, un attacco rapido che potrebbe funzionare è applicare un filtro passa basso molto pesante all'immagine (sfocatura) e utilizzarlo come modello di illuminazione. Quindi crea un'immagine di differenza tra la versione originale e quella sfocata e la soglia.

EDIT: Dopo un test rapido, sembra che il mio "attacco rapido" non funzionerà affatto. 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') 

EDIT 2 Got un'altra idea che potrebbe funzionare a seconda di come le immagini vengono generate. Prova stima del modello di illuminazione dalle prime righe nell'immagine:

  1. prendere la prima N righe nell'immagine
  2. Creare una riga media dal N raccolto righe. Sai avere una riga come modello di sfondo.
  3. Per ogni riga dell'immagine sottrarre la riga del modello di sfondo (la riga media).
  4. Soglia l'immagine risultante.

Sfortunatamente sono a casa senza alcun buon strumento per testare questo.

+0

Potete spiegare per favore in più dettagli! Cosa si intende per "rimuovi quello prima della soglia"? Come rimuovere? Poi un'altra cosa: Sfocare molto e prendere la differenza e quindi soglia con la soglia globale - quale effetto produrrà per le buone immagini? Intendo per le immagini che non si sono danneggiate dopo il metodo di soglia adattativa? – maximus

+0

Vedere l'aggiornamento: non penso che il mio metodo possa mai funzionare. Penso che dovresti ricorrere ad un metodo più avanzato. –

+0

In ogni caso, grazie per la risposta! Spero che qui ci saranno più risposte! – maximus

2

Sembra che tu stia sbagliando la soglia adattativa. Le immagini sembrano dividere l'immagine in piccoli blocchi, calcolare una soglia per ogni blocco e applicare tale soglia all'intero blocco. Questo spiegherebbe gli artefatti della "scatola". Di solito, l'impostazione di soglia adattativa significa trovare una soglia per ciascun pixel separatamente, con una finestra separata centrata attorno al pixel.

Un altro suggerimento sarebbe quello di costruire un modello globale per la tua illuminazione: Nella tua immagine campione, sono abbastanza sicuro che potresti adattare un piano (nello spazio X/Y/Luminosità) all'immagine usando i minimi quadrati, quindi separa i pixel in pixel più luminosi (in primo piano) e più scuri di quel piano (sfondo). È quindi possibile adattare i piani separati ai pixel di sfondo e in primo piano, soglia utilizzando nuovamente la media tra questi piani e migliorare la segmentazione in modo iterativo. Quanto bene ciò funzionerebbe nella pratica dipende da quanto bene il tuo fulmine può essere modellato con un modello lineare.

Se gli oggetti reali che si tenta di segmentare sono "più sottili" (hai detto qualcosa sui codici a barre in un commento), puoi provare una semplice operazione di apertura/chiusura per ottenere un modello di illuminazione. (ad esempio, chiudi l'immagine per rimuovere i pixel in primo piano, quindi usa [immagine chiusa + X] come soglia).

Oppure, è possibile provare il filtro a spostamento medio per ottenere i pixel di primo piano e di sfondo alla stessa luminosità. (Personalmente, proverei prima quello)

1

Hai un'illuminazione non uniforme e un oggetto abbastanza grande (quindi, non esiste un modo universale facile per estrarre lo sfondo e correggere la non uniformità). Ciò significa fondamentalmente che non è possibile utilizzare la soglia globale, è necessario un controllo di soglia adattativo.

Si desidera provare la binarizzazione Niblack. Il 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 che dovrete accordare a mano: dimensione della finestra (N nel codice sopra) e peso.

1

tentano di applicare una soglia adattativa locale utilizzando questa procedura:

  1. convolve l'immagine con una media o filtro mediano
  2. sottrarre l'immagine originale da quella soglia convoluta
  3. l'immagine differenza

Il metodo di soglia adattativa locale seleziona una soglia individuale per ciascun pixel.

Sto utilizzando questo approccio in modo estensivo e funziona bene con immagini con sfondo non uniforme.

Problemi correlati