2014-02-06 55 views
0

我遇到了以下问题。 我需要使用线性过滤器来过滤矩阵/图像,但我只想过滤那些周围有足够数量邻居的像素(根据内核大小)。具体来说,使用5x5内核过滤32x32图像的结果应该是28x28大小。
是否可以使用OpenCV内置函数以相对简单的方式执行此类处理?OpenCV filter2D:仅过滤部分矩阵/图像

回答

0

在opencv中有一个叫做cv :: filter2D的函数,但是输出图像的大小与输入图像的大小相同(在过滤过程中的零阶段)。还有另一个图像/数学库叫做vxl,在那里你可以找到适合你需求的convolution operator

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来进行处理,而不用明确裁剪和克隆结果(如果有大量的重复处理,克隆可能会很费时间)。 – klakhman

+0

如果您不需要使用out_img进行操作,则可以避免克隆 - 只需使用 cv :: Mat裁剪= in_img(roi); –