![]() |
|
![]() ![]() ![]() |
|
DemonVex |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 11.6.2005 Репутация: нет Всего: нет |
Имеется контур фигуры человека (рисунок в аттаче).
Требуется последовательно обойти контур начиная с точки на голове и заканчивая там же. Это сообщение отредактировал(а) DemonVex - 30.5.2009, 15:46 Присоединённый файл ( Кол-во скачиваний: 30 ) ![]() |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
есть такая процедура - скелетизация (skeletonization)
в результате для замкнутого контура получится последовательность точек, каждая из которых имеет по два соседа, так что пройтись будет довольно-таки просто: запоминаем, откуда пришли, и туда не идём, тогда остаётся ровно один сосед, куда и нужно идти -------------------- qqq |
|||
|
||||
cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
Немного другой метод знаю. Суть там в поворотах налево или направо. Начинаем в точке контура. Если черная, то поворачиваем влево, если белая, то вправо. Таким образом змейкой обходим контур.
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
DemonVex |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 11.6.2005 Репутация: нет Всего: нет |
maxim1000 Да проход, реализовать получилось с помощью двух стеков. Но алгоритм устойчивый только если у всех точек есть только по две смежных точки. Скелетизация контура должна помочь. Спасибо.
Это сообщение отредактировал(а) DemonVex - 31.5.2009, 08:31 |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
а мне, кстати, метод, описанный cardinal больше нравится
![]() скелетизация требует прохода по всему изображению несколько раз, оптимизировать, конечно, можно, но так или иначе будет выполняться значительно больше работы во втором методе будет обработано ровно столько точек, сколько нужно, не нужно будет дополнительной памяти (для скелетизации без неё у меня обойтись не получалось) так что если анализ не пойдёт дальше обхода контура, то лучше вторым методом скелетизация будет полезна, если нужен более широкий анализ, например, где происходят ветвления линий -------------------- qqq |
|||
|
||||
DemonVex |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 11.6.2005 Репутация: нет Всего: нет |
Попробую реализовать второй алгоритм. Посмотрю на устойчивость в этой задаче.
Это сообщение отредактировал(а) DemonVex - 31.5.2009, 13:43 |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
maxim1000,
Для скелетизации не нужно проходить все изоброжение много раз. Есть волновой алгоритм скелетизации. http://ocrai.narod.ru/vectory.html Причем позовершению работы будем иметь не только скелет, но и обойденный контур. |
|||
|
||||
LOD77 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 2.5.2009 Репутация: 1 Всего: 1 |
Рекомендую правосторонний (левосторонний) обход. Принцип элементарный. Сканируем матрицу пикселов пока не встречаем черный (но сами остаемся на белом). Дальше начинаем обход
1. Запоминаем свои координаты. 2. Если можно двигаться в текущем направлении, то перемещаемся на один пиксель (двигаемся только по белым точкам) и поворачиваемся (на месте, просто изменяем направление) по часовой стрелке на 90 градусов. А в противном случае (если двигаться не можем) то поворачиваемся на 90 градусов против часовой стрелки. 3. После каждого перемещения, проверяем не вернулись ли мы в исходную точку. Если нет, то переходим к пункту 2, иначе конец. Все. Реализуется в 5 строчек. |
|||
|
||||
cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
LOD77 расписал по пунктам то, что я предложил пару постов выше...
![]() -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |