Перейти к содержимому
Compvision.ru
kazanOpenCV

Уточнение контура объекта

Recommended Posts

Здравствуйте, уважаемые форумчане!

Помогите, пожалуйста, разобраться или подсказать в каком направлении "копать".

Есть некий объект (см. прикрепленную картинку) - фигура криволинейной формы с синим контуром, контур в произвольном случае может быть нечеткий.

Вручную задается грубый контур, повторяющий форму объекта. В данном случае он замкнутый и состоит из 17 точек.

Далее, используя грубый контур, нужно в автоматическом режиме получить уточненный контур, максимально повторяющий форму объекта.

Заранее благодарен всем за любые советы и идеи.

post-5772-0-15849300-1359720016_thumb.jp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ну это надо гуглить насчёт intelligent scissors и всего в таком духе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Может змеи помогут?

http://www.compvision.ru/forum/index.php?showtopic=443

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за быстрый ответ.

Буду изучать в указанных направлениях и отписываться в теме с идеями и вопросами, если никто не против :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

смотря какие у вас исходные данные при постановке задачи.

вообще это алгоритмы для сегментации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

mrgloom, есть исходный кадр (например, как в первом посте, в котором есть какие-то объекты), задается грубый контур в виде набора точек (передается извне),

также задается расстояние между точками уточненного контура, а также максимальное удаление точки уточненного контура от исходного грубого.

Соответственно, нужно на выходе получить уточненный контур с требуемыми параметрами. Приблизительно так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

kazanOpenCV был вроде такой алгоритм для задач трекинга объектов - но в полвторого ночи мой склероз отказывается вспоминать его название

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

kazanOpenCV был вроде такой алгоритм для задач трекинга объектов - но в полвторого ночи мой склероз отказывается вспоминать его название

Victor, я могу подождать светлого времени суток)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем доброго времени суток!

Спасибо Smorodov и mrgloom за идеи.

Smorodov, змеи предполагают замкнутый начальный контур? Если так то не совсем подходит.

Продолжаю "копать" в этом направлении.

Набросал алгоритм, прошу высказать идеи и замечания.

Итак, есть исходная картинка (рис.1)

Далее вручную (мышью) задается грубый ломаный контур (в общем случае незамкнутый) для определенного объекта на картинке (например, в нашем случае - часть верхнего контура антилопы).Рис.2.

Задается максимальная удаленность (d1) от отрезка исходного грубого контура и точность (d2) - частота точек на уточненном контуре.

Затем необходимо найти уточненный контур исходя из заданного грубого контура и критериев d1 и d2.

Предполагается следующий алгоритм:

1) Ограничиваю область поиска прямоугольной областью, описывающую исходный грубый ломаный контур - minAreaRect.

2) перевод в градации серого

3) размытие (?)

4) adaptiveThreshold

5) FindContours

6) строим перпендикулярные прямые (в обе стороны на длину d1) на каждом отрезке исходного грубого контура (через расстояние d2) и ищем пересечение с найденными в п.5. контурами (?) - рис.3 Далее также по каждому отрезку.

7) Объединяем найденные точки в единый уточненный контур.

В чем могут быть подводные камни и как лучше реализовать алгоритм?

post-5772-0-81515300-1360739531_thumb.jp

post-5772-0-00115200-1360739654_thumb.jp

post-5772-0-95696200-1360740503_thumb.jp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ну если судить по картинке, если вы задаёте приближенный контур ломаной, то надо к каждому отрезку найти нормаль(перпендикуляр) и наверно из каждой точки этого отрезка идти по этой нормали в 2 стороны(или внутрь замыкаемой области) точка останова там где у нас наибольший перепад яркости т.е. собственно граница.

потом получили эти точки и можно их просто соединить, а можно например сгладить или еще как то проанализировать.

Единственное, тут у нас изображение состоит из пикселей и надо нашу "векторную" линию как то на неё "положить", т.е. либо линия состоит тупо из пикселей(но их координаты как то всё равно надо получить, наверно можно посмотреть из кода опенцв там где рисуются линии) либо яркость точки на линии зависит от нескольких точек в окресности прохождения линии по какой либо более умной интерполяции.

а лучше не велосипедить, а всё таки посмотреть как работают лассо, магические ножницы и т.д.

например в гимпе

iscissors-selection.png

http://docs.gimp.org/en/gimp-tool-iscissors.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

mrgloom, а как средствами OpenCV определить перепад яркости двух точек?

Перевести изображение в HSV и использовать значение V?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

не знаю может быть достаточно просто перевести в серый и найти производную по направлению нормали.

как находить производную под углом на форуме вроде бы уже обсуждалось(легче всего просто повернуть изображение на угол и найти по прямой, даже не всё изображение, а участок в котором ищем и не надо будет заморачиваться с линией интерполяция от поворота изображения как бы сделает сама за нас всё)

вот тут еще

http://answers.opencv.org/question/387/sobel-derivatives-in-the-45-and-135-degree/

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

mrgloom, идея с поворотом на угол понравилась, но не совсем понял насчет заморочки с линией, можно поподробнее?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Единственное, тут у нас изображение состоит из пикселей и надо нашу "векторную" линию как то на неё "положить", т.е. либо линия состоит тупо из пикселей(но их координаты как то всё равно надо получить, наверно можно посмотреть из кода опенцв там где рисуются линии) либо яркость точки на линии зависит от нескольких точек в окресности прохождения линии по какой либо более умной интерполяции.

а если у нас изображение уже повернуто, то интерполяция пикселей как бы сделана и у нас просто прямая линия.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

"Спустился" до уровня отдельных пикселов.

Как задать некую аггрегатную характеристику (учитывающую в общем случае яркость, цветность и т.п.) отдельного пикселя, чтобы сравнивать между их собой, проходя вдоль линии?

Соответственно, найдя глобальный максимум на линии, можно предположить, что именно там и есть граница.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

граница это перепад. находите градиент собелем и находите максимум.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

mrgloom, я уже замучил)

запутался с Sobel, как правильно применить ее к моему случаю?

Если я правильно понял, у нас есть матрица-столбец (фактически прямий отрезок состоящий из Grayscale точек [1..N]), как к ней применить Sobel?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот презентация, которую я делал к лекции, надеюсь поможет разобраться с границами:

Выделение границ.pdf

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот презентация, которую я делал к лекции, надеюсь поможет разобраться с границами:

Выделение границ.pdf

Smorodov, спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Добрый день, на скриншоте результат - третье маленькое окно сверху с белым контуром.

Белый контур - это попиксельно найденный c помощью Sobel.

Есть проблема когда в фрагменте несколько ощутимызх перепадов яркости, как быть в этом случае?

Нужно искать максимум по каким-то критериям.

Вообщем застопорился.

post-5772-0-18907800-1361019686_thumb.jp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×