Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

HW3Bis es1: determinare le aree di pixel adiacenti

M
Matteo_Raff (1660 points)
0 1 2
in HW3bis by (1.7k points)
Lavorando all'esercizio 1 dell'homework 3bis ho riscontrato alcune difficoltà nel determinare le aree di pixel adiacenti del colore richiesto.
In pratica, sono in grado di distinguere singolarmente i pixel di un dato colore ma nel momento in cui devo "raggrupparli" per definire quelle delle varie aree sia la più grande, tutti i metodi che ho provato risultano si funzionali ma terribilmente inefficienti.
Attualmente la soluzione che sono riuscito ad escogitare funziona come segue:
dopo aver importato l'immagine con la funzione 'load' ed aver effettuato un primo scorrimento (per riga e per colonna) per determinare quali pixel siano del colore desiderato, aggiungendoli ad una apposita 'lista_pixel' (così da non dover più scorrere l'intera immagine successivamente) e creando per ognuno di tali pixel una voce in un apposito dizionari avente come chiave la coordinata del pixel (riga=x, colonna=y) e come valore ad essa associato la lista di tutti i pixel adiacenti dello stesso colore [(x,y+1),(x+1,y),(x,y-1),(x-1,y)].

Terminato lo scorrimento dell'immagine e la raccolta di tali dati, si passa alla fase "critica", ossia il raggruppamento dei pixel adiacenti.

Fondamentalmente vado a creare una nuova lista ('lista_2') avente come primo elemento il primo pixel di 'lista_pixel' e la espando aggiungendo ad essa tutti i pixel adiacenti (che ho già precedentemente raccolto nel dizionario). Su ognuno dei pixel aggiunti a 'lista_2' viene poi iterato tale procedimento espandendo la lista a tutti e soli i pixel adiacenti. Ovviamente, per non considerare più volte la stessa aera, tutti i pixel analizzati vengono rimossi da 'lista_pixel'. Il procedimento termina quando non ci sono più pixel adiacenti; la lista viene salvata e si passa all'elemento successivo in 'lista_pixel'.

So che il punto debole di tale procedimento sta nel fatto che la lista che vado ad espandere di volta in volta ('lista_2') con i vari pixel adiacenti subisce di volta in volta un incremento considerevole (fino a quattro elementi in più per ogni pixel analizzato) e ciò causa ritardi considerevoli in fase di esecuzione.
In particolare sono i test con aree di pixel adiacenti molto grandi a mettere in crisi questo modus operandi.

Ho già cercato idee alternative (ho anche provato ad eliminare la fase di creazione del dizionario, andando a ricercare i pixel adiacenti direttamente in fase di determinazione dell'area dei pixel adiacenti, ma le prestazioni sono nettamente calate!) ma nessuna è era buona, risultando più lenta e talvolta anche non corretta, generando risultati errati durante i test.

Mi vedo quindi costretto a chiedere un consiglio:l'idea è buona e sbaglio io ad implementarla o è il ragionamento che proprio non può funzionare?
302 views

1 Answer

andrea.sterbini (207940 points)
756 1270 2377
by (208k points)
Stai usando gli insiemi, vero? Sono molto efficienti sia per aggiungere che per testare l'appartenenza o per operazioni di unione e differenza