Do you need any help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2021-22 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2021-22 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

VIDEOLEZIONI DEL CORSO DI FONDAMENTI DI PROGRAMMAZIONE AA20-21

PROGRAMMING COURSE VIDEOCONFERENCES AY20-21

HW3Bis es1: determinare le aree di pixel adiacenti

M
Matteo_Raff (1660 points)
0 1 2
asked Jul 27, 2019 in HW3bis by Matteo_Raff (1,660 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?
158 views

1 Answer

andrea.sterbini (172780 points)
513 935 1789
answered Jul 30, 2019 by andrea.sterbini (172,780 points)
Stai usando gli insiemi, vero? Sono molto efficienti sia per aggiungere che per testare l'appartenenza o per operazioni di unione e differenza