Сглаживание размера ядра для фильтра box

#python #opencv #image-processing #filter #signal-processing

#python #opencv #обработка изображений #Фильтр #обработка сигналов

Вопрос:

Для фильтра box в OpenCV размер сглаживающего ядра может быть определен параметром ksize в cv2.boxFilter(). Я хочу знать, является ли ksize на самом деле размером в положительных направлениях X и Y или вокруг начала координат? (a) показывает фильтр блоков. Я предполагаю, что соответствующий ksize будет равен (1, 1)

На изображении выше — 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 Извините за это! Я это исправил.