Velocizzare imagecolorsforindex su 700 foto

di il
3 risposte

Velocizzare imagecolorsforindex su 700 foto

Buongiorno a tutti

Io fotografo dei libri su un tavolo bianco. Intorno al libro c'è sempre quindi del bianco
poi scatto una foto completamente nera
e passo al libro successivo.
La foto nera mi serve per separare i libri

Si tratta quindi di riconoscere la foto nera.
Prendo l'rbg dei punti estremi dei 4 lati che sicuramente sono bianchi (prossimamente a 255/255/255/255) al contrario di una foto nera che è poco più di 0/0/0/0/
(Tra l'altro ho scoperto con questa roba che il nero assoluto non esiste... per quello che all'inizio cercavo lo 0 e non lo ottenevo mai...)

Il programma che ho scritto funziona sì, ma su 700 foto ad esempio impiega parecchi minuti.
Per velocizzare un po' di più faccio prima un controllo sul pixel dell'angolo in basso a destra che è sempre bianco, o comunque mai scuro, se lo vede bianco allora salta il ciclo e passa all'altro.
In tutta sincerità non so, sempre se fa, renderlo più veloce.
è tutto il giorno che guardo il manuale su queste funzioni

(l'echo non è importante, mi interesserebbe solo la velocità di calcolo perché di visuale non deve avere nulla)

ini_set('memory_limit', '-1');
$percorso = $_SERVER["DOCUMENT_ROOT"]."/FOTO_PROVA_NERO2/";
        $array_file = array_diff(scandir($percorso), array('..', '.'));
        natsort($array_file);

foreach($array_file as $nome_file){
	$dimensioni_foto = getimagesize($percorso."/".$nome_file);
	$foto = imagecreatefromjpeg($percorso."/".$nome_file);
	
		$RGB_maxmax = imagecolorsforindex($foto, imagecolorat($foto, $dimensioni_foto[0]-1, $dimensioni_foto[1]-1));
		if(($RGB_maxmax["red"]+$RGB_maxmax["green"]+$RGB_maxmax["blue"])>100){
			continue;
		}else{
			$RGB_00 = imagecolorsforindex($foto, imagecolorat($foto, 0, 0));
			$RGB_max0 = imagecolorsforindex($foto, imagecolorat($foto, $dimensioni_foto[0]-1, 0));
			$RGB_0_max = imagecolorsforindex($foto, imagecolorat($foto, 0, $dimensioni_foto[1]-1));
			
			$res = $RGB_00["red"]+$RGB_00["green"]+$RGB_00["blue"]+
			$RGB_max0["red"]+$RGB_max0["green"]+$RGB_max0["blue"]+
			$RGB_0_max["red"]+$RGB_0_max["green"]+$RGB_0_max["blue"]+
			$RGB_maxmax["red"]+$RGB_maxmax["green"]+$RGB_maxmax["blue"];
			
			if($res<100){
				echo "La foto è nera";
			}
		}
}

3 Risposte

  • Re: Velocizzare imagecolorsforindex su 700 foto

    Non è argomento interessante
  • Re: Velocizzare imagecolorsforindex su 700 foto

    È abbastanza complicato, si parla di memoria (può anche darsi che php linguaggio interpretato usi eccessivamente memoria rispetto al suo contesto per le funzioni scandir/imagecolorsforindex) e tempo di calcolo.
    Se è per scopo personale e sei sicuro del tuo ambiente, crea una sorta di file.txt che contenga tutti i percorsi, se caricato (solo via php) e a ogni percorso aggiungi se bianco (valore stringa 1) o no (valore stringa 0).
    Altresi se caricato, assicurati che inizialmente è su stringa vuota e se è leggibile da php gli dai valore stringa '1', altrimenti rimarrà stringa vuota. (Questo intendo sicuro del tuo ambiente).
    Giustamente crea funzioni definite dall'utente (dal tuo codice php), per aggiungi/rimuovi file (se da rimuovere nel file.txt inziazialmente stringa -1, dopo la corretta rimozione dal filesytem cancella quel dato dal file.txt). (Questo intendo sicuro del tuo ambiente)
    Così è come se stai creando una cache per la funzione scandir, imagecolorsforindex per futuri usi successivi (cioè dopo la prima esecuzione e se non presente il file.txt).
    Esempio file txt: [CODE]/my_path/my_file.jpg,1,1 /my_path/my_file2.jpg,1,0 O invece di txt lo crei in formato csv (dovrà contenere tre campi)
    https://www.php.net/manual/en/function.fgetcsv.ph
    Giustamente è più veloce se non ordinato, (in php, C non esiste scrivere da x puntatore ma bensì inizio o fine "pratica comunemente usata").
  • Re: Velocizzare imagecolorsforindex su 700 foto

    Le foto spero abbiano un ordine logico nei nomi file,
    se sì, lancia il processo in parallelo, il computer ha più core, lancia più thread (uno per immagine).

    Io come algoritmo farei così:
    1> lancio un processo di analisi per ogni file (con uno script shell o con uno script php che invochi la exec) in modo che esegua in parallelo
    2> se il file è una pagina nera (ti consiglio di calcolare il valore medio dei pixel della pagina (o quantomeno di una sezione non piccolissima, diciamo 20x20px) , così na non richiare outlier (es il pixel della fotocamera fallato o il banale rumore)
    3> se la pagina è nera, rinomino il file aggiungendo "_N" alla fine
    4> faccio un ciclo sui nomi file (decisamente più rapido) che copi i file sequenzialmente nelle cartelle che rappresentano il "libro"

    Se ti va di spingerti a fondo nella codifica jpeg, potresti cercare (o scrivere) una libreria che ti consente di leggere il file jpeg "grezzo", cercare il coefficiente in continua della DCT (che rappresenta il valor medio della luminosità) e fare il controllo del "nero" basandoti su quello.
Devi accedere o registrarti per scrivere nel forum
3 risposte