【问题标题】:OpenCV Median Filter for double Matrix用于双矩阵的 OpenCV 中值滤波器
【发布时间】:2014-10-07 12:56:43
【问题描述】:

我在 C++ 项目中使用 OpenCV。我从立体视觉相机获得了深度图,并想用中值滤波器对其进行过滤。我的深度图是cv::Mat_< double>。 (我不能改变格式,只能转换)。

是否有可能为cv::Mat_< double> 输入实现中值滤波器的功能?

medianBlur(cv::Mat_<double> src, cv::Mat_<double> dst, int ksize)

在文档中,我只找到了对 CV_8U、CV_16U 或 CV_32F 图像的支持。 http://docs.opencv.org/modules/imgproc/doc/filtering.html?highlight=medianblur#medianblur

OpenCV 库中是否有针对我的问题的解决方案。 我应该制作自己的中值滤波器吗?如果必须,您有什么好的参考吗?

【问题讨论】:

    标签: c++ opencv filter median


    【解决方案1】:

    你可以这样做:

    cv::Mat_<double> input;
    cv::Mat_<double> output; // or  cv::Mat output;
    cv::medianBlur(input, output, 3);
    

    PS:您必须确保 int ksize 只能是 3 或 5 用于您的输入(双垫)。如documentation中所说:

    参数:
    src——输入1、3、4通道图像; ksize为3或5时,图像深度应为CV_8U, CV_16U或CV_32F,对于更大的光圈尺寸,只能为CV_8U。

    ...

    ksize – 光圈线性大小; 必须是奇数且大于 1,例如:3、5、7 ...

    【讨论】:

      【解决方案2】:

      可以使用 cv::UMat 来操作 OpenCL/CUDA

      cv::UMat input;
      cv::UMat output;
      

      对于 ksize >5

          cv::UMat tmp;
          if (ksize>5){
              switch (input.type()) {
              case CV_16UC1:
              case CV_16UC3:
              case CV_16UC4:
                  input.convertTo(tmp,CV_8U,1./255.);
                  break;
              case CV_32FC1:
              case CV_32FC3:
              case CV_32FC4:
                  input.convertTo(tmp,CV_8U,255.);
                  break;
              default:
                  input.assignTo(tmp);
                  break;
              }
          }else{
              input.assignTo(tmp);
          }
          try{
            cv::medianBlur(tmp, output, ksize);
          }
          catch (cv::Exception& ex) {
            qWarning()<<"medianBlurImage error"<<ex.what();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 2015-04-17
        • 1970-01-01
        相关资源
        最近更新 更多