Если выходные данные вашего фильтра Габора надежны и вариация в ваших данных изображения не настолько высока, что результат выглядит совершенно иначе, тогда вы можете использовать следующий подход (его части, где уже упоминалось):
Binarize ваше второе изображение с любым автоматическим алгоритмом порога. Диапазон порогов, которые будут работать, велик, как вы увидите.
Используйте алгоритм маркировки компонентов, чтобы пометить каждую подключенную область пикселя уникальным значением.
Рассчитайте для каждого компонента вашего изображения свойство, которое описывает, насколько близок ваш объект к закрашенному кругу. Для этого вы можете использовать, например, компактность . Я использовал ниже долю пикселей в пределах эквивалентного радиуса диска . Этот радиус - это радиус диска с той же площадью, что и у вашего объекта.
- Площадь просто подсчитывает количество пикселей вашего объекта
- Расчет радиуса круга с учетом его площади тоже должен быть управляемым
- Для пикселя внутри этого радиуса вам необходим центр каждого объекта изображения, но это просто среднее значение всех положений объекта-пикселей. Если вы физик, то вы знаете центр масс нескольких точечных масс. Это эквивалентно.
- Теперь вы рассчитываете для каждого пикселя каждого объекта расстояние от его центра и проверяете, меньше ли он радиуса круга. Разделив два числа, вы получите долю внутреннего и внешнего пикселя.
- Возьмите объект с наибольшей долей. Примечание: объекты с одним пикселем получат значение 1. Поэтому вы должны установить порог размера и брать только объекты большего размера, скажем, 10 пикселей.
Чтобы увидеть, что автоматическая бинаризация должна работать, вот результаты для очень низкого и очень высокого порога:
Обновление маркировки компонентов
Выбор маркировки компонента не является критичным для вашего приложения. Я бы посоветовал, если вам придется реализовать это самостоятельно, использовать очень простой метод. Версия один проход с сайта Википедии очень легко. По сути, вы перебираете свое двоичное изображение, и когда вы встречаете пиксель, который является белым и еще не помечен, вы используете новую метку для этого объекта и начинаете с этого пикселя.
Процесс маркировки этого объекта меткой в основном похож на заливку. Это на сайте Wikipedia внутренние шаги 1-4 в алгоритме. Вы начинаете с этого помеченного пикселя и помещаете всех его соседей в стек (они использовали вектор ). Для пикселя в стеке вы проверяете, является ли он передним планом и еще не помечен. Если вам нужно пометить его, вы снова поместите все его соседи в стек. Делайте это, пока ваш стек не станет пустым.
Затем продолжите сканирование по изображению. В отличие от описания на вики-сайте, вам не нужно удалять пиксель из вашего исходного изображения, вы просто пропускаете, когда у вас есть значение, отличное от 0 в вашем label-image.