Need Help -> Векторизация

From
Victor A. Pavlov (2:5025/81)
To
Evgen Kondratyuk
Date
2002-07-23T18:54:26Z
Area
RU.ALGORITHMS
Доброго здоровья, Evgen!

 Как то раз (Пон Июл 22 2002 20:54) Evgen Kondratyuk написал письмо All:

 EK>   Такая задачка.___________________________________________
 EK>   Входные данные: БМП файл с фигурами(триугольник, квадрат и т.д.).
 EK>   Требуется: Векторизировать файл, тоесть определить линии (начало и конец
 EK> линии) и сложить из линий объекты. Вывести в текстовый файл названия
 EK> объектов и координаты составляющих их линий.

  Обработка производится в несколько этапов:
  1. Бинеаризация.
  Здесь мы приводим полутоновое изображение к двууровневому виду (двум цветам). Если необходима векторизация разноцветных фигур по-отдельности, делаем многоуровневую сегментацию - приведение к ограниченному числу цветов, а далее для каждого цвета (кроме цвета фона) формируем отдельное двухцветное изображение, сводя задачу к предыдущей.
  Алгоритмы бинеаризации довольно хорошо проработаны и выбрать подходящий для конкретного случая не составляет труда.
  2. Выделение границ (edge detect).
  Если изображение представлено, в основном, сплошными закрашенными фигурами, необходим этап выделения границ. Он состоит в обходе всех границ раздела цветов и создании результирующего изображения, в котором закрашены только пикселы, соответствующие границам.
  Если же изображение состоит из тонких линий (вроде чертежа), данный этап не требуется.
  3. Скелетизация (thinning).
  На данном этапе все линии на изображении приводятся к толщине в 1 пиксел. Имеется несколько алгоритмов скелетизации, например, Zhang-Suen. Если нужен пример в исходниках - могу выслать.
  4. Трассировка однопиксельных линий.
  Отслеживаем полученные в результате скелетизации однопиксельные линии, идя вдоль них и записывая подряд каждую точку. Анализируем разветвления, либо зацикливания линий. Получаем "сырое" векторное описание.
  Можно просто тупо соединить любые две закрашенные соседние точки векторами, а затем в несколько проходов разрывать по определенным правилам циклы (треугольники), размером в 1 пиксел, пока подобных циклов-артефактов не останется. Можно также восстанавливать разрывы линий в 1-2 пиксела, для коррекции ошибок сканирования/бинеаризации.
  5. Сглаживание линий.
  Сглаживаем полученные на предыдущем этапе попиксельные ломаные любыми нравящимися нам кривыми (отрезки прямых, дуги окружностей, сплайны и т.п.) и получаем результирующее векторное описание.

Всего хорошего - Victor

--- GoldED/W32 3.0.1
 * Origin: Red Station, Voronezh, Russia (2:5025/81)