2015-06-17 14 views
6

Penso che ci vorrà un po 'di spiegazioni, quindi per favore portami con me ...Come raggruppare le immagini per "esplosioni?"

Ho catturato più di 2000 immagini in sotto-secondi raffiche di 4-6 alla volta. Sono stati tutti scaricati nello stesso posto, quindi ho bisogno di ordinarli. Ho bisogno di ordinarli per raffiche, ma i dati EXIF ​​offrono solo una risoluzione di un minuto. Le raffiche dovrebbero essere quasi esattamente la stessa cosa, e diverse raffiche sono progettate per essere significativamente differenti.

Ho bisogno di guardare ogni immagine, confrontarla con la seguente e vedere se è simile. Se è troppo diverso, deve provenire da un'altra raffica, deve entrare in una nuova cartella, insieme a una delle seguenti immagini che sono simili ad essa, e così via.

Il mio pensiero è di sommare il valore assoluto della differenza tra ciascun pixel dell'immagine corrente e il successivo. Una volta che la somma raggiunge una soglia, allora ciò significa che provengono da diverse esplosioni (posso fare qualche test per scoprire quale sia una buona soglia).

Il più grande problema è come? PIL/Pillow supporta qualcosa del genere? C'è un modo migliore per vedere se un'immagine è "per lo più" uguale a un'altra?

Sono più interessato a selezionarli rapidamente rispetto all'utilizzo di qualsiasi tecnica particolare, quindi altri approcci sono i benvenuti.

... e praticamente deve essere Python.

EDIT: Ecco un paio di immagini di esempio che dovrebbe andare sia nella stessa cartella: 001 002

Queste sono due delle immagini dalla seguente scoppio, e dovrebbero andare in un'altra cartella: 003 004

+0

Qual è la risoluzione sul timestamp nei dati EXIF? Un modo molto più semplice potrebbe essere quello di identificare le foto scattate come una raffica in base alla piccola differenza di timestamp. Un metodo di somiglianza visiva dovrebbe raggiungere un risultato simile, non dovrebbe? La risoluzione del tempo dipenderà dalla tua fotocamera. – jozzas

+0

Confrontare i timestamp non è sufficiente? Probabilmente sarebbe più facile vedere se le immagini fossero state scattate in un breve intervallo di tempo rispetto alle foto stesse. – erdekhayser

+0

Sì, questa particolare fotocamera offre una risoluzione MINUTE :-(Hai ragione, sarebbe un'opzione molto migliore ...se avessi i dati – Matt

risposta

2

Spiacente, risulta che i dati EXIF ​​erano la strada da percorrere. Sembra che ci siano buoni 10-15 secondi tra una scarica e l'altra, quindi dovrebbe essere davvero facile capire quando uno finisce e l'altro inizia.

PIL/cuscino dispone di strumenti sufficienti per guardare a quella data di creazione utilizzando:

from PIL.ExifTags import TAGS 

def get_exif(fn): 
    ret = {} 
    i = Image.open(fn) 
    info = i._getexif() 
    for tag, value in info.items(): 
     decoded = TAGS.get(tag, tag) 
     ret[decoded] = value 
    return ret 

... o qualcosa del genere.

+1

In realtà, secondo la mia analisi nella mia risposta, il tempo minimo tra le raffiche è 5 secondi e il tempo massimo è 10 secondi. Usare una soglia di 10 secondi praticamente metterà tutto nella stessa cartella. – Sandman

3

La libreria OpenCV è una buona scommessa qui se si desidera eseguire l'abbinamento basato sul contenuto rispetto all'ordinamento basato sul timestamp suggerito dalla brava gente di cui sopra. Controlla questo post su come utilizzare la libreria OpenCV per diverse tecniche di corrispondenza di somiglianza delle immagini: Checking images for similarity with OpenCV

Ci sono un sacco di domande SO sullo stesso argomento, quindi leggerle attraverso ti darà un'idea migliore.

Sulla base dell'idea di tempo sopra, quando ho tracciare solo i tempi che le immagini sono state scattate, questo è un complotto ottengo:

Clusters

I diversi colori rappresentano diverse cartelle (dovrebbe avere usato un mappa dei colori diversa per una migliore visibilità, ma vabbè ...).

Proprio sulla base di questi tempi, sembra il tempo inter-cluster, è visibilmente più pronunciato del tempo intra-cluster.

Ho calcolato anche alcune metriche intra e inter-cluster nel file qui sotto riportato:

folder: ImageBurstsDataset/001 
Total image files in folder: 6 
Total intra-cluster time: 1.0 
Average intra-cluster time: 0.166666666667 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/002 
Total image files in folder: 7 
Total intra-cluster time: 1.0 
Average intra-cluster time: 0.142857142857 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/003 
Total image files in folder: 6 
Total intra-cluster time: 1.0 
Average intra-cluster time: 0.166666666667 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/004 
Total image files in folder: 6 
Total intra-cluster time: 2.0 
Average intra-cluster time: 0.333333333333 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/005 
Total image files in folder: 6 
Total intra-cluster time: 2.0 
Average intra-cluster time: 0.333333333333 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/006 
Total image files in folder: 6 
Total intra-cluster time: 1.0 
Average intra-cluster time: 0.166666666667 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/007 
Total image files in folder: 6 
Total intra-cluster time: 2.0 
Average intra-cluster time: 0.333333333333 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/008 
Total image files in folder: 5 
Total intra-cluster time: 2.0 
Average intra-cluster time: 0.4 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/009 
Total image files in folder: 6 
Total intra-cluster time: 1.0 
Average intra-cluster time: 0.166666666667 
Max: 1.0, Min: 0.0 

folder: ImageBurstsDataset/010 
Total image files in folder: 6 
Total intra-cluster time: 2.0 
Average intra-cluster time: 0.333333333333 
Max: 1.0, Min: 0.0 


Inter-cluster times: [10.0, 8.0, 7.0, 5.0, 6.0, 6.0, 5.0, 10.0, 6.0] 

responsabilità: scritto questo script in un fretta, solo bisogno di tornare indietro e fare in modo che tutti gli edge-cases sono corretti. Ma altrimenti...la conclusione che traggo dal set di dati che hai caricato è questo:

  1. all'interno di un cluster, una foto non è mai più di 1 secondo di distanza da quella precedente.

  2. La prima immagine nel prossimo cluster è ad almeno 5 secondi di distanza dall'ultima immagine nel cluster precedente.

+1

@ mHurley- Ecco qui: [codice] (https://github.com/sandeepklr/so-imageburst/blob/master /main.py) – Sandman

1

Come due immagini simili sono una domanda di ricerca aperta. Tuttavia, dato che le tue immagini sono state scattate in una raffica veloce, l'uso di differenze assolute è ragionevole. Un'altra possibilità è quella di utilizzare la correlazione, ad esempio, moltiplicare i valori dei pixel e accettare i risultati superiori alla soglia.

Il problema sarà la velocità. A seconda delle tue esigenze di accuratezza, potresti essere in grado di sottocampionare le immagini in modo abbastanza significativo. Potrebbe essere che confrontare i valori di 100 o 1000 pixel distribuiti uniformemente - gli stessi pixel in ogni immagine --- ti darebbe una statistica sufficientemente accurata per i tuoi scopi.

+0

La moltiplicazione è un'opzione che non avevo considerato prima. La domanda principale sarebbe come ottenere quei dati? Non mi va bene con gli array numpy ... – Matt

+0

Hmmm. Sembra che le tue immagini da diverse esplosioni siano ancora abbastanza simili. Potresti voler pensare a qualcosa come la massima differenza. Tuttavia, per rendere il metodo meno sensibile al rumore, è possibile istogramma delle differenze e dichiarare una differenza quando una certa percentuale (ad esempio, 10-20%) dei pixel nel campione differisce di più di una soglia. – Darrell

1

PIL può fornire dati RGB di un'immagine, che in teoria può essere utilizzata per il confronto di immagini. Per misurare quanto siano vicine due immagini, probabilmente devi calcolare la differenza delle due immagini o ancora più errori calcolando metodi statistici. È possibile ottenere i dati RGB utilizzando

import Image 
pic = Image.open('/path/to/file') 
rgbdata = pic.load() 
width, height = pic.size 

è possibile visualizzare i dati puramente in termini di valori RGB del pixel ijth in rgbdata [i, j].

Spero che questo aiuti.

[modifica] Questo metodo funziona solo assumendo che tutte le immagini siano scattate nello stesso fotogramma ... Se la fotocamera si muove un po ', questo non funzionerà.

Se provengono da una fotocamera su un treppiede (fisso) e gli oggetti si spostano, possiamo anche tracciare il movimento dell'oggetto (dove la differenza del valore dei pixel è più alta).

Oppure è necessario definire i punti del tracker come eseguiti nel tipo di applicazioni di riconoscimento facciale. (Non sono un esperto nell'elaborazione delle immagini ma ho visto poche applicazioni che funzionano in questo modo)

Un altro modo per confrontare due immagini è nel dominio di Fourier. Ma non sono sicuro di quanto potrebbe funzionare per te.

+0

Ho provato a caricare le prime due immagini e a stampare i dati dei pixel. Ci sono letteralmente migliaia di punti dati. Ci devono essere metodi migliori per risolvere questo problema piuttosto che un'analisi delle differenze di forza bruta. –

+0

LOL !!!! Sì, sono immagini enormi. La mia speranza era che per le immagini che hanno poca somiglianza, avrei colpito la soglia rapidamente e abortire, ma per le immagini che sono molto simili, il diff abs sarebbe molto più piccolo. Forse no ... – Matt

+0

Ma definire che 'soglia' è la chiave ... non possiamo semplicemente scegliere un numero casuale! –

Problemi correlati