OpenCV filter2D: фильтрация только части матрицы / изображения

0

Я столкнулся со следующей проблемой. Мне нужно отфильтровать матрицу/изображение с помощью линейного фильтра, но я хочу фильтровать только те пиксели, которые имеют достаточное количество соседей вокруг себя (в зависимости от размера ядра). Чтобы быть конкретным, результат фильтрации изображения 32x32 с ядром 5x5 должен иметь размер 28x28.
Можно ли сделать такую обработку относительно простым способом с помощью встроенных функций OpenCV?

Теги:
opencv
filtering

2 ответа

2
int kernel_size = 3;
cv::Mat in_img, out_img;
cv::Mat kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);       
cv::filter2D(in_img, out_img, -1 , kernel); //filtering

cv::Size size = in_img.size();
cv::Rect roi(kernel_size, kernel_size,size.width - 2*kernel_size, size.height - 2*kernel_size);
cv::Mat cropped = in_img(roi).clone(); //cropping
  • 0
    Спасибо большое! Я думал, что каким-то образом можно настроить filter2d для выполнения обработки без явного обрезания и клонирования результата (поскольку клонирование может занять много времени в случае значительного числа повторов этой обработки).
  • 0
    Вы можете избежать клонирования, если вам не нужно работать с out_img - просто используйте cv :: Mat cropped = in_img (roi);
0

есть функция cv :: filter2D в opencv, но выходное изображение будет иметь тот же размер, что и входное изображение (с нулевыми прокладками во время фильтрации). Существует еще одна графическая/математическая библиотека, называемая vxl, там вы можете найти оператор свертки, подходящий для ваших требований.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню