Gambas-it

Gambas3 => Programmazione => Topic aperto da: allegfede - 05 Giugno 2019, 12:21:10

Titolo: analisi immagine statica
Inserito da: allegfede - 05 Giugno 2019, 12:21:10
dovendo fare una piccola applicazione che faccia una analisi di massima su una immagine (catturata dalla raspi-camera), mi chiedevo se convenisse:
A) gestire la visualizzazione dell'immagine e l'analisi del contenuto con le risorse interne di GAMBAS
B) utilizzare OpenCV e usare Gambas per il solo "report"

Opinioni?

PS: al momento si tratta di capire il "colore" dominante nell'immagine. No pattern recognition o analisi esoteriche.
Titolo: Re:analisi immagine statica
Inserito da: Gianluigi - 05 Giugno 2019, 14:44:08
Lo devi decidere tu dopo aver guardato cosa ti offre la classe image:
http://gambaswiki.org/wiki/comp/gb.qt4/image
Titolo: Re:analisi immagine statica
Inserito da: allegfede - 05 Giugno 2019, 18:24:39
mah, io pensavo di convertire il seguente codice java script in una classe gambas:
https://github.com/lokesh/color-thief/blob/master/src/color-thief.js

ma anche questo aritcolo e' interessante:
https://code.likeagirl.io/finding-dominant-colour-on-an-image-b4e075f98097
Titolo: Re:analisi immagine statica
Inserito da: Gianluigi - 05 Giugno 2019, 20:02:16
Non so se ci sono metodi più semplici, a me sono venute in mente un paio di soluzioni che andrebbero verificate.
Entrambe basate su questo codice:
http://www.gambas-it.org/smf/index.php?topic=6188.msg43395#msg43395
Siccome ciclare tutta l'immagine pixel per pixel è una cosa lenta occorrono degli escamotage uno potrebbe essere:

Codice: [Seleziona]
For X = 0 To PictureBox1.Picture.Width Step 10
    For Y = 0 To PictureBox1.Picture.Height Step 10
      iColor = PictureBox1.Picture.Image[X, Y]
      r += Color[iColor].Red
      g += Color[iColor].Green
      b += Color[iColor].Blue
    Next
  Next
L'altro quello di ridurre una copia di immagine con Image.Stretch salvarla importarla ciclarla tutta e eliminarla.

Buon divertimento.

Di più non so...  :-\
Titolo: Re:analisi immagine statica
Inserito da: Top Fuel - 05 Giugno 2019, 21:22:42
In questa maniera verifichi solo il 10% dell'immagine, l'attendibilità del risultato finale sarebbe troppo bassa.
Titolo: Re:analisi immagine statica
Inserito da: vuott - 05 Giugno 2019, 22:36:41
...io non ho capito però il principio funzionante della soluzione proposta da Gianluigi.  :-\
Titolo: Re:analisi immagine statica
Inserito da: Top Fuel - 05 Giugno 2019, 22:45:34
Ho provato a fare anche io una cosa del genere su una immagine grande per vedere i tempi ma non mi restituisce nulla. :-\
Titolo: Re:analisi immagine statica
Inserito da: Gianluigi - 05 Giugno 2019, 23:12:07
In questa maniera verifichi solo il 10% dell'immagine, l'attendibilità del risultato finale sarebbe troppo bassa.

No verifico ogni 10 pixel la percentuale è data dalla grandezza dell'immagine.
Sono d'accordo che non da garanzie di precisione.
L'altro sistema dovrebbe essere invece preciso.

...io non ho capito però il principio funzionante della soluzione proposta da Gianluigi.  :-\

allegfede dice:
Citazione
al momento si tratta di capire il "colore" dominante nell'immagine

Se il risultato di rosso è maggiore di quello verde e blu il colore dominante dell'immagine è il rosso.
Oppure sto sbagliando ragionamento?
Titolo: Re:analisi immagine statica
Inserito da: vuott - 05 Giugno 2019, 23:48:26
Se il risultato di rosso è maggiore di quello verde e blu il colore dominante dell'immagine è il rosso.
Oppure sto sbagliando ragionamento?
Credo vada bene solo se lui voglia ottenere il dominante fra i tre colori del RGB.   :-\
Titolo: Re:analisi immagine statica
Inserito da: allegfede - 06 Giugno 2019, 17:55:07
se uno volesse essere esaustivo dovrebbe fare un vettore dei 16 milioni di colori, scansionare tutti i pixel e ogni volta che si incontra un pixel dell'N-esimo colore ( e sarebbe anche da capire come ordinare questo vettore/matrice), si aggiunge 1.
alla fine il colore (la casellina del vettore) con il valore piu' grande, sarebbe il colore dominante.

Pero' e' ovviamente dispendioso e penso poco efficiente.

E' per questo che penso vengano usati i "clusters", ma in gambas non mi sembra che ci siano librerie che li implementano .....

https://stackoverflow.com/questions/3241929/python-find-dominant-most-common-color-in-an-image

NB: c'e il metodo image.pixels che e' interessante:
Citazione
Image.Pixels (gb.image)

Property Pixels As Integer[]

DAL 3.5
Return the image pixels colors as an array of 32 bits integers.

se fosse possibile fare un "istogramma" di questo array .......
Titolo: Re:analisi immagine statica
Inserito da: allegfede - 06 Giugno 2019, 18:43:09
anche questo codice mi piace ....

Codice: [Seleziona]
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QPixmap pixmap("logo.png");
    QImage image = pixmap.toImage();
    QRgb col;
    QMap<QRgb,int> rgbcount;
    QRgb greatest = 0;

    int width = pixmap.width();
    int height = pixmap.height();

    int count = 0;
    for (int i = 0; i < width; ++i)
    {
        for (int j = 0; j < height; ++j)
        {
            col = image.pixel(i, j);
            if (rgbcount.contains(col)) {
                rgbcount[col] = rgbcount[col] + 1;
            }
            else  {
                rgbcount[col] = 1;
            }

            if (rgbcount[col] > count)  {
                greatest = col;
                count = rgbcount[col];
            }

        }
    }
    qDebug() << count << greatest;
    return app.exec();
}

interessante il metodo: rgbcount.contains(col) che dato un valore, ci dice se e' presente nella matrice e' veramente utile e penso sia lo stesso di .Exist dei vettori in gambas.

mi piace che nella scansione sia fatto contemporaneamente lo "stacking" dei colori e l'indicizzazione di quello che e' piu' presente.
in questo modo si mantiene la linearita' del metodo (x*y)

L'unico problema e' che contrariamente a python, se uso un vettore "generico", non posso usare come indice un valore che nel vettore NON esiste gia' ....
Titolo: Re:analisi immagine statica
Inserito da: allegfede - 06 Giugno 2019, 19:32:25
provando a forzare l'inserimento dell'elemento di indice "ColoreDelPixel" e' ovviamente inutile, se non ci sono gli elementi a sufficienza.
Titolo: Re:analisi immagine statica
Inserito da: allegfede - 06 Giugno 2019, 20:53:13
lento, lentissimo ......

ho ridimensionato l'immagine a 640x480 ma ci mette una vita .....

barando un po' ho utilizzato image magic :D
Titolo: Re:analisi immagine statica
Inserito da: vuott - 07 Giugno 2019, 01:35:54
se uno volesse essere esaustivo dovrebbe fare un vettore dei 16 milioni di colori, scansionare tutti i pixel e ogni volta che si incontra un pixel dell'N-esimo colore ( e sarebbe anche da capire come ordinare questo vettore/matrice), si aggiunge 1.
alla fine il colore (la casellina del vettore) con il valore piu' grande, sarebbe il colore dominante.

Pero' e' ovviamente dispendioso e penso poco efficiente.
In un'immagine a 32 bit il pixel è ovviamente formato da... 32 bit (bits per pixel), ossia 4 byte, corrispondente insomma al tipo di dato "Integer".
Più in particolare ogni pixel è formato dai colori Red-Green-Blue + il canale Alfa: standard RGBA (in gambas questo standard è invertito, cfr: http://gambaswiki.org/wiki/comp/gb.qt4/color ).

Dunque mi pare di capire che a te non interessa il singolo byte costitutivo del pixel, bensì il pixel in quanto tale.

Non capisco perché dici che sarebbe necessario fare un vettore dei 16 milioni di colori.  ???

Questa risorsa:
NB: c'e il metodo image.pixels che e' interessante:
Image.Pixels (gb.image)

Property Pixels As Integer[]

DAL 3.5
Return the image pixels colors as an array of 32 bits integers.
non potrebbe andare bene ?
Titolo: Re:analisi immagine statica
Inserito da: allegfede - 07 Giugno 2019, 16:31:19
l'array di 16 milioni di colori e' perche' il metodo in python usa il valore del colore come INDICE del vettore, ed il contenuto di quel vettore e' QUANTE VOLTE e' stato incontrato un pixel di quel colore.

ma e' lento ....

image magick ha risolto :D

pero' ho barato ;-(
Titolo: Re:analisi immagine statica
Inserito da: vuott - 07 Giugno 2019, 16:50:20
image magick ha risolto :D

pero' ho barato ;-(

...exactement !
A che ti serve a 'sto punto gambas ?
Titolo: Re:analisi immagine statica
Inserito da: vuott - 07 Giugno 2019, 17:00:55
...potresti fare una prova con il Metodo " .Find( ) " dell'array.  (https://www.emoticonsignificato.it/img/emojis/thinking-face_1f914.png)
Titolo: Re:analisi immagine statica
Inserito da: allegfede - 07 Giugno 2019, 19:42:40
provero' .. ma ho l sospetto che l'accesso a basso livello in C di image magic sia quasi inarrivabile ....
Titolo: Re:analisi immagine statica
Inserito da: vuott - 08 Giugno 2019, 01:27:24
provero' .. ma ho l sospetto che l'accesso a basso livello in C di image magic sia quasi inarrivabile ....

...allora impara il C !   :D
Titolo: Re:analisi immagine statica
Inserito da: allegfede - 11 Giugno 2019, 16:57:06
ed abbandonare voi?

gia' per lavoro ho dovuto imparare Java ..... :-(

ora mi propongono lavori in c# (non sia mai!).

Se devo proprio mi butto sul c++ ... ma devo dire che i puntatori mi stanno sulle balle :D
Titolo: Re:analisi immagine statica
Inserito da: vuott - 11 Giugno 2019, 17:43:08
...ma devo dire che i puntatori mi stanno sulle balle

Ti stavo scrivendo una noiosa spiegazione, ma preferisco usare un banale esempio.

Se io scrivo all'interno di una lunga serie di caselle:

 ......|a|b|c|......

e poniamo che il dato "a" si trova alla cella num. 444 (un numero a caso solo esemplificativo):

1) Se ti dico, le tre lettere, che devi leggere, comincia a leggerle dalla casella num. 444, ...io che cosa ho fatto ?
Ti ho passato l'indirizzo della cella di memoria, DALLA QUALE devi cominciare a leggere quelle letterine.
Io sono un "Puntatore".
E cosa farai tu ? Tu leggerai "a", poi "b", poi "c".

2) Se io ti dico, le tre lettere, che devi leggere, comincia a leggerle dalla casella num. 444 + 1 (ossia indice 1), e quindi num. 445.
Cosa ho fatto io ? ...aritmetica dei Puntatori.
E cosa farai tu ? Tu leggerai "b", poi "c" e poi... l'altro dato che sarà presente alla casella num. 444 + 3 (ossia indice 3), che però noi non conosciamo.

Quindi il Puntatore ti permette, aggiungendo e sottraendo numeri al valore dell'indirizzo di memoria da esso contenuto, di spostarti nella memoria (così come fai con un array o un file, tant'è che in modo semplificato esiste anche la forma zuccherina:  variabile_puntatore[index]).

Cosa c'è di taaaaaanto difficile nei Puntatori ?
Titolo: Re:analisi immagine statica
Inserito da: Gianluigi - 11 Giugno 2019, 17:57:03
Come sempre la simpatia di allegfede ispira vuott, grazie  :D
Ma soprattutto grazie a vuott per la bella spiegazione  :D :D
Titolo: Re:analisi immagine statica
Inserito da: Top Fuel - 11 Giugno 2019, 21:25:14
ma devo dire che i puntatori mi stanno sulle balle :D

Se programmavi su un Commodore 64 cosa facevi, ti buttavi nel primo fiume in piena? :D :D
Titolo: Re:analisi immagine statica
Inserito da: vuott - 12 Giugno 2019, 00:28:22
Ma soprattutto grazie a vuott per la bella spiegazione

...per chi non ha capito, sui Puntatori ho anche la spiegazione chiamata: "la bella signorina"; ma immagino che avete tutti capito la mia precedente spiegazione. :devil:
Titolo: Re:analisi immagine statica
Inserito da: kicco - 12 Giugno 2019, 11:27:21
Citazione
... ho anche la spiegazione chiamata: "la bella signorina"...
dai! dai! spiega!
 ;D
Titolo: Re:analisi immagine statica
Inserito da: vuott - 12 Giugno 2019, 12:27:47
Oh, basta gettare la giusta rete e qualcuno sempre ci va dentro.  :devil: