Все методы ImageFilter используют ядра, свернутые с изображением, для создания эффектов фильтра. Здесь - хороший пример для свертки ядра. Если вы загрузите модуль ImageFilter, вы сможете выяснить ядра, используемые для каждого вида операций, взглянув на
>>> help(ImageFilter)
Например, для EDGE_ENHANCE_MORE справка дает
filterargs = ((3, 3), 1, 0, (-1, -1, -1, -1, 9, -1, -1, -1, -1))
Это означает, что ядро EDGE_ENHANCE_MORE имеет размер 3x3, коэффициент масштабирования 1, смещение 0 и состоит из -1 значений, за исключением значения центра, равного 9. Из того, что я прочитал, кажется, что вы можете создать пользовательский фильтр (включая разницу ядра Гаусса), предоставляя соответствующие аргументы для объекта ядра:
Kernel(size, kernel, scale=None, offset=0)