Newsgroup: it.comp.www.php
Titolo: estrapolazione dati da un immagine

Ho una serie di immagini che contengono dei numeri cdhe io debbo copiare a
mano in un file txt. Vorrei sapere se è possibile creare uno script php che
mi estragga i numeri da queste immagini e me li memorizzi nel file stesso.
Le immagini sono tutte uguali tra di loro, cambia solo il numero da
estrarre, secondo voi è possibile una cosa del genere o chiedo davvero
troppo??
Grazie
Andrea

 mi estragga i numeri da queste immagini e me li memorizzi nel file stesso.
Sicuramente possibile: ti devi fare un OCR!
Supponiamo che tu hai a disposizione le 10 cifre (da zero a 9) in 
formato .png in rosso su sfondo bianco (se non le hai sicuramente le 
puoi fare con qualsiasi porgramma di grafica)
Supponiamo che le immagini con i numeri da estrapolare siano in nero su 
bianco.
Sovrapponi, applicando la trasparenza sullo sfondo, una per una, le 10 
cifre in rosso, alla porzione di immagine originale che contiene la 
prima cifra.
Quando in quella porzione non rilevi nessun pixel nero significa che 
corrisponde all'immagine (ovvero al numero) che stai testando. An so on 
per le altre cifre dell'immagine originale.
Naturalmente devi lavorare con le gd, rilevare le posizioni esatte delle 
singole cifre, etc, etc..., leggere un pò di doc (hint: leggi le user 
notes dell funzioni gd!).
Questo è solo un tentativo che ho pensato al volo, probabilmente esiste 
una soluzione migliore che riuscirai a implementare conoscendo più a 
fondo il problema (se hai a disposizione il font dell'immagine originale 
   forse ti faciliti la vita)
PS: hai verificato che non esista qualcosa di già fatto in giro per il 
web: zend, phpclasses, etc.. Magari non la soluzione finale, ma qualcosa 
  sulla elaborazione dell'immagine che ti faciliti il lavoro?
Hope it helps
Ciao

 Hope it helps
speriamo ;)
Grazie
Andrea

 debbo prendere giù i numeri relativi alle velocità ed ai seek time
il problema che sollevi è un campo di ricerca in cui molte aziende 
operano da vario tempo, non lo risolvi di sicuro in 4 balletti, e 
immagino che da solo fare una cosa del genere potrebbe impegnare una 
decina di anni, magari applicandoti nello specifico puoi impiegarne un 
po' meno, ma credo che non hai speranze.
Secondo te se con 4 righe (o 40.000.000 non cambia molto) di php si 
facevano cose del genere il riconoscimento di immagini digitali coi 
mezzi che impiegano industrie e università da quanto tempo era stato 
definitivamente risolto? Il "semplice" riconoscimento di oggetti 
regolari in contesti complessi è già un casino....
Ciao Gianfranzo
-- 
--
ICQ#: 21258924
Nick Gianfranzo
Home page 
http://www.gianfranzo.it
Gianfranzo è contro la guerra
--

 regolari in contesti complessi è già un casino....
ok, allora direi che è meglio se lascio perdere ;)
Grazie!
Andrea

debbo prendere giù i numeri relativi alle velocità ed ai seek time
Se le immagini sono simili il problema e' molto semplice.
Per prima cosa ti prepari N array di simboli usando le GD: con Paintbrush
tagli per es. il "9" di quel "92 ms" di seek time, allineandolo preciso a
dove sta nella finestrella.
A questo punto inizi a scansionarlo, colonna per colonna, indicando con 1
dove trovi un pixel blu e 0 dove lo trovi nero.
Per cui il 9, che e', supponiamo,
01110
10001
10001
01111
00001
00001
01110
ti diventa: 01100000 1001001 1001001 1001001 0111110.
Quando hai tanti array quanti sono i simboli che ti servono, hai fatto.
Adesso carichi la tua immagine in un oggetto $img, e ti sincronizzi ad un
punto di repere come ad esempio l'angolo del grafico (cerchi un pixel che
sia blu, con sopra uno grigio, dietro uno grigio e davanti uno blu, e via
cosi'. Se nell'immagine "perfetta" il pixel e' a (x,y), tu cominci a fare
la ricerca usando una funzione tipo
	for ($d = 0; $d < 10; $d++)
	{
		$x1 = $X - $d; $x2 = $X + $d + 1;
		$y1 = $Y - $d; $y2 = $Y + $d + 1;
		for ($x = $x1; $x < $x2; $x++)
		{
			if (isgood($img, $x, $y1))
				return array($x, $y1);
			if (isgood($img, $x, $y2))
				return array($x, $y2);
		}
		for ($y = $y1; $y < $y2; $y++)
		{
			if (isgood($img, $x1, $y))
				return array($x1, $y);
			if (isgood($img, $x2, $y))
				return array($x2, $y);
		}
	}
	return array(-1, -1);
E a questo punto, avendo il punto di repere a (X, Y) quando nell'immagine
perfetta e' ad (X',Y'), sai che spostando le coordinate di (X'-X), (Y'-Y)
trovi la coordinata perfetta di qualsiasi cosa.
Per esempio del riquadro "Average".
Quindi inizi ad esaminare il riquadro "Average" colonna per colonna e con
lo stesso metodo visto prima (1=azzurro, 0=nero).
La macchina a stati parte con un array di candidati, per esempio
	$candidati = $simboli;
dove $simboli vale array( '0', '1', '2', ... '9', '.', 'm', 's' ... );
Se trova una colonna tutta nera va avanti, con $idx = 0 e $candidati full
optional :-)
Se trova una colonna diversa dal 000000000, per esempio 011101110, allora
esamina, per ciascun candidato, il suo elemento $idx-esimo. Se e' diverso
il candidato viene espunto da $candidati.
Qui 011101110 e' la prima colonna dell'8, e tutti gli altri candidati non
matchano. Per altre font, pero', l'8 e lo 0 potrebbero essere simili.
Se trova una colonna nera, il simbolo e' stato parsato tutto; adesso, nel
vettore $candidati c'e' un elemento, nessuno, o piu' d'uno.
Se ce n'e' piu' d'uno e' un bug di programmazione o una immagine sporca.
Se ce n'e' uno solo sei a posto :-)
Se non ce n'e' vuol dire che il simbolo non matcha niente: potresti farne
l'output a video e domandare, "keskesse'?", e apprenderlo... se fai cosi'
non ti serve neanche il lavoro con Paintbrush, ti limiti a partire con un
vettore $simboli vuoto.
All in all, una mezza giornata di bestemmie da 5 kilotoni.
Leonardo

 Ciao Gianfranzo
Quello che dici è vero, ma il problema di Muppy non è riconoscere un 
testo-purché-sia, ma si riduce a riconoscere 10 caratteri in tutto.
Vista la pagina risulta mi sembra di capire che le posizioni delle cifre 
sono fisse: bene, ancora più semplice.
L'unico problema è riconoscere la posizione della singola cifra: basta 
rilevare dove una colanna di pixel, all'interno dell'area con le cifre 
(quella in nero con i numeri celesti) è tutta nera.
Si fa in mezza giornata.
Ciao Francesco

 sono fisse: bene, ancora più semplice.
e le varianti? l'esempio è uno solo, come gestisci nello stesso spazio 
1,2,3,4 cifre e se poi compaiono decimali?
L'allineamento del "textfield" coi dati è noto?
Faresti un pattern per ogni combinazione e poi verifichi che coincide 
con le immagini proposte?
Ciao Gianfranzo


> All in all, una mezza giornata di bestemmie da 5 kilotoni.
Diciamo che ho capito l'algoritmo con funzionerebbe il tutto, ma penso
proprio di farcela: ho lavorato pochissimo col php, e meno ancora con le
librerie gd...
Grazie comunque a tutti
Andrea

 Ciao Gianfranzo
Ciao

 ha scritto nel messaggio
news:09kbivch6vqlcd6ee...@L.Serni
Reply inutile, ma 'sto messaggio me lo tengo stretto per
quando ne avrò bisogno... :-))
-- 
Valerio Granato
http://www.musicoff.com
 - Music Online For Free
La Grande Comunità Online per Musicisti

> Se le immagini sono simili il problema e' molto semplice.
Ciao, mi chiamo Andrea Mazzolari, sono il webmaster di 
www.alientech.it
 (il
sito č off line per manutenzione sul server) č un sito di medie dimensioni
dedicato a recensioni hardware, divx, masterizzazione.
Sul ng it.comp.www.php ho chiesto aiuto per la creazione di uno script che
mi estragga dei numeri da immagini come queste
http://muppy.altervista.org/cd.gif
 ed hai detto che saresti in grado di
farlo. Ti vorrei chiedere se mi puoi realizzare lo script e nel caso volessi
essere pagato, quanto mi verrebbe a costare.
Grazie
Andrea

> Se le immagini sono simili il problema e' molto semplice.
Ciao, mi chiamo Andrea Mazzolari, sono il webmaster di 
www.alientech.it
 (il


quanto mi verrebbe a costare.
Mmm. E' uno script interessante, potrebbe tornarmi utile e poi ormai mi
hai messo la voglia.
Diciamo che a me farebbe piacere mettere gli unghioni su "Php Functions
Essential Reference by Zak Greant (Editor)", che e' sulla mia Wish List
su 
www.amazon.com
. Potremmo scambiarci un regalo :-)))
Dato che io la voglia di leggere quel libro ce l'ho gia', e sul sito e'
presente una preview, questa e' l'interfaccia dello script "Non-OCR", e
anche la scusa per sostenere che questo post e' in topic <grin>:
<?
	// No PHP script ever works without this magic line:
	error_reporting(E_ALL);
	/*
		This is *NOT* an OCR, merely a pattern matcher.
		There *MUST* be a space between letters.
		Version 1.0 WITHOUT auto-alignment; images must
		be saved with Alt PrtScr or the like.
	*/
	require 'fonts.inc';
	require 'not-ocr.inc';
	// Begin the beguine. Require GIF support, unless you save
	// with PNG, that is. Which is good for your soul, anyway.
        $img = ImageCreateFromGIF('sample.gif');
	// Where to find the goodies and how to call 'em. Also how
	// are they written.
        $fields = array(
                'Speed Average' => '478,118,534,133,System',
                'Seek Random'   => '559,118,615,133,System',
                'Start Speed'   => '478,154,534,169,System',
                'Seek 1/3'      => '559,154,615,169,System',
		// The rest left as exercise to the student
        );
	// Three objects have we, three object we pass.
        $output = Crunch($img, $fields, $fonts);
	print_r($output);
	// That's all folks. It would be good manners to destroy
	// the IMG thing in order to save memory. Yeah, PHP will
	// do that for you, and let you pick up a bad habit.
	ImageDestroy($img);
?>
Le font sono descritte in fonts.inc:
...
	// Font description using a particularly space-thrifty
	// storage scheme, whose raison d'etre may be surmised
	// by rotating your head 90° clockwise :-)
                     '3'     => array(
                                          '·····#·····#···',
                                          '····##·····##··',
                                          '····#···#···#··',
                                          '····#···#···#··',
                                          '····#########··',
                                          '·····###·###···',),
...
e quando non trova un simbolo, si lamenta cosi':
// ERROR, THIS SYMBOL WAS NOT RECOGNIZED. REPLACE THE ? AND ADD
// SOMEWHERE INSIDE "fonts.inc":
                     '?'     => array(
                                          '····##·····#···',
                                          '····###····##··',
                                          '····#·##····#··',
                                          '····#··##···#··',
                                          '····#···#####··',
                                          '····#····###···',),
Leonardo semplificatore

 E' un mio vizio :-)
Proseguiamo in privato ? (
mup...@libero.it
)
Grazie!
Andrea