Autore Topic: analisi immagine statica  (Letto 2639 volte)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
analisi immagine statica
« il: 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.
se corri, morirai stanco (motto degli sniper)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:analisi immagine statica
« Risposta #1 il: 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
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:analisi immagine statica
« Risposta #2 il: 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
« Ultima modifica: 05 Giugno 2019, 18:29:36 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:analisi immagine statica
« Risposta #3 il: 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...  :-\
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re:analisi immagine statica
« Risposta #4 il: 05 Giugno 2019, 21:22:42 »
In questa maniera verifichi solo il 10% dell'immagine, l'attendibilità del risultato finale sarebbe troppo bassa.
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:analisi immagine statica
« Risposta #5 il: 05 Giugno 2019, 22:36:41 »
...io non ho capito però il principio funzionante della soluzione proposta da Gianluigi.  :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re:analisi immagine statica
« Risposta #6 il: 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. :-\
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:analisi immagine statica
« Risposta #7 il: 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?
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:analisi immagine statica
« Risposta #8 il: 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.   :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:analisi immagine statica
« Risposta #9 il: 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 .......
« Ultima modifica: 06 Giugno 2019, 18:05:36 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:analisi immagine statica
« Risposta #10 il: 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' ....
« Ultima modifica: 06 Giugno 2019, 19:26:04 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:analisi immagine statica
« Risposta #11 il: 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.
se corri, morirai stanco (motto degli sniper)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:analisi immagine statica
« Risposta #12 il: 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
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:analisi immagine statica
« Risposta #13 il: 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 ?
« Ultima modifica: 07 Giugno 2019, 01:36:54 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:analisi immagine statica
« Risposta #14 il: 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 ;-(
se corri, morirai stanco (motto degli sniper)