在OpenCV中实现Matlab API ordfilt2

时间:2013-05-22 06:41:17

标签: opencv

我正在将用Matlab编写的代码翻译成OpenCV。 在Matlab中,有ordfilt2函数。 OpenCV中是否有类似的实现? 感谢

3 个答案:

答案 0 :(得分:1)

我在OpenCV中使用侵蚀或扩张在Matlab中实现了ordfilt2()。 Matlab中的ordfilt2(A,1,ones(3,3))是侵蚀函数,可以在OpenCV中替换为cv::erode(im, mx, mk,cv::Point(-1,-1),1,BORDER_CONSTANT );。 Matlab中的ordfilt2(A,9,(3,3))是扩张的,可以用cv::dilate(im, mx, mk,cv::Point(-1,-1),1,BORDER_CONSTANT );代替。

答案 1 :(得分:0)

我认为没有一般的。浏览here以查找是否适合您。

来自Matlab帮助:

  

B = ordfilt2(A,order,domain)用A替换A中的每个元素   orderth元素在由...指定的有序邻居集合中   域中的非零元素。

所以你有一个图像A,你的幻灯片是一个内核(域),它对像素值进行排序,你总是选择一个特定的顺序。

OpenCV步骤(对于灰度图像):

1)克隆图像画布

2)在画布的每个像素上滑动

3)在图像上创建相同像素的子区域的矢量

4)对矢量进行排序

5)将新图像像素值设置为所需的矢量元素。

答案 2 :(得分:0)

dilation = ordfilt2(proj, 5, ones(1,5));  %in matlab

Following is my implementation in opencv, proj is 1D matrix of size (26,1)
Mat dilation = proj.clone(); Mat array = Mat::zeros(5, 1, CV_32FC1);
    for (int i = 0; i < 26; i++)
    {
        (i - 2) < 0 ? array.at<float>(0, 0) = 0 : array.at<float>(0, 0) = proj.at<float>(i - 2, 0);
        (i - 1) < 0 ? array.at<float>(1, 0) = 0 : array.at<float>(1, 0) = proj.at<float>(i - 1, 0);
        (i) < 0 ? array.at<float>(2, 0) = 0 : array.at<float>(2, 0) = proj.at<float>(i, 0);
        (i + 1) >= 26? array.at<float>(3, 0) = 0 : array.at<float>(3, 0) = proj.at<float>(i + 1, 0);
        (i + 2) >= 26? array.at<float>(4, 0) = 0 : array.at<float>(4, 0) = proj.at<float>(i + 2, 0);
        float temp = 0;
        for (int j = 0; j < 5; j++)
        {
            if (temp < array.at<float>(j, 0))
                temp = array.at<float>(j, 0);
        }
        dilation.at<float>(i, 0) = temp;
    }