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

Сжатие и аппроксимация контура

Recommended Posts

Добрый день!

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

Существуют ли какие-нибудь методы или библиотеки для решения данных задач?

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


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

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


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

Для аппроксимации линиями этот алгоритм можно использовать. Но мне нужна аппроксимация не только линиями, но и дугами окружностей.

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


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

вообще то я не понял о чем речь.лучше нарисуйте картинку.

но и дугами окружностей.

чо то тут уже попахивает сплайнами.

в оценцв, есть AproxPoly или как то так.

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


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

вообще то я не понял о чем речь.лучше нарисуйте картинку.

чо то тут уже попахивает сплайнами.

в оценцв, есть AproxPoly или как то так.

Картинка ниже.

Сплайн не подходит, нужны линии и дуги.

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

post-4910-0-63530300-1326795820_thumb.pn

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


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

теперь понял.

это эквивалентно изменению масштаба.

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

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


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

Вот тут вроде Ваша задача с алгоритмом решения: http://hal.inria.fr/docs/00/57/94/67/PDF/main.pdf

Можно еще здесь посмотреть:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.91.1863&rep=rep1&type=pdf

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


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

Вот тут вроде Ваша задача с алгоритмом решения: http://hal.inria.fr/docs/00/57/94/67/PDF/main.pdf

Можно еще здесь посмотреть:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.91.1863&rep=rep1&type=pdf

Спасибо, поизучаю.

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


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

теперь понял.

это эквивалентно изменению масштаба.

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

Вот как раз в этом и вопрос, что значит "просто сжимаете\расширяете".

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


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

ну была точка (10,10) сжали в 2 раза стала (5,5)

а если не в 2 раза, а на 3 единицы, то что у Вас получится? в какую сторону будете двигать?

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


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

надо определить нормаль для точки контура и сдвинутся по на 3 единицы во внутрь если уменьшение и наружу если увеличение.

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


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

а если не в 2 раза, а на 3 единицы, то что у Вас получится? в какую сторону будете двигать?

Всё таки нужна более точная постановка задачи.

1. Сжатие - это подобие, а оно определяется коэффициентом. Грубо говоря, "во сколько раз".

2. Так как изображение у нас дискретное, то при уменьшении масштаба получится так, что 2 точки исходного изображения х1 и х2 будут соответствовать 1 точке результирующего у1. И это нормально, согласен? Но в этом случае расстояние [х1, у1] может быть не равно [х2, у1]. То есть постановка задачи в виде "сжать на d единиц" некорректна. Хотя идеальную окружность так сжать можно.

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


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

Всё таки нужна более точная постановка задачи.

1. Сжатие - это подобие, а оно определяется коэффициентом. Грубо говоря, "во сколько раз".

2. Так как изображение у нас дискретное, то при уменьшении масштаба получится так, что 2 точки исходного изображения х1 и х2 будут соответствовать 1 точке результирующего у1. И это нормально, согласен? Но в этом случае расстояние [х1, у1] может быть не равно [х2, у1]. То есть постановка задачи в виде "сжать на d единиц" некорректна. Хотя идеальную окружность так сжать можно.

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

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


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

надо определить нормаль для точки контура и сдвинутся по на 3 единицы во внутрь если уменьшение и наружу если увеличение.

Абсолютно верно, вот я как раз и спрашивал о существующих алгоритмах и библиотеках для автоматизации этого процесса.

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


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

Это ведь задача построения эквидистанты, как я понял?

http://pmpu.ru/vf4/dets/discrim/equidist

http://sets.ru/base/41nomer/malkov/1.pdf

http://forum.shelek.ru/index.php/topic,26282.0.html

Ну и этот монстр наверняка все это может: http://www.cgal.org/

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


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

Абсолютно верно, вот я как раз и спрашивал о существующих алгоритмах и библиотеках для автоматизации этого процесса.

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

правда не знаю насколько это будет точно.

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

наверно еще кривую надо сгладить изначально.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×