Это требует морфологической реконструкции! В морфологической реконструкции вы указываете маркер и начинаете восстанавливать исходное изображение с этой точки маркера с помощью морфологической дилатации.
К счастью для нас, MATLAB уже имеет функцию, которая, под названием imreconstruct
в Image Processing Toolbox, которая вызывается imreconstruct(marker,image)
Признать трогательное, но не пересекающиеся фигуры, мы можем только сделать дилатации на одно из входных изображений, чтобы сделать касательные фигуры перекрывающимися. В качестве элемента структурирования мы можем, например, используйте квадрат 3 × 3, поэтому мы также распознаем 8-связные цифры. После этого мы используем перекрывающиеся точки в качестве маркеров и выполняем морфологическую реконструкцию с использованием комбинированного изображения.
dilatedImage1 = imdilate(binaryImage1, strel('square',3));
finalImage = imreconstruct(dilatedImage1&binaryImage2, dilatedImage1|binaryImage2);
Как вы пишете, что все круги, то есть все части из binaryImage1
должны быть сохранены, мы можем просто добавить binaryImage1
к результату, используя
finalImage = finalImage | binaryImage1;
Для двух ваших примеров изображений, это приводит:
круг в правом верхнем углу не связан с какой-либо треугольник. Я не знаю, как этот треугольник появился в вашем ожидаемом изображении результата, но я полагаю, что это только для демонстрационных целей.
Примечание: Я импортировал образцы изображений .jpg в MATLAB, которые приводят к уродливым границам, поэтому я сначала сделал морфологическое открытие изображений. Границы все еще не оптимальны, но это выглядит не так уж плохо.
Ах да, извините за путаницу; Я рисовал быстрый и простой пример в MS Paint. Спасибо! – Keyes34