В Photoshop есть много крутых художественные фильтры, и мне бы хотелось разобраться в лежащих в их основе алгоритмах.
Одним из наиболее интересных алгоритмов является фильтр Cutout (номер 2 по ссылке выше).
У него есть три настраиваемых параметра: количество уровней, простота краев и точность краев. Количество уровней, кажется, управляет простым алгоритмом постеризации, но то, что делают другие ползунки, технически ускользает от меня.
Я бы подумал, что они делают что-то, связанное с диаграммами Vornoi или разделением k-средних, но копание в википедии не привело ни к чему, что явно соответствует тому, что делает Photoshop, особенно с учетом того, насколько быстро фильтр отображает себя.
Есть ли источник технических описаний фильтров Photoshop? В качестве альтернативы, есть ли у вас какие-либо мысли о том, как можно реализовать этот конкретный фильтр?





Возможно, это не совсем то, что вы ищете, но если вам нравится знать, как работают фильтры, вы можете проверить исходный код GIMP. Я не могу сказать, есть ли в GIMP эквивалент упомянутого вами вырезанного фильтра, но стоит взглянуть, если вы действительно заинтересованы в этой области.
Это была хорошая отправная точка для дополнительного поиска в Google, но, к сожалению, в GIMP нет встроенного аналога. Я нашел классный плагин GIMP под названием pspi, который может загружать плагины для фотошопа, но Cutout не реализован в этом путь :(
Обнаружение краев обычно выполняется фильтром Собела или Кэнни, тогда края соединяются вместе с помощью кода цепочки. Посмотрите что-то вроде библиотеки OpenCV для подробностей.
Количество уровней похоже на то, как выполняется затенение ячеек, и вот как я бы реализовал эту часть в этом случае: вы просто берете эту гистограмму изображения и делите ее на количество разделов «Количество уровней», а затем рассчитать среднее значение для каждого раздела. Затем каждый цвет гистограммы будет использовать это среднее вместо своего исходного цвета.
Два других параметра требуют некоторого размышления, но «простота края», кажется, взрывает количество сегментов, из которых строятся формы. Или, скорее, количество уточнений, примененных к некоторым грубым алгоритмам сегментации изображений. Ползунок верности, кажется, делает нечто подобное; он, вероятно, контролирует какой-то порог, когда должны происходить уточнения.
Я не уверен, что это может быть какое-то затенение ячеек, но он также выглядит как медианный фильтр с очень большим размером ядра или который применялся несколько раз.
Простота / точность краев могут быть параметрами, которые помогают решить, следует ли учитывать соседний пиксель (или тот, который попадает в ядро) на основе различия цвета с текущим пикселем.
Получил простое решение, которое теоретически могло бы дать нечто похожее на этот фильтр. Чем-то похоже на то, что предложил Исмаэль С.
Edge Простота контролирует размер окна. Может, окно надо утяжелить.
Но в отличие от обычных оконных фильтров, этот будет брать только часть случайных пикселей фиксированного размера из этого окна. Размер порции контролируется параметром верность.
Установите цвет пикселя на средний размер образца.
Если у нас есть некоторый алгоритм постеризации, он применяется впоследствии.
Вот так!
Сообщите о результатах, если вы его реализуете.
PS. Я очень сомневаюсь, что сегментация вообще используется.
Я предполагаю, что это, вероятно, некоторая пороговая обработка, обнаружение краев (Sobel / Canny / Roberts / что угодно) и постеризация.
Вы видели этот Почта. В нем объясняется, как получить тот же результат, используя ImageMagic, а IM - это открытый источник.
Поработав с ним, я выяснил, что:
В целом это похоже на упрощенную версию алгоритма Live Trace от Adobe Illustrator, в котором вместо кривых используются полигоны.
... а может и нет.
Очень старый вопрос, но, возможно, кто-то ищет ответ, и, возможно, это поможет. Это могут сделать функции findcontours и приблизительноPolyDP OpenCV. Но нам нужно подготовить изображение перед основным процессом. Первый; найти N наиболее часто используемых цветов с помощью k-средних. Например, найдите 8 цветов. Найдите контуры для каждого цвета, а затем вычислите contourArea для всех цветов один за другим (у нас будет N = 8 слоев). После этого нарисуйте залитые контуры после ок. PolyDP для каждого цвета от самой большой ContourArea до меньшей с заранее рассчитанным цветом. Еще я предлагаю исключить очень маленькие контуры при вычислении contourArea.
Параметры эффектов вырезания в Photoshop; Количество уровней = K-означает - найти N наиболее часто используемых цветов. Edge Simplicity = Я думаю, что размытие по Гауссу или другие фильтры для удаления шума, такие как двусторонний фильтр или фильтр среднего сдвига с сохранением границ, будут полезны для этого шага. Этот шаг может быть выполнен после K-средних и до нахождения контуров. Edge fidelity = эпсилон-параметр окполиДП openCV.
Вау, это круто. Я гораздо больше ценю обработку изображений в наши дни после работы над проектом, в котором участвовали некоторые (хотя мои задачи были менее сложными, чем другие).