¿Cómo puedo encontrar y eliminar los segmentos superpuestos de una imagen de una lista?

He dividido una imagen en objetos (cortes) utilizando el método amablemente contribuido por unutbu y Joe Kington en esta pregunta: Cuadro de límite rectangular alrededor de manchas en una imagen monocromática usando python y tengo una lista de estos objetos que toma la siguiente forma:

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

dy.start da el valor inicial de y-pixel y dy.stop da el valor final de y-pixel, y la misma oferta para dx.

Dentro de la lista hay algunos objetos que se superponen, es decir, un objeto pequeño (un cuadrado) está dentro de un objeto más grande, como un círculo. Cuando esto ocurra, quiero eliminar el objeto “encerrado” de la lista (porque el círculo ya lo tiene incluido) por ejemplo

lista actual

 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 ideal (con objeto eliminado)

 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))] 

Debo señalar que como parte de la pregunta mencionada anteriormente, se sugirió utilizar el siguiente código:

 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) 

Sin embargo, esto no parece funcionar el 100% del tiempo, y realmente fue una contribución un poco más allá del scope de la pregunta original, por lo que estoy volviendo a abrir esta parte como una pregunta separada y específica.

¿Alguna idea sobre cómo puedo lograr esto?

objetos como se muestra en la lista

EDITAR: Aquí hay un ejemplo de imagen real que no funciona con el código anterior

introduzca la descripción de la imagen aquí

procesando esta devoluciones

introduzca la descripción de la imagen aquí

y

introduzca la descripción de la imagen aquí

Lo ideal sería eliminar la última imagen de la lista de cortes.

Obviamente, puede adoptar un enfoque O (n ^ 2) que verifica cada blob contra todos los blobs y determina si se debe eliminar al verificar si 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 (si esta condición es verdadera, está bien eliminar blob1 de la lista). Si la cantidad total de blobs es bastante baja, esto debería funcionar a menos que me esté faltando algo.

Si está buscando una solución optimizada, sería útil saber cuántas manchas hay y qué tan común es la condición.