Newsgroup: it.comp.grafica
Titolo: sapere quanto colore è presente in una bitmap

Salve a tutti,
ho la necessità di misurare "quanto colore" sia presente in una
immagine bitmap.
Per semplicità, supponiamo di avere delle bitmap a 16 bit di 100x100
pixel.
L'obiettivo è quello di conoscere numericamente quanto rosso, quanto
verde e quanto blu sia contenuto nella bitmap.
Stò cercando di sviluppare una routine in gw-basic (evviva
l'obsoleto!) che, leggendo una bitmap da disco, mi scriva un file con
le "quantità" dei colori sopra citati.
Il mio scopo è di confrontare due rilevazioni e stabilire se c'è stato
un aumento di un colore rispetto alla campionatura precedente.
Naturalmente non sono costretto ad usare il gw-basic, ma non ho mai
imparato ad usare il VisualBasic.
Qualcuno può abbozzarmi la routine base (o l'algoritmo) per risolvere
questo problema?
Oppure: non è che qualcuno conosce un qualche softuerino già pronto e
che svolga la stessa funzione?
Tnx all!

Ho l'impressione che il problema maggiore nella tua richiesta sia trovare
una funzione che misuri il verde; il problema (grosso) è che per farlo
bisogna sapere cosa si intende per verde... una volta stabilito questo, la
soluzione dovrebbe essere abbastanza facile.
In particolare bisognerebbe sapere se ti interessa il colore del pixel
(quindi vuoi contare tutti e soli i pixel il cui colore ricade in un certo
range di verdi) oppure la componente verde di ogni pixel (anche se poi il
colore del pixel è tutt'altro che verde  per via delle eventuali altre
componenti), nel quel caso però il risultato è strattamente legato al
modello di colore che stai usando...
Qual'è esattamente la tua esigenza?

 Qual'è esattamente la tua esigenza?
Ok, non volevo scrivere un post troppo lungo, ma forse è il caso che
mi spieghi meglio.
Un sw che gira sul mio pc (WinXP/2000)in una finestra mi mostra un
pannello allarmi con delle icone. Quando si verifica un allarme,
l'icona lampeggia con un colore a seconda della gravità del problema
(in ordine: rosso,fuxia,blu,verde,giallo).
Il problema è che devo in qualche modo accorgermi di questi allarmi,
ed in particolare per i 2 allarmi più gravi: rosso e fuxia.
Naturalmente sto cercando altre soluzioni al problema, ma questa è la
via che vorrei percorrere.
Dispongo già di un programma che ciclicamente opera una videocattura;
l'idea sarebbe quella di "misurare il contenuto di rosso" di ogni
schermata, e quindi di capire se a un certo punto ci sia stato un
incremento di colore rosso o fuxia che significa che l'icona s'è
accesa per un allarme grave.
Per semplicità ho pensato di operare videocatture a 16 colori.
Se potessi quindi operare questa misura e di avere l'informazione
scritta su disco, un altro sw (sempre fatto da me) opererebbe il
confronto e sarebbe in grado di intraprendere delle azioni.
In gwbasic sono in grado di leggere byte per byte la bitmap
videocatturata, e quindi effettuare la misura che mi occorre. Però non
conosco bene come sono fatte le bitmap..
Grazie per aver risposto! ciao
, e un altro sw dovrebbe automaticamente intraprendere delle azioni

Ok, il problema è chiaro... e, non vorrei essere precipitoso, ma mi sembra
chiara anche la risposta!
Innanzi tutto i colori di allarme sono generati dal programma, quindi sono
dei colori ben precisi, definiti in RGB da tre numeri (appunto, rosso, verde
e blu). Niente di più facile quindi di sapere se un pixel è o meno "in
allarme": basta confrontare il suo colore con i 5 usati dal programma di
monitoraggio, e magari contarlo con un peso tanto più alto tanto più è grave
l'allarme. In pratica se la terna RGB del tuo pixel è uguale alla ternza RGB
di uno dei colori di allarme (che puoi trovare facendo un capture-screen con
le spie in allarme e aprendo l'immagine con un qualsiasi software che
gestisca grafica bitmap), conti il pixel di conseguenza...
Detto ciò mi viene anche da pensare che un confronto di tutti i pixel
dell'immagine sia eccessivamente oneroso: l'interfaccia del programma di
monitoraggio avrà le "spie" in dei punti ben precisi, quindi è sufficiente
che tu prenda un pixel per ogni spia...
Se c'è qualcosa che ho tralasciato, fammi sapere
Ciao
Giacomo

 che tu prenda un pixel per ogni spia...
Purtroppo è necessario "pesare" il colore rosso e fuxia (quindi
parzialmente rosso) su tutta la bitmap poichè questo sw viene
utilizzato ridotto a finestra, e la finestra non è detto che si trovi
sempre nello stesso punto.
Cmq anche se dovessi impiegare qualche secondo per analizzare tutta
l'immagine, ciò non sarebbe un problema.
Dunque, disponendo della bitmap a 16 o 256 colori (anche se al momento
ho trovato solo screencapturer a 16bit), ho la possibilità di leggere
il file byte per byte. Con quale formula posso determinare quanto
rosso ci sia in un pixel?
Reiterando l'algoritmo su tutta la bitmap avrei la soluzione del
problema.
Di nuovo grazie e ciao!

 rosso ci sia in un pixel?
Innanzi tutto bisogna sapere in che formato è la bitmap che hai per le
mani... come ti ho detto nei recedenti post, una bitmap nella sua forma più
esplicita è definita da gruppi di byte (2 per le 16 bit, 3 per le 24,
ecc...) ognuno dei quali (gruppi) rappresenta un pixel, codificandone il
colore in base al valore dei byte del gruppo e al modello colore associato.
Il problema è che non è affatto detto che questa struttura sia mantenuta
quando dall'immagine si ricava un file: il più delle volte si utilizzano
meccanismi per eliminare o ridurre i dati ridondanti, e questo anche con
immagini che si definiscono di solito "non compresse". Qualche esempio (non
sono sicurissimo dei dettagli, ma il succo si dovrebbe capire):
- un'immagine ".bmp" a 256 non memorizza per ogni pixel tre byte (R,G,B)
avendo cura di usare solo 256 combinazioni. Piuttosto per ogni pixel usa un
solo byte che indica in quale riga della tabella inclusa nel file ricercare
il colore per quel pixel. Tale tabella è fatta da coppie indice-colore, dove
colore questa volta è deifnito da una terna di byte che rappresentano i tre
valori R, G e B di quel colore.
- un'immagine ".bmp" a 24 bit non ha invece la tabella, e il file è una
sequenza di terne RGB (3 byte) che indicano direttametne il colore del
pixel.
- un'immagine ".jpg" è invece una sequenza di byte che richiede
un'elaborazione in più passaggi per ricostruire lìimmagine iniziale, della
quale si può dire ben poco da un'analisi diretta dello stream di byte.
Le immagini jpg (terzo esempio) sono compresse con un algoritmo complesso, e
ci si poteva immaginare di non poterne ricavare con immediatezza i valori
del colore di ogni pixel; come vedi però anche immagini non compresse, come
nel primo esempio, possono richiedere operazioni più complesse della
semplice lettura dei byte associati ad ogni pixel per essere analizzate (in
quel caso devi prima caricarti la tabella dei colori).
Oltre a questo devi considerare che ogni formato immagine ha una serie di
informazioni aggiuntive posizionate all'inizio, alla fine e a volte in mezzo
ai dati dei pixel veri e propri, e se non conosci tale struttura non hai
(molte) speranze di ottenre buoni risultati...
Concludendo al lunga spiegazione, quello che devi fare è:
- scegliere un formato in base alle possiilità del programma di
screen-capture e alla praticità di gestione (bmp mi semnra un buon
candidato)
- cercare (non dovresti avere problemi cercando in rete) le specifiche del
formato, in modo da sapere dove e come andare a prendere le informazioni sul
colroe dei pixel
- mettere a punto un algoritmo di misura dei colori che vuoi rilevare
Purtroppo questi tre punti sono correlati tra loro e on c'è una gerarchia
precisa. Per quelle che sono le mie approssimative conoscenze dei formati
file credo che bmp non compresso a 256 colori sia una buona soluzione (se i
256 colori ti danno noia va bene anche 16 milioni, cioè 24 bit). Poi non mi
andrei ad infognare con una misurazione della qualntità di ogni colore
presente nell'immagine, perchè come ti ho detto vai incontro a non semplici
problemi di definizione: mi limiterei invece ad un confronto diretto,
stabilendo pixel a pixel se il colore è o no uguale a uno dei colori a cui
sei interessato.
Ciao
Giacomo

 mani... 
Mi tolgo il cappello e pure il parrucchino, già che ci sono.
Senza parole ;-]
-- 
Thunor
"Tutti noi discendiamo dall'uomo delle caverne. Quasi tutti.
Alla base del mio albero genealogico c'è l'uomo delle taverne:
a volte socievole, altre volte asociale;
a volte euforico, altre cupo come il cielo prediluvio."
A.G.P.