Алгоритм выделения контура

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Алгоритм выделения контура

Сообщение Sirik » 12.09.2014 (Пт) 9:08

Всем привет.
Понадобилось написать программу, которая бы искала на изображении контур, а так его векторизировала. Контур имеет вид выпуклой замкнутой фигуры.
Частично решил данную задачу алгоритмом «Жука». Но для правильного функционирования растр должен иметь непрерывный контур, а у меня иногда получается, что контура имеют небольшие разрывы. Как быть в таком случае, как «Жука» сделать немного умнее?)
И еще вопрос: как реализовать «умное» удаление лишний точек? На скорую руку сделал простое удаление каждых 19 точек, т.е. остается каждая 20 точка, все остальные удаляются.

Вот пример как должно работать (красные точки - искомый контур, немного сдвинул вправо чтобы не задеть растр):
Вложения
bbs.jpg
bbs.jpg (17.57 Кб) Просмотров: 3121
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Алгоритм выделения контура

Сообщение Хакер » 12.09.2014 (Пт) 11:02

Пока можешь посмотреть сюда: viewtopic.php?f=73&t=42590
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Алгоритм выделения контура

Сообщение Sirik » 12.09.2014 (Пт) 11:22

Смотрел и не раз) Мне надо как-то его оптимизировать для контура с разрывами, причем контур только один на изображении
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Алгоритм выделения контура

Сообщение The trick » 12.09.2014 (Пт) 12:09

Sirik писал(а):Смотрел и не раз) Мне надо как-то его оптимизировать для контура с разрывами, причем контур только один на изображении

Усредни точки в окрестности, обработай пороговым фильтром. На выходе векторизатора "склей" близко-расположенные линии.
Было:
bbs.jpg
bbs.jpg (17.57 Кб) Просмотров: 3109

Стало:
bbs2.jpg
bbs2.jpg (23.58 Кб) Просмотров: 3109
UA6527P

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Алгоритм выделения контура

Сообщение Sirik » 12.09.2014 (Пт) 13:19

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

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Алгоритм выделения контура

Сообщение Mikle » 12.09.2014 (Пт) 13:39

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

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Алгоритм выделения контура

Сообщение The trick » 12.09.2014 (Пт) 13:39

Sirik писал(а):Как усреднить-то? Я привел пример простой прямой, а на деле попадаются с дугами, поворотами и т.д. (все повороты плавные)

Где ты там увидел прямую? Я увидел несколько продолговатых фигур. Прежде чем трассировать нужно подготовить изображение для трассировки. Не знаешь как усреднить? Для усреднения нужно умножить каждую точку и ее соседние точки на коэффициенты после все сложить и поделить на количество точек участвовавших в операции (свертка), полученная величина будет значение новой точки. Эту операцию повторить для каждой точки. Пороговый фильтр - разделяет изображение на 2 составляющие: одна часть пикселов до порога фильтра, вторая после. Обычно одну часть раскрашиваю в белый цвет - вторую в черный.
По трассировке - вот и вот еще можешь почитать.
UA6527P

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Алгоритм выделения контура

Сообщение Sirik » 12.09.2014 (Пт) 14:24

Это прямая только под большим увеличением.


Вот пример исходного изображения:
bbs2.jpg
Пример входного изображения
bbs2.jpg (22.58 Кб) Просмотров: 3104

А вот, то что у меня получается:
bbs1.jpg
Выход
bbs1.jpg (24.36 Кб) Просмотров: 3104


Все бы хорошо, но надо более грамотнее убирать лишние точки, сейчас же все по простому и не правильному: убираю каждые 19 штук.

Это если контур не разрывной, но как только попадет разрыв хотя бы в 1 пиксель - алгоритм Жука проваливается.

Насчет подготовки к трассировки: сейчас буду думать как ее реализовать
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Алгоритм выделения контура

Сообщение The trick » 12.09.2014 (Пт) 15:21

Sirik писал(а):Все бы хорошо, но надо более грамотнее убирать лишние точки, сейчас же все по простому и не правильному:

Ты читал пост Хакера? Читал про Bresenham Complete Test? Читал мои ссылки?
UA6527P

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Алгоритм выделения контура

Сообщение Sirik » 12.09.2014 (Пт) 15:28

Про лишние точки, это на будущее, сейчас главное реализовать правильный обход контура
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Алгоритм выделения контура

Сообщение Debugger » 13.09.2014 (Сб) 19:06

Писал статью на Хабр по поводу классификации изображений. Там первая часть посвящена фильтрации исходной картинки.
Однако, в моей задаче контуры были гарантированно выпуклыми, а в этой (как я понял по картинке стопы) - не обязательно. Это несколько усложняет дело.
http://habrahabr.ru/company/dmlabs/blog/205842/

Медианный фильтр
Изображение
Выделение бикомпоненты
Изображение

Как это работает (настройки фильтров были очень жесткими из-за высокого шума; более щадящие будут меньше рвать контур)
Изображение =>Изображение => Изображение => Изображение

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


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 43

    TopList