Как мультфильм-если изображение программно?


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

8 57

8 ответов:

вот некоторые алгоритмы, чтобы играть с:

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

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

изменения:

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

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

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

другие материалы для чтения включают в себя Цифровая Обработка Изображений Gonzalez & Woods (кажется, более старое издание) для сегментации и трассировки края. 8-полосная трассировка края может быть очень трудно согнуть голову вокруг (выбор между на пиксель или между пиксельными краями и как защелкнуться на краях). Я был бы рад поделиться некоторым кодом, но сто лайнеров этого не делают точно вписывается гладко здесь.

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

rotoscopy example

вы, возможно, захотите, чтобы проверить Фристайл, проект с открытым исходным кодом (Google Summer of Code, даже) для реализации нефотореалистичный рендерер на блендер. Вот пример его вывода, в мультяшном режиме: alt текст http://freestyle.sourceforge.net/GALLERY/CARTOON/girl-color-and-lines-crop.jpg

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

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

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

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

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

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

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

enter image description here

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

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

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


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

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

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

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

  • квантования цвета. На самом деле, вы квантования яркости, чтобы имитировать сэл-шейдинг тени ака мультяшек.

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

Это даст вам визуализированное изображение, которое выглядит как мультфильм cel shaded.

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

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

Это ссылки на мой блог, который в основном занимается 3d-фотографией (карты глубины, фотограмметрия и т. д.).