Фильтрация изображений с использованием свертки OpenCV в Python

Фильтрация изображений – это метод фильтрации изображения, подобного одномерному аудиосигналу, но в 2D.

В этом уроке мы узнаем, как фильтровать изображение с помощью 2D-свертки с функцией cv2.filter2D(). Свертка происходит между исходным изображением и ядром.

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

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

Фильтр высоких частот похож на детектор границ. Он дает высокий уровень при значительном изменении значений соседних пикселей.

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

Пример 1: с двумерной сверткой

В этом примере мы выполним следующую последовательность шагов:

  • Прочтите изображение. Это наш источник.
  • Определите фильтр нижних частот. В этом примере наш фильтр нижних частот представляет собой массив 5 × 5 со всеми единицами и усреднением.
  • Примените свертку между исходным изображением и ядром с помощью функции cv2.filter2D().
import numpy as np
import cv2

#read image
img_src = cv2.imread('sample.jpg')

#prepare the 5x5 shaped filter
kernel = np.array([[1, 1, 1, 1, 1], 
                   [1, 1, 1, 1, 1], 
                   [1, 1, 1, 1, 1], 
                   [1, 1, 1, 1, 1], 
                   [1, 1, 1, 1, 1]])
kernel = kernel/sum(kernel)

#filter the source image
img_rst = cv2.filter2D(img_src,-1,kernel)

#save result image
cv2.imwrite('result.jpg',img_rst)

Вывод:

Фильтр нижних частот

Выходное изображение выглядит так, как будто вся зернистая информация исчезла или как будто вы сняли изображение, которое не в фокусе.

Пример 2

В этом примере для фильтра высоких частот мы выполним следующую последовательность шагов:

  • Прочтите изображение. Это наш источник.
  • Определите фильтр высоких частот. В этом примере наш фильтр верхних частот представляет собой массив 3 × 3, который является переменной ядра в приведенной ниже программе.
  • Примените свертку между исходным изображением и ядром с помощью функции cv2.filter2D().
import numpy as np
import cv2

#read image
img_src = cv2.imread('sample.jpg')

#edge detection filter
kernel = np.array([[0.0, -1.0, 0.0], 
                   [-1.0, 4.0, -1.0],
                   [0.0, -1.0, 0.0]])

kernel = kernel/(np.sum(kernel) if np.sum(kernel)!=0 else 1)

#filter the source image
img_rst = cv2.filter2D(img_src,-1,kernel)

#save result image
cv2.imwrite('result.jpg',img_rst)

Вывод:

Фильтр высоких частот

Выходное изображение выглядит так, как будто вся зернистая информация сохранена, а остальная часть исчезла.

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

kernel = np.array([[0.0, -1.0, 0.0], 
                   [-1.0, 5.0, -1.0],
                   [0.0, -1.0, 0.0]])

Фильтр высоких частот - функция cv2.filter2D()

Пример 3

В этом примере мы определим собственное ядро, в котором оно будет определять только горизонтальные линии, если они есть.

import numpy as np
import cv2

#read image
img_src = cv2.imread('sample.jpg')

#kernal sensitive to horizontal lines
kernel = np.array([[-1.0, -1.0], 
                   [2.0, 2.0],
                   [-1.0, -1.0]])

kernel = kernel/(np.sum(kernel) if np.sum(kernel)!=0 else 1)

#filter the source image
img_rst = cv2.filter2D(img_src,-1,kernel)

#save result image
cv2.imwrite('result.jpg',img_rst)

Вывод:

Определение собственного ядра

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *