Ручные фильтры - это не то, о чем можно почесать голову. Это связано с тем, что если кому-то нужно обнаружить края на изображении, они могут напрямую использовать алгоритм обнаружения границ Канни, который имеет различные параметры, чтобы сделать обнаружение более надежным и точным. Также, что касается приложений типа 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]]
Вы можете попробовать свой собственный фильтр на своем входе. Ваше здоровье !
Полный код:
Если у вас есть какие-либо вопросы или комментарии, не стесняйтесь добавлять их ниже. Спасибо за ваше время.