Учитывая контур, описывающий края формы S в OpenCV / Python, какие методы можно использовать для прослеживания кривой вдоль центра фигуры?

Учитывая контур, обозначающий край буквы S (например, в комиксах), как я могу получить ряд точек вдоль позвоночника этой буквы, чтобы позже представить эту форму с использованием линий, кубического сплайна или другой кривой-представляющей техники ? Я хочу обрабатывать и представлять форму с использованием 30-40 точек в Python / OpenCV.

Морфологическая скелетонизация может помочь в этом, но операция всегда, кажется, порождает ошибочные ветви. Есть ли лучший способ обрушить контур только в форме буквы «S»?

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

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

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

Ниже приведен комикс без алфавита:

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

Еще одна проблема с скелетонизацией заключается в том, что она является дорогостоящей вычислительной машиной, но если вы знаете способ сделать ее надежной для формирования «змеиного языка», как ветви, тогда я попробую.

  • Согласование вложенных структур с регулярными выражениями в Python
  • Сброс Python Spyder
  • Запустить / отладить приложение UnitTests приложения Django из контекстного меню правой кнопки мыши в PyCharm Community Edition?
  • Почему «**» связывается сильнее, чем отрицание?
  • подсчет ненулевых элементов внутри каждой строки и внутри каждого столбца массива 2D numpy
  • Что делает функция tf.nn.embedding_lookup?
  • Ошибка установки pyusb 2.7 windows
  • OpenOffice pyuno "выбрать все"
  • 2 Solutions collect form web for “Учитывая контур, описывающий края формы S в OpenCV / Python, какие методы можно использовать для прослеживания кривой вдоль центра фигуры?”

    Фактически векторизация шрифтов не является тривиальной проблемой и довольно сложной. Для правильной векторизации шрифтов с использованием кривой Безье вам понадобится трассировка. Существует много библиотеки, которую вы можете использовать для трассировки изображения, например, Potrace . Я не знаю, используя python, но на основе моего опыта, я сделал аналогичный проект, используя c ++, описанный ниже:

    A. Установите контур, используя кубический безье

    Этот метод довольно прост, хотя нужно много работать. Я считаю, что это также хорошо работает, если вы хотите подгонять скелеты, полученные от истончения.

    1. Найдите контур / край объекта, вы можете использовать функцию OpenCV findContours ()
    2. Вся фигура не может быть представлена ​​с использованием одного кубического безье, поэтому разделите их на несколько сегментов с помощью Ramer-Douglas-Peucker (RDP) . На этом этапе важно не удалять точки, использовать RDP только для сегментации точек. См. Цветные сегменты на изображении ниже.
    3. Для каждого сегмента , где S – множество из n точек S = (s0, s1, … Sn) , приспосабливаем кубический безье, используя наименьший квадратный фитинг

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

    Иллюстрация наименее квадратного монтажа:

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

    B. Резолюция Независимая кривая рендеринга

    Этот метод, описанный в этой статье , довольно сложный, но один из лучших алгоритмов, доступных для отображения векторных шрифтов:

    1. Найдите контур (тот же метод A)
    2. Используйте RDP, в отличие от метода A, используйте RDP для удаления точек, чтобы контур можно было упростить.
    3. Делайте треугольную триангуляцию.
    4. Нарисуйте кривую Безье на внешних краях, используя метод, описанный в документе

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

    Может быть полезной следующая простая идея.

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

    2. Найдите точки ветвления. В зависимости от его длины вы можете удалить их, чтобы устранить проблему «змеиного языка».

    Надеюсь, поможет.

    Interesting Posts
    Python - лучший язык программирования в мире.