2013-04-09 15 views
2

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

Первый вопрос заключается в том, что большинство работ, которые направлены на векторизации либо логотипы или черно-белых изображений, ни один из которых я тоже заинтересован. Potrace, чей алгоритм описан here, является одной из этих библиотек. Используются ли те же методы применительно к растровым изображениям фотографий?

Я был обескуражен моими выводами, пока не наткнулся на Vector Magic. Результаты поразительны! Однако они не предоставляют никакой информации об их алгоритме. Метод, который дает аналогичные результаты качества, описан здесь: http://eprints.gla.ac.uk/47879/1/ID47879.pdf. Стратегия состоит в том, чтобы удалить контуры и обработать их, прежде чем рисовать их как векторы.

Но не упоминается, как они это делают. Я могу извлечь контуры с openCV, но что тогда? У меня проблемы с пониманием создания вектора или всего, что происходит после извлечения контура.

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

+0

[GIMP] (http://www.gimp.org) имеет код для векторизации фотографий. Я предполагаю, что вы не хотите писать программу, которая автоматизирует GIMP вместо использования библиотеки или записывает ее как сценарий GIMP-fu вместо автономной программы. Но поскольку GIMP является открытым исходным кодом, вы можете посмотреть, как работает код. Я считаю, что основная идея: (1) размытие, (2) постеризация, (3) выбор по цвету, (4) для каждого цвета для каждой отсоединенной области прослеживайте границу как вектор. – abarnert

+0

Простейшей альтернативой является просто использовать алгоритм обнаружения края и проследить каждое ребро в виде вектора. См. Статью [Wikipedia article] (http://en.wikipedia.org/wiki/Edge_detection) для объяснения алгоритмов обнаружения границ и ссылок на дополнительную информацию. – abarnert

+0

Спасибо за информацию! На каком языке вы бы предложили? Является ли Python хорошим выбором здесь? – elliottbolzan

ответ

3

Вот несколько подходов: