【问题标题】:OpenCV filter2D: Filtering only part of the matrix/imageOpenCV filter2D:仅过滤部分矩阵/图像
【发布时间】:2014-02-06 15:27:15
【问题描述】:

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

【问题讨论】:

    标签: c++ opencv filtering


    【解决方案1】:
    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
    

    【讨论】:

    • 非常感谢!我认为在不显式裁剪和克隆结果的情况下调整 filter2d 以进行处理是可能的(因为在此处理重复的数量很大的情况下,克隆可能会很耗时)。
    • 你可以避免克隆,如果你不需要使用 out_img 操作 - 只需使用 cv::Mat cropped = in_img(roi);
    【解决方案2】:

    opencv 中有一个名为 cv::filter2D 的函数,但输出图像将与输入图像大小相同(过滤期间填充为零)。还有另一个名为 vxl 的图像/数学库,您可以在那里找到适合您要求的convolution operator

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 2015-07-20
      • 2017-12-12
      • 1970-01-01
      • 2018-11-23
      相关资源
      最近更新 更多