Как мультфильм-если изображение программно?
мое приложение работает с фотографиями и видео людей, которые я хочу cartoonify. Поэтому мне нужен алгоритм, чтобы сделать это вручную (мы используем c++/Qt для нашего продукта, который имеет классы обработки изображений) или, возможно, какую-то программу CLI, которая сделает это для меня, которую я могу вызвать и использовать из нашего собственного приложения.
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 делает:
вы, возможно, захотите, чтобы проверить Фристайл, проект с открытым исходным кодом (Google Summer of Code, даже) для реализации нефотореалистичный рендерер на блендер. Вот пример его вывода, в мультяшном режиме: alt текст http://freestyle.sourceforge.net/GALLERY/CARTOON/girl-color-and-lines-crop.jpg
Если есть некоторый набор параметров, которые достигают желаемого эффекта в GIMPмультфильм фильтр (или некоторые другие комбинации фильтров) он может быть запущен в режим пакетной обработки.
Я не сделал этого сам, но думаю о двух шагах, которые могли бы придать изображению мультяшный вид.
обнаружьте края и нарисуйте довольно толстую линию (несколько пикселей) на этих краях.
уменьшить количество цветов в изображении.
Не уверен, что это поможет, но в этом уроке для Photoshop предлагает сделать следующее:
- Открыть изображение в Photoshop
- Фильтр > Размытие > Размытие По Гауссу. Установите радиус на 3.0 или выше, по вкусу.
- Edit > Fade Gaussian Blur. Появится окно . . . установите режим затемнения. Вам также может потребоваться снизить непрозрачность.
вот результат.
Я думаю, что вы могли бы сделать что-то подобное в своей программе.
на самом деле я не знаю инструмент, но вы можете посмотреть на 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-фотографией (карты глубины, фотограмметрия и т. д.).