[risolto] Ricerca con find di immagini secondo pixel colorati

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
eb-ash
Prode Principiante
Messaggi: 204
Iscrizione: lunedì 18 febbraio 2019, 18:02
Sesso: Maschile

[risolto] Ricerca con find di immagini secondo pixel colorati

Messaggio da eb-ash »

Vorrei cercare delle immagini con find che abbiano una certa quantità minima di pixel e di un certo colore.

ad es. 20.000 pixel di rgb(0,0,0).
Ultima modifica di eb-ash il lunedì 25 ottobre 2021, 18:01, modificato 2 volte in totale.
si è vero uso un mac. Ma detesto i maccisti del web. Se la tirano, non ti aiutano, sono abituati ad avere la pappa fatta e non costruirsi le cose, e sono troppo pochi... quando serve non ci sono mai. Voglio imparare un po' di Bash per fare tante cose utili perchè questo sono qua... senza formazione specifica ma in fondo è unix che permette di fare le cose a pezzetti, no?
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Ricerca con find di immagini secondo pixel colorati

Messaggio da vaeVictis »

Non si può fare con il comando find.
Devi usare qualcosa tipo ImageMagick e la sua funzione convert con histogram.

Posta un'immagine del tipo che vuoi scansionare e ti indico come procedere.

Ciao.


Edit:
Visto che ancora non ti sei collegato da quando ho scritto il messaggio, ti faccio al volo un edit e ti indico come fare.
Facendo riferimento a questa immagine "guerrieri-eroici-motu-324x324.jpg"
guerri-erieroici-motu-324x324.jpg
per avere la scansione completa dei pixel, puoi dare il comando:

Codice: Seleziona tutto

$ convert guerrieri-eroici-motu-324x324.jpg -define histogram:unique-colors=true -format %c histogram:info:elencoPixel.txt
Questo comando ti stampa tutto nel file "elencoPixel.txt"
Ti viene un output abbastanza corposo, circa 3.3 MB. Sono 66347 righe del tipo:

Codice: Seleziona tutto

        12: (255,254,255) #FFFEFF srgb(255,254,255)
         1: (255,255,241) #FFFFF1 srgb(255,255,241)
         1: (255,255,242) #FFFFF2 srgb(255,255,242)
         2: (255,255,246) #FFFFF6 srgb(255,255,246)
         2: (255,255,248) #FFFFF8 srgb(255,255,248)
         3: (255,255,250) #FFFFFA srgb(255,255,250)
        11: (255,255,251) #FFFFFB srgb(255,255,251)
         4: (255,255,253) #FFFFFD srgb(255,255,253)
        26: (255,255,255) #FFFFFF white
La prima colonna è il numero di pixel, la seconda la definizione del colore in formato rgb, la terza è la definizione esadecimale, la quarta ti indica il nome del colore, se esiste, altrimenti ti riporta nuovamente la definizione rgb.
Se vuoi la stampa a video, sostituisci l'ultimo "parametro" con

Codice: Seleziona tutto

histogram:info:-
Per avere informazioni sul numero di pixel di un determinato colore, ti basta lavorare su quel comando.

Ad esempio, se vuoi un elenco di colori per cui si hanno dei nomi definiti, ti basta dare il comando:

Codice: Seleziona tutto

$ convert guerrieri-eroici-motu-324x324.jpg -define histogram:unique-colors=true -format %c histogram:info:- | grep -v "srgb"  
         6: (  0,  0,  0) #000000 black
         9: (  3,  3,  3) #030303 grey1
        20: (  5,  5,  5) #050505 grey2
        81: (  8,  8,  8) #080808 grey3
        23: ( 10, 10, 10) #0A0A0A grey4
        15: ( 13, 13, 13) #0D0D0D grey5
        15: ( 15, 15, 15) #0F0F0F grey6
         6: ( 18, 18, 18) #121212 grey7
        11: ( 20, 20, 20) #141414 grey8
        11: ( 23, 23, 23) #171717 grey9
        15: ( 26, 26, 26) #1A1A1A grey10
        12: ( 28, 28, 28) #1C1C1C grey11
        38: ( 31, 31, 31) #1F1F1F grey12
        82: ( 33, 33, 33) #212121 grey13
        53: ( 36, 36, 36) #242424 grey14
        10: ( 38, 38, 38) #262626 grey15
         1: ( 56, 56, 56) #383838 grey22
         1: ( 59, 59, 59) #3B3B3B grey23
         2: ( 66, 66, 66) #424242 grey26
         1: ( 74, 74, 74) #4A4A4A grey29
         1: ( 77, 77, 77) #4D4D4D grey30
         2: ( 79, 79, 79) #4F4F4F grey31
         1: ( 84, 84, 84) #545454 grey33
         1: ( 87, 87, 87) #575757 grey34
         2: ( 89, 89, 89) #595959 grey35
         1: ( 92, 92, 92) #5C5C5C grey36
         1: ( 94, 94, 94) #5E5E5E grey37
         1: ( 99, 99, 99) #636363 grey39
         1: (105,105,105) #696969 DimGray
         1: (107,107,107) #6B6B6B grey42
         1: (110,110,110) #6E6E6E grey43
         1: (115,115,115) #737373 grey45
         3: (122,122,122) #7A7A7A grey48
         1: (125,125,125) #7D7D7D grey49
         1: (126,126,126) #7E7E7E gray
         3: (127,127,127) #7F7F7F grey50
         2: (128,128,128) #808080 fractal
         2: (130,130,130) #828282 grey51
         1: (133,133,133) #858585 grey52
         1: (135,135,135) #878787 grey53
         1: (140,140,140) #8C8C8C grey55
         1: (166,166,166) #A6A6A6 grey65
         1: (176,176,176) #B0B0B0 grey69
         1: (178, 34, 34) #B22222 firebrick
         1: (184,184,184) #B8B8B8 grey72
         1: (199,199,199) #C7C7C7 grey78
         1: (217,217,217) #D9D9D9 grey85
         1: (220,220,220) #DCDCDC gainsboro
         1: (227,227,227) #E3E3E3 grey89
         2: (232,232,232) #E8E8E8 grey91
         2: (240,240,240) #F0F0F0 grey94
         3: (240,255,255) #F0FFFF azure
         3: (245,245,245) #F5F5F5 grey96
         2: (247,247,247) #F7F7F7 grey97
         1: (248,248,255) #F8F8FF GhostWhite
         1: (250,250,250) #FAFAFA grey98
         7: (252,252,252) #FCFCFC grey99
         2: (255,250,250) #FFFAFA snow
        26: (255,255,255) #FFFFFF white
Se, come chiedi, vuoi informazioni circa il bianco (white):

Codice: Seleziona tutto

$ convert guerrieri-eroici-motu-324x324.jpg -define histogram:unique-colors=true -format %c histogram:info:- | sed -n  '/white/p'
        26: (255,255,255) #FFFFFF white
Una volta che hai questa informazione, puoi estrarre il numero di pixel, confrontarlo con il tuo valore di soglia e individuare i file che ti interessano.

Generalizzando, con l'introduzione di variabili appropriate, puoi ottenere una cosa del genere:
1) imposto la variabile per il colore

Codice: Seleziona tutto

colorToSearch=white
2) imposto una soglia per il numero di pixel, superata la quale mi interessa l'immagine

Codice: Seleziona tutto

treshold=200
3) do il comando

Codice: Seleziona tutto

find -maxdepth 1 - type f -iname "*jpg" | while read filePath; 
do
    pixelsCount="$(convert "$filePath" -define histogram:unique-colors=true -format %c histogram:info:- |  sed -n  "s/^[ ]*\([0-9]*\).*$colorToSearch.*/\1/p")"
    [[ "$pixelsCount" -gt "$treshold" ]] && echo "$pixelsCount - $filePath"
done
e ottengo un output del tipo

Codice: Seleziona tutto

295 - ./vmask.jpg
431 - ./mastersoftheuniverse-revelation.jpg
Il senso del comando è: cercami (con find) tutte le immagini con estensione (case insensitive) del tipo jpg. Per ogni immagine fai l'istogramma dei colori, con il comando convert, prendi il numero di pixel relativi al colore "colorToSearch" che mi interessa, schiaffalo nella variabile "pixelCount" e se questo numero è maggiore della soglia "treshold" comunicami il numero di pixel che hai trovato e il path dell'immagine in cui li hai trovati.

Nota bene
Dal momento che l'istruzione che ti va a selezionare il numero di pixel dall'output di convert in buona sostanza è questa:

Codice: Seleziona tutto

sed -n  "s/^[ ]*\([0-9]*\).*$colorToSearch.*/\1/p"
puoi specificare il colore usando il nome, se è un colore che ha un nome, ma anche semplicemente usando il suo formato in rgb o in esadecimale (con le lettere maiuscole).
Facendo sempre l'esempio del bianco, va bene anche:

Codice: Seleziona tutto

colorToSearch=255,255,255
oppure

Codice: Seleziona tutto

colorToSearch=#FFFFFF
Ultima modifica di vaeVictis il lunedì 25 ottobre 2021, 23:48, modificato 2 volte in totale.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
eb-ash
Prode Principiante
Messaggi: 204
Iscrizione: lunedì 18 febbraio 2019, 18:02
Sesso: Maschile

Re: Ricerca con find di immagini secondo pixel colorati

Messaggio da eb-ash »

Wow, che guida!

Scusami, Vae non ho risposto subito perchè avevo dei problemi con l'installazione con Brew perchè è cambiato qualcosa da un anno... e mi infatti mi dà un errore:


dyld: lazy symbol binding failed: Symbol not found: _clock_gettime
Referenced from: /Users/EB/Applications/ImageMagick-7.0.10/lib//libMagickCore-7.Q16HDRI.8.dylib
Expected in: /usr/lib/libSystem.B.dylib

dyld: Symbol not found: _clock_gettime
Referenced from: /Users/EB/Applications/ImageMagick-7.0.10/lib//libMagickCore-7.Q16HDRI.8.dylib
Expected in: /usr/lib/libSystem.B.dylib

Trace/BPT trap: 5
si è vero uso un mac. Ma detesto i maccisti del web. Se la tirano, non ti aiutano, sono abituati ad avere la pappa fatta e non costruirsi le cose, e sono troppo pochi... quando serve non ci sono mai. Voglio imparare un po' di Bash per fare tante cose utili perchè questo sono qua... senza formazione specifica ma in fondo è unix che permette di fare le cose a pezzetti, no?
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Ricerca con find di immagini secondo pixel colorati

Messaggio da vaeVictis »

Figurati, non c'è mica un timer per le risposte :)
Comunque, ho dimenticato di dirti che con opportune modifiche puoi cercare anche il numero dei pixel totali associati alle varie sfumature di bianco, o di grigio, e via dicendo.
Volendo, puoi anche ottenere le coordinate dei pixel del colore/dei colori che ti interessa/no all'interno dell'immagine.
Per questioni più complesse, come la rilevazione di figure geometriche o cose analoghe, si deve invece ricorrere a librerie più sofisticate.

Per il problema con Brew, ti conviene aprire una discussione apposita.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
eb-ash
Prode Principiante
Messaggi: 204
Iscrizione: lunedì 18 febbraio 2019, 18:02
Sesso: Maschile

Re: Ricerca con find di immagini secondo pixel colorati

Messaggio da eb-ash »

Fatta, intanto ti ringrazio moltissimo che spero di poter utilizzare quanto prima se riesco a risolvere il problema dell'installazione.
si è vero uso un mac. Ma detesto i maccisti del web. Se la tirano, non ti aiutano, sono abituati ad avere la pappa fatta e non costruirsi le cose, e sono troppo pochi... quando serve non ci sono mai. Voglio imparare un po' di Bash per fare tante cose utili perchè questo sono qua... senza formazione specifica ma in fondo è unix che permette di fare le cose a pezzetti, no?
Avatar utente
eb-ash
Prode Principiante
Messaggi: 204
Iscrizione: lunedì 18 febbraio 2019, 18:02
Sesso: Maschile

Re: Ricerca con find di immagini secondo pixel colorati

Messaggio da eb-ash »

vaeVictis ha scritto:
lunedì 25 ottobre 2021, 0:18
Figurati, non c'è mica un timer per le risposte :)
Comunque, ho dimenticato di dirti che con opportune modifiche puoi cercare anche il numero dei pixel totali associati alle varie sfumature di bianco, o di grigio, e via dicendo.
Volendo, puoi anche ottenere le coordinate dei pixel del colore/dei colori che ti interessa/no all'interno dell'immagine.
Per questioni più complesse, come la rilevazione di figure geometriche o cose analoghe, si deve invece ricorrere a librerie più sofisticate.

Per il problema con Brew, ti conviene aprire una discussione apposita.
Reinstallato da repository, volevo ringraziarti, @Vae. Perchè i comandi che mi hai postato sono perfetti. Davvero, c'è quanto desiderato e di più per sbizzarirsi... Grazie infinite! :clap: :clap: :bounce: :bounce:
si è vero uso un mac. Ma detesto i maccisti del web. Se la tirano, non ti aiutano, sono abituati ad avere la pappa fatta e non costruirsi le cose, e sono troppo pochi... quando serve non ci sono mai. Voglio imparare un po' di Bash per fare tante cose utili perchè questo sono qua... senza formazione specifica ma in fondo è unix che permette di fare le cose a pezzetti, no?
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [risolto] Ricerca con find di immagini secondo pixel colorati

Messaggio da vaeVictis »

Non c'è di che.
Ah, ho dimenticato di dire che ho notato, dopo aver scritto il mio messaggio , che tu chiedevi i pixel neri mentre ho fatto l'esempio coi pixel bianchi.

Considera che se usi awk puoi tranquillamente fare la somma di tutti i pixel associati a vari colori, o a tutti i tipi di grigio o di bianco e via dicendo.
Divertiti anche per me :)
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [risolto] Ricerca con find di immagini secondo pixel colorati

Messaggio da vaeVictis »

vaeVictis ha scritto:
martedì 26 ottobre 2021, 18:32
Considera che se usi awk puoi tranquillamente fare la somma di tutti i pixel associati a vari colori, o a tutti i tipi di grigio o di bianco e via dicendo.
Quando ho scritto, non avevo modo di postarti anche un comando per farti un esempio.
Per contare tutti i pixel delle varie sfumature di grigio nell'immagine allegata qualche messaggio più su, puoi dare un comando del genere:

Codice: Seleziona tutto

$ convert guerrieri-eroici-motu-324x324.jpg -define histogram:unique-colors=true -format %c histogram:info:-  | awk  '$NF ~ /grey/ { sum+=$1} END {print sum}'
454
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
eb-ash
Prode Principiante
Messaggi: 204
Iscrizione: lunedì 18 febbraio 2019, 18:02
Sesso: Maschile

Re: [risolto] Ricerca con find di immagini secondo pixel colorati

Messaggio da eb-ash »

Vae, è molto interessante anche questo awk. Anche il while. , perché lo userò per imparare a usare i cicli, che non sn ancora riuscito ad usare nelle mie ricerche.

Il bianco, l'vevo visto ma lo so, viene spontaneo pensare allo zero come assenza di colore, come avviene nel CMYK, invece l'RGB è sottrattivo come nella luce naturale, vedi la ruota di Newton che ha tutti i colori e se gira diventa bianca. Sono grafico, se avrai bisogno in tal senso puoi chiedermi. Altro non so per contraccambiare!
si è vero uso un mac. Ma detesto i maccisti del web. Se la tirano, non ti aiutano, sono abituati ad avere la pappa fatta e non costruirsi le cose, e sono troppo pochi... quando serve non ci sono mai. Voglio imparare un po' di Bash per fare tante cose utili perchè questo sono qua... senza formazione specifica ma in fondo è unix che permette di fare le cose a pezzetti, no?
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: dalca e 12 ospiti