карикатурирование реальных изображений - PullRequest
8 голосов
/ 17 октября 2010

Кто-нибудь знает, что мы можем перевести реальное изображение, полученное с помощью камер, в мультипликационное пространство?

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

Будет ли работать простая рекванизация в пространство, где меньше уровней квантования или лучше какие-то другие конкретные преобразования?

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

Спасибо заранее.

Ответы [ 6 ]

6 голосов
/ 23 июля 2012

Среднее смещение пирамиды + контур обнаруженных ребер, кажется, делает свою работу.

Код:

cv::Mat segmented, gray, edges;
cv::pyrMeanShiftFiltering(input, segmented, 15, 40);
cv::cvtColor(segmented, gray);
cv::Canny(gray, edges, 150, 150);
cv::cvtColor(edges, edgesBgr, CV_GRAY2BGR);
cv::Mat result = bgr - edgesBgr;

Вот результат, который я получил: Church after cartoon filter

Подробности: Часть учебника по OpenCV 6

5 голосов
/ 17 октября 2010

То, что вы пытаетесь сделать, чаще всего делается из 3D-моделей и называется cel-shading , или "toon-shading". По сути, вы пытаетесь навязать однородные цвета и сделать резкие переходы под определенными углами относительно источника света.

Очевидно, что это не очень хорошо переводит в 2D входные изображения. То, что вы можете сделать, - это выполнить повторную инициализацию, но при этом убедитесь, что вы равномерно заполняете области и разбиваете, где высокий градиент изображения.

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

Я реализовал это, может быть, 2-3 года назад, и это работало удивительно хорошо, учитывая, что это не так сложно реализовать. Однако вам понадобится реализация GPGPU, потому что она медленная !

2 голосов
/ 29 декабря 2011

Ваш термин "мультипликационное пространство" заставил меня подумать, что, возможно, вам следует исходить из этой идеи:

  1. Создайте мультяшное цветовое пространство, которое вам нравится, возможно, с 20-30 красивыми яркими цветами, которые покрывают большую часть обычного пространства RGB, но имеют яркую / блестящую тему (или любую цветовую тему мультфильма, которая вам нравится).
  2. Рекантизируйте ваше изображение не по подмножеству доступных цветов в изображении, а по цветам в вашем цветовом пространстве карикатуры (т.е. сопоставьте каждый цвет с ближайшим цветом в вашем цветовом пространстве мультфильма).
  3. Бонусные очки: устраните небольшие цветные области, чтобы получить более однородный однотонный вид.
  4. Больше бонусных баллов: добавьте черные контуры в каждую одноцветную область для дополнительной мультяшности. Возможно, измените толщину линии в зависимости от градиента исходного изображения.
  5. Опциональная настройка: преобразуйте все свои цвета в HSV цветовое пространство , выполните шаг 2 только на канале Hue для дополнительной защиты от теней.
2 голосов
/ 29 октября 2010

Полный снимок в темноте:

  1. Преобразование в цветовое пространство HSV (cvtColor с использованием CV_BGR2HSV)
  2. Оставьте H (ue) в покое, или квантовайте его до некоторого меньшего набора, еслиВы хотите
  3. Двоичный порог S (аттенуация) с низким порогом, чтобы пастели выдавали белый
  4. Двоичный порог V (цвет) с низким порогом, чтобы темный материал становился черным

Абсолютно не проверено.Вероятно, из моей головы ... Но должно быть довольно низкое использование процессора, если это будет работать.Это кажется мне тем, что нужно запустить ползунки для значений, необходимых на шагах 2-4, и просто поиграть с ними.

РЕДАКТИРОВАТЬ: друг указал, что вам также могут понадобиться линии вокруг объектов.Моей первой мыслью для этого было бы использовать cvCanny для выделения краев (требуется изображение в оттенках серого ... Я не уверен, что было бы лучше сделать это до или после карикатуры HSV. Возможно, до).Они будут шириной в один пиксель, что может быть недостаточно, поэтому вы можете dilate немного увеличить их.Они будут белыми на черном фоне, так что вы можете затем вычесть их из своего мультяшного цветного изображения, которое потянет пиксели, где линии уменьшаются до 0 (арифметика насыщенности для спасения), но оставит другие пиксели в покое.

2 голосов
/ 18 октября 2010

Вы также можете взглянуть на среднюю смену сегментации.Реализация доступна здесь: EDISON

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

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

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

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

Если вы хотите увидеть «Карикатурист», посмотрите на http://3dstereophoto.blogspot.com/2018/07/non-photorealistic-rendering-software_9.html. Здесь показаны все шаги с примером.

Для ясности, это ссылки на мой блог, который в основном посвящен трехмерной фотографии (карты глубины, фотограмметрия и т. Д.). Хотя я люблю рисовать, а также занимаюсь исследованиями фотореалистичного рендеринга на основе изображений (npr).

...