Как сделать мультфильм, если изображение программно? - PullRequest
63 голосов
/ 31 августа 2009

Мое приложение работает с фотографиями и видео людей, которых я хочу изобразить. Поэтому мне нужен алгоритм, чтобы сделать это вручную (мы используем c ++ / Qt для нашего продукта, который имеет классы манипуляции с изображениями) или, возможно, какую-нибудь программу CLI, которая сделает это для меня, которую я могу вызывать и использовать из нашего собственного приложения.

Ответы [ 8 ]

47 голосов
/ 31 августа 2009

Вот несколько алгоритмов для игры:

  • Срединный или повторяющийся фильтр размытия рамки для получения мультяшной цветовой палитры.
    • Редактировать: Двусторонняя фильтрация должна еще лучше соответствовать вашим потребностям
  • Мин фильтр (нулевой процентиль) для улучшения некоторых типов ребер
  • Сегментация цветного изображения с использованием небольшого вложенного куба или сферы в цветовом кубе RGB
  • Общее улучшение краев на сегментированном изображении с использованием обнаружения краев, таких как ядра Собеля или 8-сторонняя трассировка краев
  • Составное размытое / отфильтрованное по медиане изображение с улучшенными краями

Это довольно простые и все очень простые в реализации. Имейте в виду, что фильтры медианы и размытия ячеек могут быть реализованы с линейной временной сложностью w.r.t. радиус ядра.

Больше правок:

Как только вы поймете алгоритм Хуанга, реализация фильтра размытия рамки станет очень вкусным куском.

Материал для чтения:

  • Быстрая медиана и двусторонняя фильтрация (получите PDF)
  • Медианное постоянное время фильтрации (получите PDF) Примечание: У меня есть реализация этого в C # с использованием Mono / SIMD для ускорения слияния гистограммы, однако это только кажется лучше, чем Алгоритм O ( r ), когда диаметр превышает ~ 60 пикселей из-за сопоставимого количества инструкций добавления / подчинения (точка безубыточности), реализация C ++, вероятно, гораздо лучше подходит использовать SIMD.

Другие материалы для чтения включают Gonzalez & Woods 'Digital Image Processing (кажется, более старая версия) для сегментации и отслеживания контуров. 8-сторонняя трассировка контуров может быть очень сложной, чтобы изогнуть голову (выбирая между пиксельными или межпиксельными краями и как зафиксировать края). Я был бы рад поделиться некоторыми кодами, но сотни строк здесь не совсем подходят.

22 голосов
/ 31 августа 2009

Вы можете попробовать ротоскопию, как toonyphotos.com делает:

rotoscopy example

12 голосов
/ 31 августа 2009

Возможно, вы захотите проверить Freestyle , проект с открытым исходным кодом (даже Google Summer of Code, даже) для реализации нефотореалистичного рендерера для Blender . Вот пример его вывода в режиме cartoon: alt text
(источник: sourceforge.net )

7 голосов
/ 31 августа 2009

Если есть некоторый набор параметров, которые достигают желаемого эффекта в фильтре GIMP Cartoon (или некоторой другой комбинации фильтров), его можно запустить в режиме пакетной обработки .

6 голосов
/ 31 августа 2009

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

  1. Определите края и нарисуйте на них довольно толстую линию (несколько пикселей).

  2. Уменьшите количество цветов в вашем изображении.

5 голосов
/ 31 августа 2009

Не уверен, поможет ли это, но этот урок для Photoshop предлагает сделать следующее:

  1. Откройте ваше изображение в Photoshop
  2. Фильтр> Размытие> Размытие по Гауссу. Установите радиус на 3.0 или выше, по вкусу.
  3. Edit> Fade Gaussian Blur. Окно появится. , , установите режим для затемнения. Вам также может понадобиться уменьшить непрозрачность.

Вот результат.

enter image description here

Я полагаю, что вы могли бы сделать что-то подобное в своей программе.

3 голосов
/ 10 июля 2018

Это относительно легко сделать. Вот шаги:

  • двусторонняя фильтрация для упрощения / абстрагирования фотографии. Вы можете отделить двусторонний фильтр, чтобы он был быстрее. Выполните двусторонний фильтр в 1d вдоль градиента и затем по нормали к градиенту.

  • определить края. Например, используя дифференциал гауссовского алгоритма. Вы можете использовать DoG в направлении градиента и сгладить его по линиям потока. Чтобы получить линии потока, вам нужно получить Edge Tangent Flow (ETF), который вы можете получить через тензор структуры.

  • квантовать цвета. На самом деле, вы квантуете яркость, чтобы имитировать затенение cel, то есть toon shading.

  • смешайте абстрактное изображение после квантования и края, которые вы обнаружили.

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

Я сделал несколько бесплатных программ (для win64), которые делают именно это: http://3dstereophoto.blogspot.com/p/painting-software.html

Название программного обеспечения "The Cartoonist", и вы можете увидеть его в действии здесь: http://3dstereophoto.blogspot.com/2018/07/non-photorealistic-rendering-software_9.html

Это ссылки на мой блог, который в основном посвящен трехмерной фотографии (карты глубины, фотограмметрия и т. Д.).

1 голос
/ 31 августа 2009

на самом деле я не знаю инструмент, но вы можете посмотреть на osg (openSceneGraph)

есть библиотека osgFX и мультипликационный эффект ... может быть, вы можете вдохновиться из этой библиотеки ...


возможно (я не знаю), у imagemagick есть много функций, может быть, у него есть такая возможность, но я не знаю ...

...