Я столкнулся со следующей проблемой. Мне нужно отфильтровать матрицу/изображение с помощью линейного фильтра, но я хочу фильтровать только те пиксели, которые имеют достаточное количество соседей вокруг себя (в зависимости от размера ядра). Чтобы быть конкретным, результат фильтрации изображения 32x32 с ядром 5x5 должен иметь размер 28x28.
Можно ли сделать такую обработку относительно простым способом с помощью встроенных функций OpenCV?
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
есть функция cv :: filter2D в opencv, но выходное изображение будет иметь тот же размер, что и входное изображение (с нулевыми прокладками во время фильтрации). Существует еще одна графическая/математическая библиотека, называемая vxl, там вы можете найти оператор свертки, подходящий для ваших требований.