Акварельные фильтры используют то, что называется анализ сдвига , чтобы усреднить изображение при сохранении характеристик.Это итеративный подход, при котором кластеры пикселей тяготеют к их среднему значению.
Вот пример кода Java: https://imagej.nih.gov/ij/plugins/mean-shift.html
Вот документ, который описывает эффект акварели и егокомпоненты (включая затемнение краев): http://maverick.inria.fr/Publications/2006/BKTS06/watercolor.pdf
Существует проект github с реализациями CUDA и OpenCL, но если вы действительно хотите понять алгоритм, я бы отсылал вас к этой странице, которая объясняет его довольно аккуратноиспользуя код Python:
http://www.chioka.in/meanshift-algorithm-for-the-rest-of-us-python/
Еще один вариант в моей голове - использовать перекрестный фильтр Собеля / Робертса, чтобы обнаружить все границы на изображении, а затемиспользуйте инверсию этого значения в качестве маски для размытия по Гауссу.Это не даст вам такой же приятный эффект отслоения.