Сообщить об ошибке.

Встроенные фильтры улучшения модуля Pillow в Python

Подмодуль ImageFilter модуля Pillow в Python

Подмодуль ImageFilter содержит определения для предопределенного набора фильтров, которые можно использовать для улучшения изображения с методом Image.filter().

Встроенные фильтры библиотеки Pillow.

Pillow предоставляет следующие предустановленные фильтры для улучшения изображения:

  • ImageFilter.BLUR - размытие изображения. Можно настроить необходимый тип и степень размытия, используя ImageFilter.BoxBlur() или ImageFilter.GaussianBlur();
  • ImageFilter.CONTOUR - найти контуры изображения;
  • ImageFilter.DETAIL - детализация изображения;
  • ImageFilter.EDGE_ENHANCE - четкость границ изображения;
  • ImageFilter.EDGE_ENHANCE_MORE - улучшенная четкость границ изображения;
  • ImageFilter.EMBOSS - тисненое изображение;
  • ImageFilter.FIND_EDGES - идентифицирует границы изображения. Можно получить лучший результат, применив фильтр ImageFilter.SMOOTH перед поиском границ;
  • ImageFilter.SHARPEN - улучшение резкости;
  • ImageFilter.SMOOTH - сглаживание артефактов изображения;
  • ImageFilter.SMOOTH_MORE - улучшенное сглаживание артефактов изображения.

Пример использования встроенных фильтров.

from PIL import Image, ImageFilter

with Image.open("test.jpg") as imgF:
    bluF = imgF.filter (ImageFilter.BLUR) 
    bluF.save("test_bluF.jpg")
    ## Найти контуры
    conF = imgF.filter (ImageFilter.CONTOUR) 
    conF.save("test_conF.jpg")
    ## Обнаружение краев
    edgeF = imgF.filter (ImageFilter.FIND_EDGES) 
    edgeF.save("test_edgeF.jpg")

Встроенные классы фильтров библиотеки Pillow.

from PIL import ImageGrab, ImageFilter
import time

with Image.open("test.jpg") as img_orig:
    img_boxblur = img_orig.filter(ImageFilter.BoxBlur(20))
    img_boxblur.save('test_boxblur.png')
    img_gaussianblur = img.filter(ImageFilter.GaussianBlur(20))
    img_gaussianblur.save('test_gaussianblur.png')

    img_minfilter3 = img_orig.filter(ImageFilter.MinFilter(3))
    img_minfilter3.save('test_minfilter3.png')
    # то же, что и MinFilter(3)
    img_minfilter = img_orig.filter(ImageFilter.MinFilter)
    img_minfilter.save('test_minfilter.png')

ImageFilter.Color3DLUT(size, table, channels=3, target_mode=None, **kwargs):

Класс ImageFilter.Color3DLUT() представляет собой трехмерную таблицу поиска цветов.

Преобразует 3-канальные пиксели, используя значения каналов в качестве координат в 3D-справочной таблице и интерполируя ближайшие элементы.

Этот фильтр позволяет применять практически любое преобразование цвета за постоянное время с помощью предварительно рассчитанных прореженных таблиц.

Аргументы:

  • size: Размер таблицы. Одно значение int или кортеж (int, int, int). Минимальный размер в любом измерении - 2, максимальный - 65.
  • table: Плоская интерполяционная таблица. Список из channels * size**3 элементов float или список size**3 кортежей размера канала float. Сначала меняются каналы, потом первое измерение, затем второе и третье. Значение 0,0 соответствует наименьшему значению выхода, 1,0 - наибольшему.
  • channels: Количество каналов в таблице. Может быть 3 или 4. Значение по умолчанию равно 3.
  • target_mode: Режим результирующего изображения. Должно быть не меньше каналов channels. Значение по умолчанию - None, что означает, что режим изменен не будет.
Color3DLUT().generate(size, callback, channels=3, target_mode=None):

Метод класса Color3DLUT().generate() генерирует новый LUT, используя предоставленный обратный вызов callback.

Аргументы:

  • size: Размер таблицы. Передается в конструктор.
  • callback: Функция с тремя параметрами, которые соответствуют трем цветовым каналам. Будет вызван size**3 раз со значениями от 0,0 до 1,0 и должен вернуть кортеж с элементами каналов
  • channels: Количество каналов, которые должны возвращать обратный вызов callback.
  • target_mode: Передается конструктору результирующей таблицы поиска.
Color3DLUT.transform(callback, with_normals=False, channels=None, target_mode=None):

Метод Color3DLUT.transform() преобразует значения таблицы с помощью предоставленного обратного вызова callback и возвращает новый LUT с измененными значениями.

Аргументы:- callback: Функция, которая принимает старые значения таблицы поиска и возвращает новый набор значений. Количество аргументов, которые должна принимать функция, равно self.channels или 3 + self.channels, если установлен флаг with_normals. Должен возвращать кортеж элементов self.channels или channels, если он установлен.- with_normals: Если True, то обратный вызов будет вызываться с координатами в цветовом кубе в качестве первых трех аргументов. В противном случае обратный вызов будет вызываться только с фактическими значениями цвета.- channels: Количество каналов в результирующей таблице поиска.- target_mode: Передается конструктору результирующей таблицы поиска.

ImageFilter.BoxBlur(radius):

Класс ImageFilter.BoxBlur() размывает изображение, устанавливая для каждого пикселя среднее значение пикселей в квадратном поле, расширяющем радиус пикселей в каждом направлении. Поддерживает плавающий радиус произвольного размера. Использует оптимизированную реализацию, которая выполняется за линейное время относительно размера изображения для любого значения радиуса.

Аргумент radius - размер области в одном направлении. Радиус 0 не размывает и возвращает идентичное изображение. Радиус 1 занимает по 1 пикселю в каждом направлении, то есть всего 9 пикселей.

ImageFilter.GaussianBlur(radius=2):

Класс ImageFilter.GaussianBlur() размывает изображение с помощью последовательности расширенных прямоугольных фильтров, которые приближаются к ядру Гаусса.

Аргумент radius - стандартное отклонение ядра Гаусса.

ImageFilter.UnsharpMask(radius=2, percent=150, threshold=3):

Класс ImageFilter.UnsharpMask() представляет собой фильтр нерезкой маски.

Аргументы:

  • radius: Радиус размытия
  • percent: Нерезкая прочность, в процентах
  • threshold: Порог определяет минимальное изменение яркости, которое будет увеличено.

ImageFilter.Kernel(size, kernel, scale=None, offset=0):

Класс ImageFilter.Kernel() создает ядро ​​свертки. Поддерживается только ядра 3x3 и 5x5 для целых чисел и ядер с плавающей запятой. Можно применять только к изображениям L и RGB.

Аргументы:

  • size: Размер ядра в виде (width, height). Должно быть (3,3) или (5,5).
  • kernel: Последовательность, содержащая веса ядра.
  • scale: Масштаб. Если задано, то результат для каждого пикселя делится на это значение. По умолчанию используется сумма весов ядра.
  • offset: Смещение. Если задано, это значение добавляется к результату после того, как оно было разделено на scale.
from PIL import ImageGrab, ImageFilter

# создание скриншота
img_orig = ImageGrab.grab()
img_orig.save('test_orig.png')

# применяем фильтр `ImageFilter.Kernel` 
img = img_orig.filter(ImageFilter.Kernel((3, 3),
       (-1, -1, -1, -1, 9, -1, -1, -1, -1), 1, 0))
# сохраним для сравнения
img.save('test_Filter_Kernel_9.png')

# с другими весами ядра
img = img_orig.filter(ImageFilter.Kernel((3, 3),
       (-1, -1, -1, -1, 11, -2, -2, -2, -2), 1, 0))
img.save('test_Filter_Kernel_11.png')

ImageFilter.RankFilter(size, rank):

Класс ImageFilter.RankFilter() создает ранговый фильтр. Ранговый фильтр сортирует все пиксели в окне заданного размера и возвращает ранговое значение.

Аргументы:

  • size: Размер ядра, в пикселях.
  • rank: Какое значение пикселя выбрать. Используйте 0 для минимального фильтра, для медианного фильтра size * size / 2, для максимального фильтра size * size - 1 и т. д.

ImageFilter.MedianFilter(size=3):

Класс ImageFilter.MedianFilter() создает медианный фильтр. Выбирает среднее значение пикселя в окне заданного размера.

Аргумент size - размер ядра, в пикселях.

ImageFilter.MinFilter(size=3):

Класс ImageFilter.MinFilter() создает минимальный фильтр. Выбирает наименьшее значение пикселя в окне с заданным размером.

Аргумент size - размер ядра, в пикселях.

ImageFilter.MaxFilter(size=3):

Класс ImageFilter.MaxFilter() создает максимальный фильтр. Выбирает наибольшее значение пикселя в окне с заданным размером.

Аргумент size - размер ядра, в пикселях.

ImageFilter.ModeFilter(size=3):

Класс ImageFilter.ModeFilter() создает фильтр режима изображения. Выбирает наиболее часто встречающееся значение пикселя в поле заданного размера.

Аргумент size - размер ядра, в пикселях.

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

ImageFilter.Filter:

Класс ImageFilter.Filter представляет собой абстрактный миксин, используемый для фильтрации изображений (для использования с Image.filter()).

Разработчики должны предоставить следующий метод:

.filter(self, image):

Этот метод применяет фильтр к одноканальному изображению image или к одному каналу изображения image. Должен возвращать отфильтрованную копию изображения.

ImageFilter.MultibandFilter:

Класс ImageFilter.MultibandFilter представляет собой абстрактный миксин, используемый для фильтрации многоканальных изображений.

Разработчики должны предоставить следующий метод:

.filter(self, image):

Этот метод применяет фильтр к многоканальному изображению image. Должен возвращать отфильтрованную копию изображения.