python tutorial come posso trovare ed eliminare sezioni sovrapposte di un'immagine da un elenco?



read png as numpy array (1)

Ho diviso un'immagine in oggetti (sezioni) usando il metodo gentilmente contribuito da unutbu e Joe Kington a questa domanda: rettangolo di delimitazione attorno ai blob in un'immagine monocromatica usando python e avere un elenco di questi oggetti che assume la forma seguente:

the_blobs = [(slice(dy.start, dy.stop, None), slice(dx.start, dx.stop, None))]

dy.start fornisce il valore iniziale del pixel y e dy.stop fornisce il valore finale del pixel y, e lo stesso accordo per dx.

All'interno della lista ci sono alcuni oggetti che si sovrappongono, vale a dire un oggetto minuscolo (un quadrato) si trova all'interno di un oggetto più grande come un cerchio. Quando ciò accade, voglio rimuovere l'oggetto "incluso" dall'elenco (perché il cerchio lo ha già incluso) ad es

lista corrente

the_blobs = [(slice(100L, 1000L, None), slice(100L, 1000L, None)), 
(slice(150L, 220L, None), slice(150L, 220L, None)), 
(slice(1001L, 2000L, None), slice(1500L, 1700L, None)),
(slice(2001L, 2200L, None), slice(1800L, 1890L, None))] 

lista ideale (con oggetto rimosso)

the_blobs = [(slice(100L, 1000L, None), slice(100L, 1000L, None)), 
(slice(1001L, 2000L, None), slice(1500L, 1700L, None)),
(slice(2001L, 2200L, None), slice(1800L, 1890L, None))] 

Devo notare che, come parte della domanda di cui sopra, è stato suggerito di utilizzare il seguente codice:

data_slices = ndimage.find_objects(coded_paws)
for s in data_slices:
    filled[s] = True
coded_paws, num_paws = ndimage.label(filled)
data_slices = ndimage.find_objects(coded_paws)  

Tuttavia questo non sembra funzionare il 100% delle volte, ed è stato davvero un contributo leggermente oltre la portata della domanda originale, quindi sto riaprendo questa parte come una domanda specifica e separata.

Qualche idea su come posso ottenere questo?

EDIT: Ecco un esempio di immagine reale che non funziona con il codice precedente

elaborando questo ritorna

e

Idealmente mi piacerebbe rimuovere l'ultima immagine dalla lista delle fette


Ovviamente è possibile adottare un approccio O (n ^ 2) che controlla ciascun blob rispetto a tutti gli altri blob e determina se deve essere rimosso controllando se blob1.dx.start > blob2.dx.start and blob1.dy.start > blob2.dy.start and blob1.dx.stop < blob2.dx.stop and blob1.dy.stop < blob2.dy.stop (se questa condizione è vera, è corretto rimuovere blob1 dall'elenco). Se il numero totale di blob è piuttosto basso, questo dovrebbe funzionare a meno che non mi manchi qualcosa.

Se stai cercando una soluzione ottimizzata, sarebbe utile sapere quanti blob ci sono e quanto è comune la condizione.





scipy