Як я можу виявити окремі об'єкти, коли їх краї торкаються один одного?


21

Мені потрібно знайти всі контури на зображенні, отриманому з камери. Тому я спочатку використовую детектор ребер для ребер, щоб знайти краї, а потім знайти контури. Досить просто.

Однак мої контури "зливаються". Наприклад, на зображенні нижче я чітко маю 4 різні об’єкти. Краї в деяких точках трохи торкаються, тому я отримую один великий контур замість чотирьох окремих. Я спробував змінити пороги, розмивати, проводити морфологічні операції та подібні речі, але краї трохи торкаються. Хтось має пропозиції щодо отримання окремих контурів на зображеннях, подібних до наведеного нижче? (Зображення нижче, очевидно, є лише прикладом, мої фактичні зображення набагато складніші, але мають ту саму основну проблему).

введіть тут опис зображення


Сегментація вододілу може працювати.
sm176357

Отже, слід також розглянути випадки, коли контакт є лінією, а не лише точкою (торкаючись, але не перетинаючись)
Shravya Boggarapu

Відповіді:


11

Виявлення різних компонентів:

Якщо ви намагаєтесь виявити різні компоненти, ймовірно, є інші підходи до їх виконання, ніж виявлення контурів. Ось приклад у Mathematica. Ерозія з подальшим розширенням використовується для закриття проміжку у другому компоненті до виявлення (якщо ви цього не зробите, він не виявить).

img = Binarize@Import["http://i.stack.imgur.com/yqDyu.png"];
Colorize[MorphologicalComponents[Dilation[Erosion[img,1],1]]]

На рисунку зліва внизу показано виявлення недосконалого об'єкта (не закриваючи пробіл) і праворуч показано правильне виявлення (працює вищевказаний код).

введіть тут опис зображення введіть тут опис зображення

Виявлення різних контурів:

Однак, якщо ви дійсно хочете розділити лише контури, ось приклад. Ерозія та дилатація виконуються, як і раніше, щоб закрити проміжок, і отримане зображення пропускається через детектор краю Canny. Я зробив параметри за замовчуванням явними, щоб ви могли бачити, що використовується.

img2 = EdgeDetect[Dilation[Erosion[img, 1], 1], Method -> "Canny"]

Це дасть вам як внутрішній, так і зовнішній край (див. Малюнок зліва внизу), оскільки ширина пікселя більша за 1 навколо. У мене не було великої удачі, намагаючись зменшити його, оскільки продуктивність погіршується (може відрізнятися від інших ваших зображень). Внутрішні контури - це ті, що вам потрібно, а зовнішній контур - це просто комбінований контур усіх 4 компонентів. Тепер все, що нам потрібно зробити, це скинути самий зовнішній:

SelectComponents[img2, "EnclosingComponentCount", # > 0 &]

що дає лише внутрішні контури (див. праворуч внизу). Іншими словами, він підбирає лише ті контури, які укладені хоча б одним іншим контуром, який автоматично дискваліфікує зовнішній. Я не знаю еквівалента цих команд / операцій у openCV.

введіть тут опис зображення введіть тут опис зображення

Зауважте, що видимі розриви фігури пов'язані із збереженням jpeg у меншому розмірі. Це не так виглядає на моєму екрані.


2

Спробуйте попередньо обробити зображення таким морфологічним фільтром, як ерозія . Це дозволить дотику контурів розділити. Виявивши контури, ви можете застосувати операцію розширення для завершення грат.


Я спробував це, але результати не показали покращення.

1
Чи можете ви показати реальний приклад зображення?

2

Це не відповідь на ваше запитання, але контурний аналіз схильний до помилок. З цим не можна багато зробити, і це працює лише за дуже простими сценаріями.

Якщо у вас є проблеми з його використанням, вам слід шукати зовсім інший алгоритм. Є більш складні та надійні способи вирішення речей, але це залежить від того, чого ви хочете досягти (виявлення об'єктів, відстеження тощо).


Дякую тобі. Моя програма використовується для виявлення рук, тому я думаю, що це буде дуже схоже на виявлення об'єктів. Чи давали ви якісь пропозиції щодо складніших та надійних алгоритмів? Характеристики Хаара, SURF та подібні алгоритми машинного навчання - це не те, що я можу зробити.

Ви дивилися на ці ресурси? paginas.fe.up.pt/~hgc2011 В основному це бази даних / результати, але я сподіваюся, що ви зможете знайти тут хороші документи.

0

Контури не обов'язково відкриті, вважайте, що ви використовували канни для їх виявлення. Проблеми з Обережним вже disccused тут . Обговорення на обережність дає основну ідею , що є ще такі операції , як закриття і дилатація, які вимагають зверху Обережного з оціненими замкнутими контурами.

Це також залежить від того, чи шукаємо ми контури чи сегментації (методи Canny порівняно з Graphcuts ). Тому я думаю, що шукати надійного рішення залежить від вашого остаточного застосування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.