2015-05-22 17 views
10

Sto cercando di rilevare l'orizzonte in un'immagine e di restituire una maschera del cielo (o invertita come il terreno). Mentre sembra esserci molti usi, sto lottando per trovare una buona soluzione. Quel che è peggio è che sembra un problema così semplice, e la maggior parte degli umani non ha alcun problema nel rilevare l'orizzonte.Individuazione della separazione Cielo/Terra in OpenCV

Di seguito rende più difficile:

  • L'orizzonte è raramente una linea retta nelle immagini utilizzate (paesaggi di montagna), quindi un rilevamento dei bordi e la linea trasformata di Hough non funzionerà.
  • Deve funzionare in tutte le condizioni di luce. Il Thresholding (come la soglia di Otsu) funziona ma non funziona bene in condizioni di basso contrasto come prima dell'alba. La soglia del valore fisso non funziona in quanto la luce cambia troppo durante il giorno.

Quello che ho cercato per ora è di usare un filtro colorato limitandolo a basse saturazioni, quindi trovare contorni e rilevare e riempire il contorno più grande. Dopo questo, allagamento riempire l'area sopra il contorno. Funziona, ma non riesco ancora a immaginare che questo problema sia così difficile.

Sto scrivendo il codice in Delphi XE8, utilizzando un wrapper OpenCV, ma le risposte o le idee in qualsiasi altra lingua sono le benvenute!

+2

"Sto scrivendo il codice in Delphi XE8, utilizzando un involucro OpenCV," - oh, che suona terribile, perché probabilmente non è possibile utilizzare funzioni più avanzate, come il C++ o CLAHE bioispirati :: retina per la normalizzazione dell'illuminazione – berak

+3

'la maggior parte degli umani non ha alcun problema nel rilevamento dell'orizzonte' - la maggior parte degli umani ha un'esperienza naturale o appreso nel riconoscimento dei pattern e nella comprensione delle scene. – Micka

+5

probabilmente hai già usato google? dandomi alcuni link e http: // StackOverflow.it/questions/4705837/algoritmo di rilevamento degli orizzonti (che include di nuovo alcuni dei link di Google) – Micka

risposta

1

Nella mia comprensione, si sta cercando una linea orizzontale, se esiste, per separare la parte esclusivamente del cielo dal resto.

Vorrei calcolare le statistiche dell'immagine riga per riga, quindi un istogramma orizzontale o simile a quello.

Può essere basato anche su una soglia globale o su una funzione personalizzata "skyness". Decidi in qualche modo (intensità, tonalità) se i pixel sono o meno cielo e li contiamo all'interno delle linee di scansione.

Quindi metà dell'immagine in orizzontale, somma i valori di riga per entrambe le parti e decidere in quale direzione deve essere spostata la 'linea orizzontale'. Metà di quella parte anche e continua fino ad arrivare alla riga corretta. Con una tale ricerca binaria dovresti essere in grado di estrarre quale linea separa il cielo dal primo piano. Se è la prima linea: nessun cielo, se l'ultimo: tutto il cielo.

Questo problema ha sicuramente altri approcci quindi non vedo l'ora di vedere altri suggerimenti.

1

La mia risposta è completamente diversa. Puoi collegare OpenCV con una bussola magnetica per separare il cielo da terra.

È possibile farlo in OpenCV con iOS. Collega il tuo progetto OpenCV con la bussola che è in IPhone. Quindi separa il cielo da terra come l'app della bussola.

Vedi http://imgur.com/bwLpaOC

+0

Ma se capisco cosa intendi, questo implica che l'immagine che stai analizzando deve essere presa con la fotocamera dell'iPhone, che per quanto ho capito non è ciò che l'OP sta cercando. Bello approccio creativo però. –

+0

So che questo è un po 'impegnativo. Ma vale qualcosa. – AlkindiX

Problemi correlati