【问题标题】:How can I imitate medfilt2 of Matlab with OpenCV?如何用 OpenCV 模仿 Matlab 的 medfilt2?
【发布时间】:2012-09-21 17:45:24
【问题描述】:

我有一个用 Matlab 编写的成像应用程序,需要使用 OpenCV 将其转换为 C++ 应用程序。但我似乎找不到一种简单的方法来用 OpenCV 模仿 medfilt2。

我尝试了 MedianBlur,但没有产生相同的结果。谁能给我这个任务的任何线索?

【问题讨论】:

  • medfilt2cv::medianBlur 有何不同?
  • @Georg,我能看到的唯一方法是,Matlab 允许您指定“每个输出像素包含相应像素周围 m×n 邻域中的中值”,以及 cv::medianBlur使用ksize*ksize 孔径。不确定medfilt2 是否需要通用m*n 孔径提供该选项。
  • @HerrvonWurst medfilt2 可以采用偶数大小的窗口,但 medianBlur 只采用奇数大小的窗口。

标签: c++ matlab opencv


【解决方案1】:

在我看来,这个link 应该有你需要的东西。 但是,如果您想通过m 窗口指定n,看起来您必须进行一些小修改。

     //   Pick up window elements
     int k = 0;
     // Original: element window[9];
     element window[n_win*m_win];
     for (int j = m_win - 1; j < m_win; ++j)
        for (int i = n_win - 1; i < n_win; ++i)
           window[k++] = image[j * N + i];
     //   Order elements (only half of them)
     // make sure (n_win*m_win)/2 is odd :-)
     for (int j = 0; j < (n_win*m_win)/2; ++j)
     {
        //   Find position of minimum element
        int min = j;
        for (int l = j + 1; l < n_win*m_win; ++l)
        if (window[l] < window[min])
           min = l;
        //   Put found minimum element in its place
        const element temp = window[j];
        window[j] = window[min];
        window[min] = temp;
     }
     //   Get result - the middle element
     result[(m - 1) * (N - 2) + n - 1] = window[4];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多