Newsgroup: it.comp.ia
Titolo: Riconoscimento forme

Ho scritto un piccolo programa che da una immagine presa da una
telecamerina, con qualche elaborazione tira fuori i contorni e mi dice se
uno dei contorni è un cerchio
Per trovare il cerchio mi creo una serie i cerchi possibili e vedo se
combaciano con i bordi
La cosa è molto dispendiosa in termini di risorse ed infatti ci metto più di
2 secondi che non è affattpo realtime come vorrei
Mi chiedevo se fosse possibile usare una rete neurale per fare sto
riconoscimento magari anche di più forme e magari partendo dall'immagine
originale e non da quella elaborata con i soli bordi
tenete presente che sono a digiuno completo di reti neurali ma se mi
indirizzate bene tra qualche tempo potrei essere dei vostri
--
_________________________________________
Edmondo Di Tucci snar...@Ttin.it
guarda i miei lavori su: 
www.powernetsi.it/edmondo

Ciao,
se fai il profilo in X e Y ed identifichi due proiezioni di "misura"
simile tenta il matching all'intersezione delle stesse con un cerchio di
diametro simile.
Per il riconoscimento puoi usare Kohonen garantendoti un'ottima immunità
al rumore e fase/asse di rotazione (ma non puoi fare apprendimento
parametrico ed il set di addestramento, nonchè le immagini
discriminabili, dipendono strettamente dalla dimensione della rete).
maurizio


combaciano con i bordi
Perchè non provi con la trasformata di Hough ?
Credo che potrebbe essere piuttosto adatto al tuo scopo... ah i
contorni con che li stai estraendo ? Tieni conto che i filtri che usi
prima dell'edge detection e il modo in cui fai edge detection
condizionano molto le prestazioni finali.
Qui trovi le info su Google:
http://www.google.com/search?hl=en&lr=&ie=UTF-8&q=%22hough+transform%22&spell=1
E qui un applet per estrarre cerchi da immagini date.
http://www.markschulze.net/java/hough/
Augusto Pucci

combaciano con i bordi
Ma... non ne ho mai fatto un uso particolarmente avanzato, ma avevi
pensato alla trasformata di Hough ?
Su Google trovi maggiori dettagli su:
http://www.google.com/search?hl=en&lr=&ie=UTF-8&q=%22hough+transform%22&spell=1
In questo sito trovi un applet Java che ti permette di individuare
cerchi in una immagine:
http://www.markschulze.net/java/hough/
In generale epnso che potrebbe andare bene come strumento.
Augusto Pucci

discriminabili, dipendono strettamente dalla dimensione della rete).
questo mi interessa... hai qualche link riguardo all'argomento?
prestazioni? soprattutto prestazioni rispetto alla trasformata di
hough che è l'unico metodo che ho usato finora
-- 
]\/[ad]\/[age (
www.mindreamz.net
)
"Un Maestro insegue semplicemente la sua visione di Eccellenza in
qualunque cosa sta facendo e lascia agli altri decidere se sta 
lavorando o giocando. A lui sembra sempre di fare entrambe." - Anonimo

riconoscimento magari anche di piů forme e magari partendo dall'immagine


Capperi!
E meno male ch avevo detto di essere a digiuno!


 condizionano molto le prestazioni finali.
Applico uno smoot gaussiano (procedura rubacchiata in rete), poi faccio il
gradiente punto per punto, una soppressione dei punti di non massimo e
infine un treshold
Viene abbastanza bene però impiega quasi 2 secondi cui vanno aggunti i quasi
due della ricerca del cerchio


Caro Edmondo,
se vuoi trovare dei cerchi entro delle figure, usa pure i metodi che, con
molta più competenza della mia, ti sono stati suggeriti. Io però volendo
addentrarmi nel  riconoscimento delle forme, non partirei dall'idea:
1-disegno una circonferenza,
2-ne estraggo i contorni, e li memorizzo magari sotto forma di coordinate
cartesiane,
3-faccio delle trasformazioni lineari su una circonferenza che ho in memoria
fino quando non ottengo la corrispondenza fra questa e quella.
Questo metodo è lento ma rischia diventare inammissibilmente lento se tu
partissi dall'idea, che mi sembra più giusta, di non sapere che hai
disegnato un cerchio. La figura che hai disegnato potrebbe essere qualunque,
è il computer che deve riconoscerla fra le tante e anche restringendo il
contesto alle sole figure geometriche piane, tu dovresti confrontare la tua
figura con i triangoli, con i quadrati,.....
In questo contesto particolare ti potrei suggerire delle scorciatoie, se
parti dalle figure geometriche il computer può velocemente capire che cosa
ha di fronte facendo il rapporto area-perimetro. Potresti anche usare i
momenti d'inerzia ma questi metodi funzionano solo per discriminare fra le
figure geometriche. Io non ho studiato né ingegneria, né informatica  però
le immagini le so trattare e  per questo ti consiglio due libri vecchiotti
ma validi: il Duda per il pattern recognition e il Rosenfel per il
trattamento delle immagini a basso livello, estrazione dei contorni,
eliminazione dei disturbi,.... Tanto per cominciare a familiarizzarti con
banali algoritmi (vestiti a festa ma di poca sostanza).
Io terrei presente che  il riconoscimento delle forme è un'attività del
cervello umano, per me è l'essenza stessa del pensiero, quindi io ti
consiglierei certo studiare le varie trasformate, le reti neuronali, i vari
gradienti e laplaciani ma avendo lo scopo di imitare il cervello umano e
quindi studiare sia la neurofisiologia sia psicofisica.
Se studi queste cose ti accorgerai che, per il sistema visivo umano e degli
animali superiori,  i contorni sono essenziali nel riconoscimento delle
forme. Quindi io non li snobberei.
Nel tuo caso io porrei il problema in questi termini:
1- io mostro al computer una figura, gli dico che è un cerchio,
2-esso ne estrae le caratteristiche e le memorizza, insieme alle
caratteristiche di altre figure, che gli ho precedentemente mostrato e alle
quali ho attribuito il nome, come ho fatto per il cerchio;
3-posta di nuovo un cerchio di fronte al computer esso ne riestrae le
caratteristiche e riconosce il cerchio attraverso quanto ha memorizzato.
Nel caso di figure geometriche non è difficile realizzare quanto sopra ma è
un caso partricolare.
La classe delle figure deve essere ampia a piacere e inoltre non sono le
sole trasformazioni lineari quelle ammesse. Pensa alle lettere alfabetiche:
una A può avere fogge tipografiche diverse. E' un problema irrisolto, se la
classe delle forme è vasta. Esso era già stato  posto negli anni '50, con
l'esempio della  la figura disegnata su un foglio di  gomma che veniva
stirunchiolato. In questi casi i metodi tipo rapporto area perimetro, che
trovi sul libro di Duda, che vanno bene per riconoscere le figure
geometriche, non servono più. Eppure un bambino non ci casca. Quindi occorre
un sistema Human-like, capire quali sono le caratteristiche che il cervello
umano usa per riconoscere le forme. Il problema è tutto lì. Capito questo
potrai realizzare il sistema usando le reti neuronali o un altro argoritmo:
la matematica è una mera tautologia. Le reti neuronali negli anni '50 sono
state abbandonate, nella vision,  proprio perchè non si seppe definire le
caratteristiche da premiare e da castigare. Ora siamo allo stesso punto,
solo che molti non imparano dagli errori e restano abbagliati dai risultati
che derivano dall'uso di calcolatori molto più potenti di allora.
Sono anni che studio la cosa. Invece sono  digiuno di elettronica: ho un
vecchio sistema di acquisizione con telecamera (256x256 punti con 256
livelli di grigio) che oramai è strasuperato mi potresti consigliarne uno
nuovo? Inoltre, per trattare le immagini, uso un'obsoleta forma di pascal,
che gira ancora su dos e che tratta solo matrici di 64K. Mi potresti dire se
ci sono pascal più recenti per leggere e i files che trarrò dal nuovo
sistema di acquisizione, che, probabilmente, saranno più vasti? Forse
troverò queste risposte nei tuoi lavori che vado a guardare.
Ciao e auguri.
Sergio.
"Edmondo Di Tucci" <snar...@Ttin.it> ha scritto nel messaggio
news:hi2Ma.135090$Ny5.3...@twister2.libero.it...

"Edmondo Di Tucci" <snar...@Ttin.it> ha scritto nel messaggio
news:hi2Ma.135090$Ny5.3...@twister2.libero.it...


tutto ciò che dici è interessante... ma resta il fatto che il problema
di riconoscere le forme più elementari è un problema terribilmente
complesso per un computer e terribilmente semplice per un essere umano
è evidente un errore di approccio al problema
l'idea delle caratteristiche da memorizzare (e qui entrerebbe
facilmente in gioco una semplice rete neurale) è carina, interessante,
ma come hai detto tu, non applicabile perché le "caratteristiche" non
si riescono a definire
la mia ultima idea, non ancora implementata, era quella di prendere un
punto del contorno e seguirlo, vedendo se si segue una linea dritta (o
"abbastanza dritta") o una linea curva... nel primo caso siamo su un
"segmento" e quindi basta avere il punto di inizio e quello di fine,
dunque le caratteristiche potrebbero essere semplicemente la lunghezza
del segmento, nel secondo caso magari è sufficiente il raggio di
curvatura
dopodiché si studiano le caratteristiche di un segmento/curva in
relazione a quelle delle altre e si possono anche studiare figure
geometriche complesse
attualmente, però, sto studiando altro... mi domandavo, però, quanto
tempo impiegano gli algoritmi per trovare i bordi delle immagini (che
è lo smooth gaussiano? qualche link?)


 troverò queste risposte nei tuoi lavori che vado a guardare.
Al momento sul trattamento immagini non troverai un fico secco, sono ancora
in una fase molto pre..


infine un treshold
Uhm, in generale nel riconoscimento di forme una robusta estrazione
dei contorni (come se non erro sosteneva Sergio) è fondamentale, e
questo vale anche in un caso relativamente contestualizzato come
quello dell'estrazione di cerchi da una immagine, quindi ti
consiglierei di optare per filtraggi dell'immagine un po' più robusti
di quelli che hai adoperato finora.
In particolare un filtro gaussiano può avere la tendenza a smussarti i
contorni e non è un gran che nel rimuoverti rumori tipici come il salt
& pepper.
In effetti quello che sarebbe desiderabile è invece avere contorni
molto netti e marcati e un rumore ridotto al minimo.
Una buona scelta secondo me potrebbe essere un filtro mediano, quel
che fa è abbastanza semplice, fissi la grandezza della finestra
scorrevole, la posizioni a turno su tutti i pixel, a ogni passo ordini
per gradazione di grigio i valori dei pixel che cadono nella finestra
mettendoli nel vettore, ora assegni al pixel centrale della finestra
il valore di gradazione di grigio che si trova a metà del vettore.
E questo lo fai scorrendo la finestra su tutti i pixel.
E' un filtro estremamente semplice da implementare ma che esalta
fortemente i contorni e rimuove molto rumore tipico.
A questo punto non ti conviene per il rilevamento dei contorni
reinventare la ruota, il classico Solbes.. o meglio ancora
l'estarttore Canny funzioneranno egregiamente.
Dopo aver fatto questo l'uso della trasformata di Hough ti dovrebbe
permettere una buone performances..anche eprchè dopo aver passato il
mediano e per esempio Canny il contenuto informativo dell'immagine
sarà ridotto proprio all'essenziale.
Se stai lavorando in MatLab (te lo consiglio, soprattutto quando sei a
livello prototipale ti permette di fare un sacco di prove e test di
tecniche diverse... sfruttando l'Image Processing Toolbox diventa uno
scherzo :)... poi una volta individuato il modo migliore di procedere
nulla ti vieta di reimplementare il tutto che so in C o C++) trovi i
filtri di cui ti parlavo già praticamente implementati..credo comunque
che un buon punto da cui partire potrebbero essere le slides e gli
esempi introduttivi che trovi su:
http://www.dii.unisi.it/~domenico/didattica/LaboratorioRobotica/LabRoboticsVirtualReality0203.pdf
ele immagini che trovi su:
http://www.dii.unisi.it/~gmariottini/Teaching/coursesDownload/LabRob0203/ImmaginiEsercizi.zip
dacci una occhiata anche se non usi MatLab, ti possono dare un po' di
idee.
Augusto Pucci

dacci una occhiata anche se non usi MatLab, ti possono dare un po' di
Piccola svista, sul primo link in effetti non ci sono le slides che ti
volevo indicare, ma solo il manifesto di presentazione di un
laboratorio, di qui a qualche giorno comunque dovresti trovare su:
http://www.dii.unisi.it/~gmariottini/Teaching/courses.html
delle slides sulla trasformata di Hough e su diverse tecniche di
filtraggio delle immagini e di corner e edge extraction.
Mi scuso per l'informazione inesatta.
Augusto Pucci

 hough che è l'unico metodo che ho usato finora
Scrivi semplicemente Kohonen su Google e trovi il materiale.
Specifico che risluta particolarmente efficace e semplice da
implementare se il tuo compito prevede di identificare un'immagine in
una serie limitata inserita in apprendimento.
E non occorre eseguire l'estrazione dei contorni.
Anni fa, e con computer molto lenti (386/16), abbiamo implementato un
sistema di riconoscimento per la gestione dei resi editoriali (riviste
con gadgets, posizionati casualmente nel blister a coprire le immagini)
in grado di discriminare agevolmente tra numerose testate la rivista in
esame (presentata diritta o rovesciata di 180 gradi - non ribaltata
ovvio!).
Ciao
maurizio

Scrivi semplicemente Kohonen su Google e trovi il materiale.
no, no... conosco le reti di kohonen (som, vq, lvq)... mi chiedevo
come utilizzarle per il riconoscimento di forme


 ha scritto nel messaggio
news:0rf6gv8mnl120ba78...@4ax.com...


 ha scritto nel messaggio
news:0rf6gv8mnl120ba78...@4ax.com...


tutto ciò appare molto interessante... ciò di cui mi occupo io (quasi
hobbysticamente... in effetti per la tesi di laurea) è ad un livello
successivo, cioè "cosa succede dopo che ho le forme"? quindi
riconoscimento di forme complesse (un albero, un'automobile), ma
soprattutto cose del tipo "c'è un'automobile per strada, devo
aspettare che passi prima di attraversare, altrimenti c'è il rischio
che mi investa"
però, chiaramente, sarebbe più interessante che invece di avere delle
forme già "comprese" dessi in pasto alla mia rete (che non è proprio
"neurale") le immagini nude e crude...
il fatto degli angoli non lo avevo pensato, in effetti il fatto degli
angoli è quello che io dicevo per quanto riguarda i segmenti... resta
però da capire come riconosci segmenti curvi, che non hanno angoli, ad
esempio un cerchio
