Как стать автором
Обновить

Михаил Бессмельцев с коллегой разработал новые алгоритмы для векторизации графики

Время на прочтение3 мин
Количество просмотров32K
Всего голосов 82: ↑80 и ↓2+78
Комментарии28

Комментарии 28

Как понимаю, попробовать вживую это пока нельзя?
Я бы, честно говоря, увидивился если бы можно было.
Моя текущая занятость, кстати, требует довольно часто векторизировать всякую фигню. Интересно было бы посмотреть на алгоритм, отличный от стандартного.
Пошукал, ни supporting materials на гитхабе, ни на сайте MIT. Надеюсь, на момент публикации код будет (см. страницу Justin Solomon на сайте MITа).
Защищено ли оно патентами? Можно ли расчитывать на интеграцию этого алгоритма в open source продукты?
Если описание алгоритма есть в свободном доступе, то разве нельзя представить собственную открытую реализацию, естественно со ссылками? Я просто не представляю как патентовать идею. Патентуют вроде конкретные реализации.
Да вроде бы нельзя. Патентуется не идея, а конкретные алгоритмы. Первые, приходящие в голову примеры — MP3 и SURF.
В США можно запатентовать алгоритм; в России — нет (хотя иногда алгоритмы патентуют как «способ»).
глянул начало рекламного ролика.
Чем-то похоже на
Известное кино

о боже, я написал не в тот топик!
извините меня пожалуйста…
на самом деле это было сюда

по теме этого топика — я однажды принимал участие в команде, которая занималась небольшой векторизацией, это действительно огромная задача — респект тем, кто придумал что-то новое на этом поприще.
В векторизации технических изображений есть еще одна проблема — идентификация прерывистых линий (разнообразных пунктиров) и выделение их топологии, как сплошных линий, а не отдельных сегментов.
Для логического соединения прерывистых линий вполне можно использовать что-то роде Hough transform, я думаю.
И я бы сказал, что это главная проблема. Основное в рисунке — это движение (направление изгиба оси целого или части). Сама ось очень редко рисуется, но всегда подразумевается. Если отдельные линии начинают противоречить движению, это сильно портит рисунок. У хорошего художника движение может передаваться очень многими средствами (в т.ч. перпендикулярными линиями). Потеря его при растеризации сильно огрубляет и примитивизирует рисунок. И чем лучше рисунок, тем больше будет огрубление.

Но как найти ось, если она может быть построена из мнимых линий (например, даже негативным пространством)?
Возникла идея нового формата с растровым фоном и векторным наложением. Вот это бы решило ту проблему.
.djvu
Вы говорите о противоположной задаче — не выделении «скрытой» топологии, а о буквальной передаче штрихов и линий, со всеми их свойствами.
Не буквальной, а символичной. Но да, я говорю про восстановление штрихов.

Смотрите. Штрих — набор запачканных областей бумаги, причём чаще всего с разрывами (из-за текстуры бумаги). Нас не интересуют границы запачканных областей. Нас даже не всегда волнует точная форма штриха. Вот что нас волнует — это:
1) Отделение одного штриха от другого (например, в случае с гривой — у нас большая линия шеи, поверх которой лежат штрихи гривы).
2) Определение истинного направления штриха (за вычетом погрешностей рук, грифеля и бумаги).
3) Определение направления проведения штриха (т.к. это важно для штриховки — может быть две группы штрихов, одни в одном направлении, другие в другом, и их лучше не путать).

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

Имея на руках эти данные можно восстанавливать рисунок, более того, восстановленный рисунок будет богаче, чем просто вектор. Применение разных кистей позволит подобрать (художнику) наиболее приближенное по стилю/духу к бумажному рисунку.
В таком случае задача существенно шире и сложней. Ведь нужно учитывать и фактуру штриха. Малевать можно и карандашом и кистью и аэрографом и трафаретом…
Наверняка есть и другие нюансы.
Фактура штриха у мастера, безусловно, может играть роль. Но если мы говорим про векторизацию линейного рисунка, то в первом приближении «просто линия» сработает. Чем дальше рисунок от тонального, тем менее важна в нём фактура линии.
Пример хардкорного линейного рисунка:



С другой стороны, насколько я понимаю, задача в топике — не векторизация любого линейного рисунка (ага), а специально нарисованного с outlines. Там основное — это линия, а не её фактура. В этом случае критическим является именно соответствие движению в крупных формах.
Лошадь просто отличный пример малых, но существенных ошибок этого алгоритма.

1. Посмотрите на «подмордие». На рисунке — это тень. Там сильнее шртрихи. На векторе — странная штука снизу морды.
2. Шея на рисунке — ровная, с линиями гривы. На векторе — то ли булочка, то ли морщины.
3. Заднее копыто — потеряли овальность и форму. Выглядит как детская ошибка в рисунке.
4. Переднее копыто — потеряли несколько важных штрихов, считай, потеряли форму.
5. Самое левое копыто — криво взята форма, потеряли точную линию, которая показывала примыкание копыта к ноге.

На первой картинке (верхушка шляпы) видно, что вектор потерял правильное движение — вместо S-образной кривой там образовалась C-образная и не туда.

Т.е. в качестве подпорки — да, в качестве нормального инструмента — нет.
Постоянно требуется перегонять растровые картинки в вектор. Юзаю Vector Magic, очень нравится. Встроенный трассировщик корела и рядом не стоял.
Vector Magic — это разработка Университета Стэнфорда, которая стала коммерческим продуктом. Посмотрим будет ли монетизировать новый алгоритм Массачусетский Технологический.
НЛО прилетело и опубликовало эту надпись здесь
Поясните, пожалуйста, что Вы имеете под «распознаванием градиентов».
НЛО прилетело и опубликовало эту надпись здесь
Никогда не сталкивался с задачей векторизации, просто не нужно было, поэтому прошу объяснить, что такое «распознавание градиента». С моего дивана, градиент или есть, или его нет. Если есть, то используем какой-то из способов его обнаружения (gradient vector flow, анизотропную диффузию, змейки...) или вообще адаптивную бинаризацию, если нет, то используем скелетонизацию. Линия разбита — опять же змейки, главное, коэффициент подобрать. Не нравится скелет — спрямляем-сглаживаем его, методы тоже есть.
НЛО прилетело и опубликовало эту надпись здесь
Странно. Задача-то в принципе давно решена. Вот две софтины, которыми я пользуюсь по работе, основаны на active contour (snakes): JFilament (попроще) и SOAX (поточнее и 3D)
Алгоритмы векторизации вплотную подходят к границам возможностей математического/геометрического подхода. Читая комментарии выше, замечаю, что с точки зрения компьютера рисунок векторизуется вполне точно, но с точки зрения художника всё не совсем хорошо. Был в моей практике другой случай, когда нужно было оцифровать простой растительный рисунок, но, вот беда, низкого разрешения, для программы банально слишком мало информации, приходилось угадывать и от себя дорисовывать, что там было на самом деле. Очевидно, чтобы достичь лучшего результата не обойтись без интеллекта — натурального или искусственного.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории