как найти и удалить перекрывающиеся фрагменты изображения из списка? - PullRequest
3 голосов
/ 03 марта 2012

Я разделил изображение на объекты (кусочки), используя метод, любезно предоставленный unutbu и Джо Кингтоном в этом вопросе: Прямоугольная ограничительная рамка вокруг капель в монохромном изображении с использованием python и у меня есть список этихобъекты, которые принимают следующую форму:

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

dy.start дает начальное значение y-пикселя, а dy.stop дает конечное значение y-пикселя и ту же самую сделку для dx.

В списке есть несколько объектов, которые перекрываются, т.е. один крошечный объект (квадрат) находится внутри более крупного объекта, такого как круг.Когда это происходит, я хочу удалить «вложенный» объект из списка (потому что круг уже включил его), например,

текущий список

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

идеальный список (с удаленным объектом)

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

Следует отметить, что в рамках вышеупомянутого вопроса было предложено использовать следующий код:

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)  

Однакопохоже, это не работает в 100% случаев, и это действительно был вклад, выходящий за рамки первоначального вопроса, поэтому я вновь открываю эту часть как отдельный, конкретный вопрос.

Любойидеи о том, как мне этого добиться?

objects as shown in list

РЕДАКТИРОВАТЬ: Вот фактический пример изображения, который не работает с приведенным выше кодом

enter image description here

обработка этого возврата

enter image description here

и

enter image description here

В идеале я хотел бы удалить последнее изображение изсписок ломтиков

1 Ответ

1 голос
/ 04 марта 2012

Очевидно, что вы можете воспользоваться подходом O (n ^ 2), который проверяет каждый BLOB-объект на наличие всех остальных BLOB-объектов и определяет, следует ли его удалить, проверяя, если 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 (если это условие истинно, можно удалить BLOB-объект изсписок).Если общее количество BLOB-объектов довольно низкое, это должно работать, если я что-то не упустил.

Если вы ищете оптимизированное решение, было бы полезно узнать, сколько существует BLOB-объектов и как часто встречается условиеесть.

...