根据阈值从平均滤波器中排除像素

时间:2016-11-04 03:00:55

标签: c++ opencv image-processing opencv3.0

我正在尝试按照original paper中的描述实现KinectFusion算法。我已经到了他们计算深度图金字塔的部分,基本上是一堆以不同分辨率采样的深度图。这就是我的问题所在

  

通过块平均从D1计算子采样版本D1 + 1   然后再采样到分辨率的一半。 使用深度值   只有当它们在中心像素的3σr范围内时才能达到平均值   确保在深度边界上不会发生平滑

(强调我的)

我希望我的实现能够实时运行,所以我不想抛出嵌套的for循环,但是我没有看到任何其他方法来排除超出阈值的深度值。

我已经调查了

boxFilterfilter2Dblur,其中没有一个似乎有一个可以根据阈值排除像素的参数

这似乎是均值和中值滤波之间的折衷,但在您说双边之前,我希望尽可能贴近原始实现。作者知道双边过滤是什么,并在前一节中使用它,所以他们清楚地知道它并且如果他们愿意可以使用它。我可能会用替代双边过滤进行未来的实验,但这不是我正在寻找的解决方案。

是否有任何有助于高效执行此操作的功能?或者我是否需要使用嵌套for循环?

这是我目前的for-loop实现

 cv::Mat pyramid(cv::Mat& imgMat){
        cv::Mat aveMat(imgMat); // Make a copy of my image for storing the averages
        for(int row = 0; row < aveMat.rows; row++){
            for(int col=0; col  <aveMat.cols; col++){

                //Select the block around the current pixel including edge cases
                int startY = row-1;
                if(row == 0)
                    startY = row;

                int endY = row +1;
                if(row + 1 == aveMat.rows)
                    endY = row;

                int startX = col-1;
                if(col == 0)
                    startX = col;

                int endX = col+1;
                if(col + 1 == aveMat.cols)
                    endX = col;

                cv::Mat block = imgMat(cv::Range(startY, endY), cv::Range(startX, endX));
                float curVal = imgMat.at<float>(row, col);

                //Use the mean function with a mask to select values meeting the threshold
                cv::Scalar meanVal = cv::mean(block, block<(curVal+SIGMA)&block>(curVal-SIGMA));
                aveMat.at<float>(row,col)=meanVal[0];
            }
        }

        //Subsample averaged image at half resolution
        cv::Mat outMat;
        cv::resize(aveMat, outMat, cv::Size(), 0.5, 0.5, cv::INTER_NEAREST);
        return outMat;
    }

0 个答案:

没有答案