2011-01-19 3 views
7

Attualmente sto aiutando un amico a lavorare su un progetto geofisico, non sono affatto un professionista dell'elaborazione delle immagini, ma è divertente giocare con questi tipi di problemi . =)Trovare l'altezza sopra il livello dell'acqua delle rocce

L'obiettivo è stimare l'altezza delle piccole rocce che fuoriescono dall'acqua, dalla superficie verso l'alto.

L'apparecchiatura sperimentale sarà una fotocamera da ~ 10 MP montata su un misuratore di distanza con un puntatore laser incorporato. L '"operatore" lo punterà su una roccia, premerà un grilletto che registrerà una distanza lungo una foto della roccia, che sarà al centro dell'immagine.

Si può presumere che l'attrezzatura sia sempre a una distanza fissa sopra l'acqua.

come la vedo io ci sono una serie di problemi da superare:

  1. condizioni di illuminazione

    • A seconda del momento della giornata, ecc, la roccia potrebbe essere più luminoso poi il acqua o opposto.
    • A volte la roccia avrà un colore molto vicino all'acqua.
    • La posizione dell'ombra si sposta durante il giorno.
    • A seconda di quanto ruvida è l'acqua, a volte potrebbe esserci un riflesso della roccia nell'acqua.
  2. Diversità

    • La roccia non è modellato in modo uniforme.
    • A seconda del tipo di roccia, della crescita del lichene ecc., Cambia l'aspetto della roccia.

Fortunateness, non v'è carenza di dati di test. Immagini di rocce nell'acqua sono facili da trovare. Ecco alcune immagini di esempio: alt text Ho eseguito un rilevatore di bordi sulle immagini, ed esp. nella quarta foto il contrasto basso rende difficile vedere i bordi: alt text Qualsiasi idea sarebbe molto apprezzata!

+0

Lavorano un po 'sullo stesso problema: http://gaugecam.com/blog/?page_id=62 (anche se non vedo alcuna soluzione al tuo problema) – svrist

+0

Sembra che tu possa essere in grado di modificare il tuo rilevatore di bordo di più http://en.wikipedia.org/wiki/Edge_detection – svrist

+0

Questo è un problema di visione; a meno che non vogliate solo aiutare a migliorare il rilevatore di bordi. – koan

risposta

4

Non penso che il rilevamento dei bordi sia l'approccio migliore per rilevare le rocce. Altri oggetti, come le montagne o anche i riflessi nell'acqua provocheranno dei bordi.

suggerisco di provare un approccio di classificazione dei pixel per segmentare le rocce dallo sfondo dell'immagine:

  • Per ogni pixel dell'immagine, estrarre una serie di descrittori di immagini da un quartiere NxN centrato in quel pixel.
  • Selezionare un set di immagini e etichettare manualmente i pixel come sfondo o roccia.
  • Utilizzare i pixel etichettati ei rispettivi descrittori di immagine per addestrare un classificatore (ad es.un classificatore di Naive Bayes)

Poiché le rocce tendono ad avere una trama simile, utilizzerei i descrittori di immagine della trama per addestrare il classificatore. Ad esempio, è possibile provare ad estrarre alcune misure statistiche da ciascun canale cromatico (R, G, B) come la media e la deviazione standard dei valori di intensità.

+0

Sì, ho pensato di usare un classificatore probabilistico, come l'NB, ma non posso pensare a come eliminerebbe i riflessi .. – Theodor

2

Segmentazione del colore per trovare la roccia, insieme al rilevamento dei bordi per trovare la cima.

Per trovare il livello dell'acqua, proverei a trovare tutti i confini di roccia e acqua (se possibile) quindi adattare un piano alla superficie dell'acqua. In questo modo non devi preoccuparti dei riflessi della roccia.

Più facile se si conosce l'angolo di inclinazione tra la fotocamera e l'acqua e se la fotocamera è livellata orizzontalmente (rullo).

ps. Questo è molto più difficile di quanto pensassi - non si conosce la distanza da tutte le rocce per cui un aereo è difficile da montare.

Si verifica che il riflesso sia in realtà il modo ideale per trovare il livello, cercare i bordi del percorso simmetrico nel rilevamento del bordo roccioso e selezionare il vertice?

+0

Il rock sarà centrato nell'immagine, quindi trovare la roccia nell'immagine non è un problema. Ma tu, probabilmente, ti riferisci ad estrarre la roccia dall'immagine. Adattare un piano alla superficie dell'acqua ha senso, ma come si filtrano i riflessi? Sono d'accordo sul fatto che il rotolo e l'angolo di inclinazione dovrebbero essere noti, che possono essere facilmente raggiunti inserendo un livello semplice come quello che si trova sui treppiedi della macchina fotografica sull'attrezzatura. – Theodor

2

La classificazione dei pixel potrebbe funzionare qui, ma non darà mai un'accuratezza del 100%. La varianza dei dati è molto grande, le rocce hanno colori diversi (che sono anche "corrotte" con l'illuminazione) e diverse texture. Quindi, bisogna anche tener conto delle informazioni globali.

Il problema da affrontare è l'estrazione in primo piano. Ci sono due approcci di cui sono a conoscenza.

  1. Riduzione di energia tramite tagli del grafico, vedere ad es. http://en.wikipedia.org/wiki/GrabCut (ci sono collegamenti alla carta e implementazione OpenCV). Qualche inizializzazione ("semi") dovrebbe essere fatta (da un utente o da qualche conoscenza precedente come la roccia è al centro mentre l'acqua è alla periferia). Un'altra variante di input è un rettangolo di delimitazione approssimativo. È implementato nello strumento di estrazione in primo piano di MS Office 2010. La funzione energetica delle eventuali etichettature in primo piano/sfondo fa in modo che il primo piano sia simile ai semi in primo piano e un contorno liscio. Quindi, il minimo dell'energia corrisponde alla buona maschera in primo piano. Si noti che con l'approccio di classificazione dei pixel si dovrebbe pre-etichettare un sacco di immagini da cui imparare, quindi la segmentazione viene eseguita automaticamente, mentre con questo approccio si dovrebbero selezionare i semi su ogni immagine di query (o vengono scelti implicitamente).

  2. Active contours a.k.a.i serpenti richiedono anche l'interazione dell'utente. Sono più simili allo strumento Bacchetta magica di Photoshop. Cercano anche di trovare un confine scorrevole, ma non considerano l'area interna.

Entrambi i metodi potrebbero avere problemi con i riflessi (la classificazione dei pixel avrà sicuramente). Se è il caso, puoi provare a trovare una simmetria verticale approssimativa ed eliminare la parte inferiore, se presente. Puoi anche chiedere a un utente di contrassegnare il reflaction come sfondo mentre raccolgono le statistiche per i tagli del grafico.

+0

Cool, la tecnica di taglio GrabCut/Graph sembra davvero promettente. Insieme a qualche tecnica per rilevare la superficie dell'acqua potrebbe essere interessante. Forse potresti inserire un triangolo nel blob estratto e ottenere una stima attraverso l'altezza dei triangoli. – Theodor