#python #opencv #image-processing #filter #signal-processing
#python #opencv #обработка изображений #Фильтр #обработка сигналов
Вопрос:
Для фильтра box в OpenCV размер сглаживающего ядра может быть определен параметром ksize в cv2.boxFilter(). Я хочу знать, является ли ksize на самом деле размером в положительных направлениях X и Y или вокруг начала координат?
На изображении выше — ksize должно быть (1, 1), правильно? Или это должно быть (0.5, 1)? Для ширины, скажем, 5 в обоих направлениях, должен ли ksize быть (5, 5) или (10, 5)? В указанном случае я бы хотел, чтобы ширина составляла 5 как в положительном, так и в отрицательном направлениях X, а высота — 5 в направлении y. Я думаю, что y в любом случае должно быть 5, потому что отрицательный y для фильтра box на самом деле не имеет особого смысла.
Комментарии:
1. Почему отрицательный y не имеет особого смысла? В чем разница между направлениями x и y для вас?
2. В любом случае,
ksize
это полная ширина и высота блока, а поле определяется симметрично вокруг начала координат.
Ответ №1:
Это легко выяснить, протестировав импульсную характеристику boxFilter. Пусть x
будет изображение размером 9×9
>>> x
array([[0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 1., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0.]])
Затем запуск boxFilter с ksize= (5,5), поскольку cv2.boxFilter(x, 6, (5,5))
производит
array([[0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[0. , 0. , 0.04, 0.04, 0.04, 0.04, 0.04, 0. , 0. ],
[0. , 0. , 0.04, 0.04, 0.04, 0.04, 0.04, 0. , 0. ],
[0. , 0. , 0.04, 0.04, 0.04, 0.04, 0.04, 0. , 0. ],
[0. , 0. , 0.04, 0.04, 0.04, 0.04, 0.04, 0. , 0. ],
[0. , 0. , 0.04, 0.04, 0.04, 0.04, 0.04, 0. , 0. ],
[0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ]])
Как и сказал Крис, ksize — это полная ширина и высота блока, а фильтр центрирован.
Комментарии:
1. Хорошая демонстрация того, как разобраться в себе. Стоит проголосовать, даже если вы неправильно написали мое имя. 🙂
2. Спасибо за этот Pascal!
3. Импульсный отклик — это секретное оружие для обратного проектирования фильтра.
4. @CrisLuengo Извините за это! Я это исправил.