Фильтрация изображений

Содержание лекции:

1. Фильтрация

2. Функции OpenCV для применения фильтров

3. Варианты фильтров

4. Сочетание фильтров

5. Фильтры для машинного обучения


Запись седьмого занятия вы можете посмотреть по этой ссылке

1. Фильтрация

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

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

Фильтр: усреднение и ядро фильтра/kernel

Рассмотрим фильтрацию в плане усреднения. Усреднение также иногда называют матричным фильтром, так как для фильтрации используется матрица, а также называют Box Filter или линейный фильтр. Обратите внимание на английские названия терминов, с ними приходится сталкиваться чаще всего.

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

Фильтр: свёртка/convolution

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

Фильтр: признак/feature- значение, которое получается на выходе фильтра.

Фильтр: карта признаков/feature map

На выходе свёртки получается множество признаков, которое называют картой признаков. Также его иногда называют картой активации.

Фильтр: значения на границе

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

За счёт того, что размеры окна обычно больше 1, при применении фильтра к крайним пикселям изображения некоторых пикселей недостаёт. Для таких случаев используют различные варианты фильтрации на границе, основные из которых:

  1. Исключить граничные пиксели.
  2. Принять значения за границей равными 0.
  3. Принять значения на границе равными ближайшему значению в пределах границы.

Фильтр: для чего используется?

1. Сглаживание изображений:

Устранение шума. Например, на изображении может присутствовать шум, связанный с особенностями камеры с низким качеством съёмки. В таких случаях применяется сглаживание, при этом изображение становится немного смазанным.

Устранение выбросов/outliers. Под выбросами понимаются пиксели изображения, которые значительно отличаются от соседних пикселей. Шум относится к выбросам, при этом выбросы могут присутствовать только на некоторых участках изображения - например, выгоревшие пиксели матрицы камеры, а шум обычно возникает на изображении целиком.

2. Извлечение характеристик:

Границы объектов. Фильтры используются, чтобы находить характерные линии на изображении, из которых затем составляются границы объектов. С помощью границ объектов в простых случаях можно определить класс объекта, например, сопоставив с шаблоном границы.

3. Машинное обучение/нейронные сети:

Свёрточные/convolutional слои. При использовании нейросетей применимо к изображениям фильтры используются в свёрточных слоях нейросети, при этом ядра фильтров могут быть как добавлены вручную, так и вычислены в процессе обучения нейросети.

2. Функции OpenCV для применения фильтров

Давайте рассмотрим готовые функции OpenCV для применения различных фильтров.

Для начала посмотрим, как определить ядро фильтра: это можно сделать с помощью numpy, используя ones и array. Вообще стоит сказать, что при использовании OpenCV в Python придётся часто сталкиваться с numpy, так как изображение OpenCV в Python по сути является массивом numpy. Это не относится к OpenCV для C++, где для изображения используется собственная структура.

Для применения ядра фильтра к изображению, то есть, собственно, для фильтрации используется функция OpenCV filter2D.


Помимо функции filter2D в OpenCV есть ряд готовых фильтров, в которые уже зашиты необходимые ядра, например, размытие


3. Варианты фильтров

Тождественное отображение/Identity Kernel

Преобразование изображения само в себя.

Обнаружение граней/Edge Detection

Обнаружение граней изображения.

Повышение чёткости/Sharpen Kernel

Повышение чёткости для слегка размытых изображений.

Тиснение/Emboss Kernel

Фильтр тиснения позволяет получить карту освещения. В основе фильтра тиснения используются следующий фильтр.

Фильтр Собеля/Sobel Kernels

Фильтр Собеля позволяет обнаруживать горизонтальные и вертикальные линии на изображении.

Вертикальный фильтр Собеля:

Горизонтальный фильтр Собеля:

OpenCV: фильтр Собеля:

Спецификация функции Sobel

Фильтр Гаусса/Gaussian Blur

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

OpenCV: фильтр Гаусса

Спецификация функции GaussianBlur

Dilate и erode

Dilate - расширение.

Erode - сужение.

Данные операции используются, чтобы устранить мелкий шум на краях объектов и получить более ровные контуры.

  1. Dilate/расширение: пиксель заполнен - заполнить пиксели рядом.
  2. Erode/сужение: пиксели рядом заполнены - оставить пиксель заполненным.

OpenCV: dilate и erode

Thresold

  1. Попиксельная обработка изображения.
  2. Значение пикселя меняется в зависимости от его текущего значения.

OpenCV: threshold

Спецификация функции threshold

threshold(image, thresh, maxval, type) -> retval, result

retval - результат применения, можно игнорировать.

image - исходное изображение.

thresh - граничное значение.

maxval - максимальное значение, использование зависит от type.

threshold(image, thresh, maxval, type) -> retval, result

type - тип ограничения:

  1. cv.THRESH_BINARY
  2. cv.THRESH_BINARY_INV
  3. cv.THRESH_TRUNC
  4. cv.THRESH_TOZERO
  5. cv.THRESH_TOZERO_INV

4. Сочетание фильтров

Помимо того, что фильтры можно применять по отдельности, их также можно сочетать, при этом работает ряд свойств.

Сочетание фильтров: свойства

Коммутативность: A * B = B * A

Ассоциативность: A * (B * C) = (A * B) * C

Дистрибутивность: A * (B + C) = A * B + A * C

Умножение на скаляр: x(A * B) = (xA) * B = A * (xB)

Сочетание фильтров: пример

kernel = numpy.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]])

result = cv2.filter2D(cv2.GaussianBlur(image, (5, 5), 0), -1, kernel)

Размытие позволяет уменьшить влияние шума на результат и получить искомые границы объектов.

5. Фильтры для машинного обучения

Свёрточные нейронные сети

Фильтры используются в нейронных сетях, используемых для обработки изображений. Мы в дальнейшем детальнее рассмотрим устройство нейронных сетей, но в простом случае можно представить нейросеть как последовательность свёрток.

Примеры фильтров

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

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


Практическое задание:
Применить фильтр Edge Detection к изображению.
Домашнее задание:
Применить любые 3 фильтра к изображению
Создать собственный фильтр при помощи сочетания и применить к изображению.

Завершить и продолжить  
Обсуждение

0 Комментарии