Domanda

Sto cercando di sviluppare un algoritmo di messa a fuoco delle immagini per alcuni lavori di automazione dei test.Ho scelto di utilizzare AForge.net, poiché sembra un bel sistema maturo e compatibile con .net.

Sfortunatamente, non riesco a trovare informazioni sulla creazione di algoritmi di messa a fuoco automatica da zero, quindi ho fatto del mio meglio:

scattare l'immagine.applica il filtro di rilevamento dei bordi Sobel, che genera un contorno dei bordi in scala di grigi.generare un istogramma e salvare lo standard dev.avvicinare la fotocamera al soggetto e scattare un'altra foto.se lo sviluppo standard è più piccolo del precedente, ci concentreremo maggiormente.in caso contrario, abbiamo superato la distanza ottimale per scattare foto.

C'è un modo migliore?

aggiornamento:ENORME difetto in questo, comunque.come ho capito passato punto di messa a fuoco ottimale, il valore della mia "immagine a fuoco" continua a crescere.ti aspetteresti una funzione parabolica guardando la distanza/valore di messa a fuoco, ma in realtà ottieni qualcosa che è più logaritmico

aggiornamento 2:okay, quindi sono tornato a questo e al metodo attuale che stiamo esplorando vengono forniti alcuni bordi noti (ok, quindi so esattamente quali sono gli oggetti nell'immagine), eseguo un confronto manuale dell'intensità dei pixel.man mano che il grafico risultante diventa più ripido, mi concentro maggiormente.Pubblicherò il codice una volta che l'algoritmo principale verrà portato da Matlab a C# (sì, matlab...:S)

aggiornamento 3:evvai ultimo aggiornamento.sono tornato di nuovo su questo.il codice finale è simile al seguente:

passo 1:ottieni l'immagine dall'elenco delle immagini (ho scattato un centinaio di foto tramite il punto focalizzato)

passo 2:trova un bordo per l'oggetto che sto mettendo a fuoco (nel mio caso è un oggetto rettangolare che è sempre nello stesso posto, quindi ritaglio un rettangolo ALTO e STRETTO di un bordo)

passaggio 3:ottieni l'HorizontalIntensityStatistics (classe Aforge.net) per l'immagine ritagliata.

passaggio 4:ottieni l'istogramma (grigio, nel mio caso)

passaggio 5:trovare la derivata dei valori dell'istogramma

passaggio 6:quando la tua pendenza è maggiore, è quando sei nel punto più concentrato.

È stato utile?

Soluzione

Potrebbe essere un po' semplicistico per le tue esigenze, ma ho ottenuto buoni risultati con un semplice algoritmo che esamina la differenza rispetto ai pixel vicini.La somma della differenza dei pixel a 2 distanze sembra essere una misura ragionevole del contrasto dell'immagine.Non sono riuscito a trovare l'articolo originale di Brenner negli anni '70 ma è menzionato in http://www2.die.upm.es/im/papers/Autofocus.pdf

Un altro problema è che quando l'immagine è estremamente fuori fuoco, ci sono pochissime informazioni sulla messa a fuoco, quindi è difficile dire in che direzione ci si sta "avvicinando" o evitare un massimo locale.

Altri suggerimenti

Puoi dare un'occhiata alla tecnica utilizzata nel Curiosity Mars Rover della NASA.

La tecnica è descritta in questo articolo

EDGETT, Kenneth S., et al.Indagine sul Mars Hand Lens Imager (MAHLI) di Curiosity. Recensioni di scienze spaziali, 2012, 170.1-4: 259-317.

che è disponibile come a PDF qui.

Citando dall'articolo:

7.2.2 Messa a fuoco automatica

Si prevede che l'autofocus sia il metodo principale con il quale Mahli è focalizzato su Marte.Il comando AutoFocus indica alla fotocamera di spostarsi in una posizione di conteggio del motore di avvio specificato e raccogliere un'immagine, spostare un numero specificato di passaggi e raccogliere un'altra immagine e continuare a farlo fino a raggiungere un numero totale di immagini comandato, ciascuna separata da un motore specificato Contare l'incremento.Ognuna di queste immagini è compressa JPEG (gruppo di esperti fotografici congiunti;Vedi CCITT (1993)) con lo stesso fattore di qualità di compressione applicata.La dimensione del file di ogni immagine compressa è una misura dei dettagli della scena, che a sua volta è una funzione di messa a fuoco (un'immagine in-focus mostra più dettagli di una vista sfocata, fuori focus della stessa scena).Come illustrato nella Fig.23, la fotocamera determina la relazione tra le dimensioni del file JPEG e il conteggio dei motori e si adatta a una parabola alle tre dimensioni massime dei file.Il vertice della parabola fornisce una stima della migliore posizione di conteggio dei motori a fuoco.Avendo preso questa determinazione, Mahli sposta il focus group delle lenti nella migliore posizione del motore e acquisisce un'immagine;Questa immagine è memorizzata, le immagini precedenti utilizzate per determinare la posizione automatica non vengono salvate.

L'autofocus può essere eseguito sull'intero campo visivo Mahli, oppure può essere eseguito su un sotto-frame che corrisponde alla parte della scena che include gli oggetti da studiare.A seconda della natura del soggetto e della conoscenza delle incertezze nel posizionamento robotico del braccio di Mahli, gli utenti potrebbero scegliere di acquisire un sotto-frame centrato di AutoFocus o potrebbero selezionare un sotto-frame di autofocus fuori sede se il posizionamento è sufficiente per determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare dove determinare la conoscenza del posizionamento Il sotto-frame dovrebbe essere individuato.L'uso di sotto-frame per eseguire l'autofocus è altamente raccomandato perché questo di solito si traduce in modo migliore rispetto al caso in cui l'autofocus viene applicato al CCD completo;Inoltre, la posizione di conteggio dei motori risultante dall'autofocus utilizzando un sotto-frame di solito comporta una determinazione più accurata della distanza di lavoro dalla scala dei pixel.

Quella che segue è la Figura 23:

Autofocus in NASA Curiosity Mars Rover

Questa idea è stata suggerita anche in questa risposta: https://stackoverflow.com/a/2173259/15485

Questo potrebbe essere utile.Ecco come funziona effettivamente il sistema AF della fotocamera: Messa a fuoco automatica passiva

Misurazione del contrasto

La misurazione del contrasto si ottiene misurando il contrasto all'interno di un campo del sensore, attraverso l'obiettivo.La differenza di intensità tra i pixel adiacenti del sensore aumenta naturalmente con la corretta messa a fuoco dell'immagine.Il sistema ottico può quindi essere regolato fino a quando non viene rilevato il massimo contrasto.In questo metodo, AF non comporta affatto misurazione della distanza effettiva ed è generalmente più lento dei sistemi di rilevamento di fase, specialmente quando si opera sotto luce fioca.Poiché non utilizza un sensore separato, tuttavia, l'autofocus di rilevamento a contrasto può essere più flessibile (come è implementato nel software) e potenzialmente più accurato.Questo è un metodo comune nelle videocamere e nelle fotocamere digitali a livello di consumo che mancano di persiane e specchi riflessi.Alcune DSLR (tra cui Olympus E-420, Panasonic L10, Nikon D90, Nikon D5000, Nikon D300 in modalità treppiede, Canon EOS 5D Mark II, Canon EOS 50D) usano questo metodo quando si concentra nelle loro modalità di visione live.Un nuovo sistema di lente intercambiabile, Micro Four Thirds, utilizza un autofocus di misurazione del contrasto esclusivamente e si dice che offra prestazioni paragonabili ai sistemi di rilevamento delle fasi.

Non ne ho costruito uno personalmente, ma il mio primo pensiero sarebbe quello di eseguire un DFT 2D su una parte dell'immagine.Quando non sono a fuoco, le alte frequenze scompariranno automaticamente.

Per un prototipo pigro, potresti provare a comprimere una regione dell'immagine con JPEG (alta qualità) e osservare la dimensione del flusso di output.Un file di grandi dimensioni significa molti dettagli, il che a sua volta implica che l'immagine sia a fuoco.Fai attenzione che la fotocamera non dovrebbe essere troppo rumorosa e che ovviamente non puoi confrontare le dimensioni dei file tra scene diverse.

Sebbene il sobel sia una scelta decente, probabilmente sceglierei di eseguire un calcolo della magnitudo del bordo sulle proiezioni nelle direzioni xey su diverse piccole regioni rappresentative.Un'altra scelta compatibile con .NET basata su OpenCV è @ http://www.emgu.com/wiki/index.php/Main_Page.

Mi chiedo se la deviazione standard sia la scelta migliore:Se l'immagine diventa più nitida, l'immagine del filtro Sobel conterrà pixel più luminosi ai bordi, ma allo stesso tempo meno pixel luminosi, perché i bordi diventano più sottili.Forse potresti provare a utilizzare una media dei valori di pixel più alti dell'1% nell'immagine Sobel?

Un altro tipo di metrica di focus potrebbe essere:

Prendi diverse immagini e mediale (riduzione del rumore).Quindi eseguire la FFT sull'immagine media e utilizzare il rapporto energetico delle frequenze alte e basse.Maggiore è questa razione, migliore è la concentrazione.È disponibile una demo Matlab (esclusa la fase di calcolo della media) all'interno delle demo del toolbox :)

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