Якщо вихід вашого фільтра Gábor надійний і коливання ваших даних зображень не настільки велике, що результат виглядає зовсім інакше, то ви можете використовувати наступний підхід (його частини, де вже згадувалося):
Бінарнізуйте друге зображення за допомогою будь-якого алгоритму автоматичного визначення порогу. Діапазон порогів, які будуть працювати, великий, як ви побачите.
Використовуйте алгоритм маркування компонентів, щоб позначити кожну підключену область пікселя унікальним значенням.
Обчисліть для кожного компонента вашого зображення властивість, яка описує, наскільки близький ваш об’єкт до заповненого кола. Для цього можна використовувати, наприклад, компактність . Я використав нижче фракції пікселів в еквівалентному радіусі диска . Цей радіус - це радіус, який має диск з тією ж площею, що і ваш об'єкт.
- Площа просто підраховує кількість пікселів вашого об’єкта
- Обчислення радіуса кола з урахуванням його площі також має бути керованим
- Для пікселя всередині цього радіуса вам потрібен центр кожного об'єкта зображення, але це лише середнє значення всіх позицій об'єкта-пікселів. Якщо ви фізик, то ви знаєте центр мас кількох точкових мас. Це рівнозначно.
- Тепер ви обчислюєте для кожного пікселя кожного об’єкта відстань від його центру і перевіряєте, чи менший він від радіуса кола. Розділивши два числа, ви отримаєте частку пікселя всередині та зовні.
- Візьміть предмет з найбільшою часткою. Примітка: об’єкти, що мають лише один піксель, отримають значення 1. Отже, ви повинні встановити поріг розміру та брати лише об'єкти, більші, наприклад 10 пікселів.
Щоб побачити, що автоматична бінаризація повинна працювати, ось результати дуже низького та дуже високого порогу:
Оновити маркування компонентів
Вибір маркування компонентів не є критичним для вашої програми. Я б запропонував, якщо вам доведеться реалізувати це самостійно, використовувати дуже простий метод. Версія з однією передачею з сайту Вікіпедії дуже проста. В основному ви повторюєте своє бінарне зображення, і коли ви зустрічаєте білий піксель, який не є міткою, ви використовуєте нову мітку для цього об'єкта і починаєте з цього пікселя.
Процес маркування цього об’єкта міткою в основному схожий на заливку. Це на веб-сайті Вікіпедії внутрішні кроки 1-4 в алгоритмі. Ви починаєте з цього міченого пікселя і ставите всіх його сусідів на стек (вони використовували вектор ). Для пікселя на стеці ви перевіряєте, чи він на передньому плані та чи не маркований. Якщо вам доведеться позначити це, ви знову всіх своїх сусідів кладете на стек. Робіть це, поки стек не порожній.
Потім ви продовжуєте сканування через зображення. На відміну від опису на веб-сайті Wiki, вам не потрібно видаляти піксель із початкового зображення, ви просто пропускаєте, коли у зображенні мітки є значення, відмінне від 0.