Ручные фильтры - это не то, о чем можно почесать голову. Это связано с тем, что если кому-то нужно обнаружить края на изображении, они могут напрямую использовать алгоритм обнаружения границ Канни, который имеет различные параметры, чтобы сделать обнаружение более надежным и точным. Также, что касается приложений типа CNN, то архитектура зарабатывает сама по себе. Так что ручная инженерия здесь не нужна.

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

Итак, давайте копать.

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

  • 3D-фильтр
    Создание 3D-фильтра для изображения с 3 каналами (RGB) путем размещения копии 2D-фильтра по размеру канала.
# 3D filter for image with 3 channels
filter_3D = np.stack((filter, filter, filter), axis=2)
  • Нулевое заполнение входных изображений
    Это делается для того, чтобы выходное изображение было одинаковой высоты и ширины. (Не обязательно)
img_pad = np.pad(img, ((pad_width, pad_width), (pad_width, pad_width), (0, 0)), mode='constant', constant_values=0)
  • Применение фильтра
    Применяет фильтр к изображению, используя понимание списка.
img_pad = np.array([[np.sum(np.multiply(img_pad[i:i+filter_size, j:j+filter_size, :], filter_3D)) for j in range(img_pad.shape[1]-filter_size+1)] for i in range(img_pad.shape[0]-filter_size+1)])

Пример:
вертикальный фильтр →[[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]]
горизонтальный фильтр →[[-1, - 1, -1], [0, 0, 0], [1, 1, 1]]

Вы можете попробовать свой собственный фильтр на своем входе. Ваше здоровье !

Полный код:

Если у вас есть какие-либо вопросы или комментарии, не стесняйтесь добавлять их ниже. Спасибо за ваше время.