PDA

View Full Version : [Qualsiasi] Riconoscimento forme


das
15-03-2014, 11:50
Ho due array di numeri.
Vorrei riuscire a valutare quanto i grafici da esse rappresentati sono simili oppure no, indipendentemente dal fattore di scala.

In altre parole dovrei implementare un algoritmo per il riconoscimento delle immagini ma trattandosi solo di due banali linee vorrei sapere se esiste un qualche algoritmo semplificato già pronto.

Ho pensato a reti neurali oppure FFT, ma se esistesse qualcosa di già bello e fatto sarebbe meglio.

Grazie,
Ciao

das
15-03-2014, 12:34
basta che ne fai la correlazione... non ti ci vogliono mica le reti neurali :D

Non sapevo cosa fosse. Adesso studio :D

das
15-03-2014, 14:12
Thanks :)

das
15-03-2014, 17:51
In realtà però non va bene. L'indice di correlazione esprime una relazione di linearità.

Quindi se ad esempio i due grafici hanno in comune due tratti perfettamente rettilinei ma con pendenza diversa, l'indice in quel tratto restituisce 1.

Questo non va bene perchè risulta che i due grafici sono uguali quando non lo sono.

das
19-03-2014, 08:07
eh? :mbe:

la correlazione per definizione restituisce il grado di somiglianza tra due funzioni.

se hai due segnali X e Y, e calcoli l'autocorrelazione di X per il lag 0, ovvero Rxx[0], otterrai il massimo possibile (i.e. quanto X somiglia a se' stessa).

ora calcoli la correlazione tra X e Y, Rxy[0], otterrai un certo numero, < di Rxx[0]. Quanto piu' il rapporto Rxy[0]/Rxx[0] e' vicino a 1, tanto piu' Y somiglia a X.

Due rette con pendenza diversa sono essenzialmente lo stesso segnale scalto in maniera diversa, per cui normalizzando ciascuno dei due segnali rispetto alla sua energia vedrai che la loro correlazione e' unitaria.

Forse mi sono espresso male, dovevo fare l'analisi tratto per tratto.
Se c'erano due tratti entrambi rettilinei ma con pendenza differente la correelazione dava 1.
Supponiamo che i due vettori che rappresentano quel tratto in esame siano questi:

vet1 vet2
[1] [3]
[2] [6]
[3] [9]
[4] [12]

la correlazione da giustamente 1 perchè sono due rette.
ma mi è bastato modificarli così:

vet1 vet2
[1] [3] <-- Aggiungo un tratto orizzontale
[1] [3]
[2] [6]
[3] [9]
[4] [12]

E ora funziona :D

das
19-03-2014, 21:10
beh, aggiungendo quel tratto orizzontale non sono piu' lo stesso segnale...

È proprio quello che voglio. Devo verificare che visivamente siano uguali, e quindi anche che abbiano la stessa pendenza.

Ora petó il problema è un altro. Dovrei misurare quanto la linea è liscia, senza screpolature. Ho pensato di usare un algoritmo per misurare il rapporto tra segnale e rumore.
Tu hai qualche idea?

das
20-03-2014, 08:47
definisci meglio cos'è una "screpolatura". Se hai a disposizione il segnale originale puoi sicuramente calcolare il rapporto S/N, se non ce l'hai (e se non hai informazioni sulla caratterizzazione statistica del segnale o del rumore) la vedo difficile...

Per screpolatura si potrebbe intendere discontinuità. Ad occhio chiunque ti sa dire se una linea è liscia o screpolata. Dovrei riuscire ad esprimerlo matematicamente.

Non ho il segnale originale ma sicuramente le armoniche di frequenza troppo elevata sono dovute al rumore. Quale sia la frequenza di taglio non lo so perchè sto lavorando con immagini e anche se le tratto come segnali di fatto a me interessa la resa 'visivo'.

Quindi come segnale originale potrei usare quello che viene fuori da un filtro passa basso. Però non so se è la cosa migliore.

Oppure contare le discontinuità. Però i dati mi vengono da un vettore, non da una funzione quindi non so come fare.
Credo comunque che dei milioni di algoritmi esistenti ci sia uno che già risolve questi problemi.

Tutto senza dimenticare il punto di partenza, anche un bambino ti sa dire se una linea è liscia o screpolata, tutto sta a capire quale modello applica per dirlo.

ingframin
20-03-2014, 11:20
Mi sa che deve vedere se sono lisce secondo Lipschitz
http://en.wikipedia.org/wiki/Lipschitz_continuity

@das:
La soluzione al tuo problema e' fare la trasformata Wavelet dei due segnali e confrontare i coefficienti.


In alternativa puoi controllare:
1) Se i vettori sono uguali
2) Se tutti gli elementi di y sono multipli interi di x secondo lo stesso rapporto:
Es.
x = {1,2,3}
y = {2,4,6}
Allora y e' x riscalato
Se invece
x = {1,2,3}
y = {2,6,12}
y non c'entra niente con x.
In ogni caso l'indice di correlazione e' il sistema piu' vero per verificare questa cosa ma puoi benissimo abbinare le due cose,
anche perche' quello che ti ho scritto io non funziona in presenza di rumore.
Pero' puoi sempre usare le wavelets per fare denoising...
http://cs.haifa.ac.il/hagit/courses/seminars/wavelets/Presentations/Lecture09_Denoising.pdf

das
20-03-2014, 16:12
Grazie, sono le informazioni che cercavo.
Solo che a livello di algoritmi già pronti se uno programma MatLab di queste cose trova il mondo.

In C non si trova niente. Vabbè, guarderò di arrangiarmi.

ingframin
20-03-2014, 17:59
Grazie, sono le informazioni che cercavo.
Solo che a livello di algoritmi già pronti se uno programma MatLab di queste cose trova il mondo.

In C non si trova niente. Vabbè, guarderò di arrangiarmi.

Andiamo, una volta che hai i coefficienti wavelet applicarle e' facile.
Alla fine e' un normalissimo banco di filtri FIR da applicare ovvero una convoluzione...
Cerca bene su google, mi sa che c'e' anche una libreria per C con le wavelet.

ingframin
21-03-2014, 10:19
Dopo una ricerca di 2 secondi su google:
https://www.gnu.org/software/gsl/manual/html_node/Wavelet-Transforms.html
Basta scaricare la GNU scientific library e hai una libreria con wavelet e molto di piu' scritta in C e ad alte prestazioni.
Che vuoi di piu' dalla vita? :D

das
22-03-2014, 10:06
Perfetto, grazie ragazzi!