Newsgroup: it.scienza.informatica
Titolo: Confronto immagini di grafici

Salve a tutti.
Sapreste indicarmi cosa (se esiste) approfondire per potere eseguire il
confronto fra immagini bitmap (formato BMP) che contengono delle curve
prodotte da uno strumento di misura e poter indicare il grado di
sovrapposizione delle stesse (premettendo che per via della fasatura la
curva potrebbe essere traslata lungo uno degli assi, per intenderci tipo
oscilloscopio).
Grazie in anticipo!

Astrolinux ha scritto:

In primo luogo, avendo i segnali, e' meglio elaborare direttamente
quelli, senza passare per le immagini.
Comunque, avendo solo l'immagine di un segnale da elaborare, la prima
cosa da fare e' cercare di estrarne il segnale originale. A tale scopo,
per ogni X si deve determinare per quale Y si ha il pixel piu' chiaro
(o piu' scuro).
Poi si tratta di capire che cosa intendi per "eseguire il confronto".
Forse misurare la somiglianza tra i due segnali?
La sfasatura e' nota o deve essere determinata dal confronto?
Ci puo' essere anche uno scostamento verticale?
Ci puo' essere anche una differenza di scala orizzontale o verticale?



Io ho fatto una cosa che credo sia assolutamente identica (fasatura
compresa), in cui e` ammessa una tolleranza sia per l'asse dei tempi, sia
per l'asse delle tensioni, in sostanza delta_X e delta_Y. Per via della
fasatura, della tolleranza delta X, e per il fatto che i 2 segnali
potevano essere campionati a diverse frequenze, la cosa non e` semplice,
soprattutto quando, come nel mio caso, hai a che fare con, centinaia di
migliaia di punti e vuoi eseguire il confronto nel piu` breve tempo
possibile.
Se i segnali sono sempre campionati alla stessa frequenza, non ti
interessa la fasatura e non hai una tolleranza X, allora il problema si
riconduce al semplice confronto punto-punto.
Se il problema e` identico allora dei fare una serie di cose....
Dovresti mandarmi almeno un tuo indirizzo e-mail o farmi capire che non
sei qualcuno che conosco o che lavora qui perche` ammetto che il
mondo sia grande, ma un problema cosi` mi sembra una coincidenza troppo
insolita e se ti conosco possiamo vederci......
Ciao.
-- 
Per le risposte utilizzare l'indirizzo:
lo_ren_zo-so_la@lib_ero.it
togliendo SOLO i sottotratti ("_").
Grazie.	Lorenzo Sola

Il Fri, 25 Aug 2006 01:24:46 +0200, Astrolinux ha scritto:

Ipotizziamo prima che la base dei tempi sia la stessa, quindi che ad ogni
x del primo grafico sia associabile puntualmente un x del secondo.
-Ricava 2 strutture di punti (x,y) (chiamiamole serie A e B), per ogni
grafico.
-Individua i punti di riferimento Pa, Pb, per la rifasatura su
entrambe le serie.
-Ricava: Dx = Pax-Pbx e per ogni punto della serie b esegui x-Dx. Ora hai
le due serie rifasate. -Chiamiamo Tx e Ty rispettivamente le tolleranze x
e y per la sovrapposizione. 
-Per ogni punto in A Pa individua il corrispondente punto in B, Pb.
Ora vogliamo sapere se Pb rientra nell'area disegnata da Pa e dalle rette
tracciate dai quadrati di lato Dx e Dy e centrati in Pa e nei punti
precedenti e successivi a Pa. Non possiamo utilizzare la distanza euclidea
per ovvi motivi (non si tratta di cerchi ma di quadrati:
-Trovare il quadrato piu` vidino a Pb tra Pa, quelli precedenti e quelli
successivi con una misura di vicinanza eseguita come segue:
-Trovare il lato di ogni quadrato piu` vicino a Pb tra quelli intorno a Pa
(sara` una tua ottimizzazione SW il considerare solo il minimo numero di
quadrati votabili).
-Di ogni lato trovare una misura di distanza che sara` plausibilmente il
valore Dy/Ty se il lato considerato e` orizzontale, Dx/Tx se il lato
considerato e` verticale. In questo modo il quadrato con minor distanza
(calcolata come spiegato) sara` quello in cui Pa potrebbe rientrare.
Ora non resta che controllare se le tolleranze sono entrambe
rispettare rispetto al punto individuato con il procedimento precedente.
Per Basi dei tempi diversi calcola la serie B con interpolazione rispetto
alle ascisse di Pa: alla fine avrai 2 serie con lo stesso numero dei punti
ed uguale base tempi quindi si rientra nel caso considerato.
Chiaramente sull'algoritmo descritto e` possibile fare molte
ottimizzazioni all'implementazione. Io alla fine sono riuscito ad ottenere
qualcosa che per 200.000 per entrambi i "grafici" impiega circa 1/2
secondo inclusa l'acquisizione del file con valori testuali in
floating point (double) per entrambi gli assi, su una macchina pentium
dual core da 2,4 GHz il tutto scritto in Java. Ti confesso che ho faticato
piu` di quanto previsto.
Mi dispiace se non sono stato chiaro al 100% ma non mi e` possibile fare
altrimenti.


Il Mon, 04 Sep 2006 10:27:22 +0200, Lorenzo Sola ha scritto:
Be...riguardando ho trovato qualche errore. Lo riporto corretto.
 
Ipotizziamo prima che la base dei tempi sia la stessa, quindi che ad ogni
x del primo grafico sia associabile puntualmente un x del secondo.
-Ricava 2 strutture di punti (x,y) (chiamiamole serie A e B), per ogni
grafico.
-Individua i punti di riferimento Pa, Pb, per la rifasatura su
entrambe le serie.
-Ricava: Dx = Pax-Pbx e per ogni punto della serie b esegui x+Dx. Ora hai
le due serie rifasate.
-Chiamiamo Tx e Ty rispettivamente le tolleranze x e y per la
sovrapposizione.
-Per ogni punto in A Pa individua il corrispondente punto in B, Pb.
Ora vogliamo sapere se Pb rientra nell'area disegnata da Pa e dalle
rette tracciate dai quadrati di lato Dx e Dy e centrati in Pa e nei
punti precedenti e successivi a Pa. Non possiamo utilizzare la distanza
euclidea per ovvi motivi (non si tratta di cerchi ma di quadrati:
-Trovare il quadrato piu` vicino a Pb tra Pa, quelli precedenti e quelli
successivi con una misura di vicinanza eseguita come segue: 
-Trovare il lato di ogni quadrato piu` vicino a Pb tra quelli intorno a Pa
(sara` una tua ottimizzazione SW il considerare solo il minimo numero di
quadrati votabili). Per scegliere quale lato considerare e` sufficiente
dividere il quadrato in 4 quadranti delineati dalle sue diagonali e vedere
in quale quadrante di trova Pb: io per fare questo ho utilizzato il
Coseno della retta passante per Pa,Pb rispetto alla retta orizzontale
x,Pay. 
-Di ogni lato trovare una misura di distanza che sara` plausibilmente il
valore Dy/Ty se il lato considerato e` orizzontale, Dx/Tx se il lato
considerato e` verticale.
In questo modo il quadrato con minor distanza (calcolata come spiegato)
sara` quello in cui Pa potrebbe rientrare.
Ora non resta che controllare se le tolleranze sono entrambe rispettare
rispetto al punto individuato con il procedimento precedente.
Per Basi dei tempi diverse calcola la serie B con interpolazione
