使用opencv手动应用中值滤波器,与medianBlur函数的差异

时间:2015-07-03 09:35:30

标签: c++ opencv filter median

当我应用这样的中值滤波器时:

Mat medianFilter;
medianBlur(histEqu, medianFilter, 3);

如果我应用中值滤波器,我会期望相同的结果:

Mat manualMedianFiler;
    float factor = 1 / 9.0;
    Mat kernelMedian = (Mat_<float>(3, 3) <<
        factor, factor, factor,
        factor, factor, factor,
        factor, factor, factor);
    filter2D(histEqu, manualMedianFiler, CV_8U, kernelMedian, Point(-1,-1), 0, 4);

结果矩阵是相似的,但它们不相等。 难道我做错了什么?应用中值滤波器的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

您的manualMedianFilter不是中位数过滤器,而是卑鄙的过滤器,对应cv::boxFilter

答案 1 :(得分:4)

作为@Miki答案的补充,我提醒你,中值滤波器是给出N个样本(在这种情况下取​​自中心像素周围的3x3平方)的中值滤波器对它们的值进行排序并将中间值过滤掉。所以给出(1,7,2,2,1,9,24,4,5)后,得到(1,1,2,2,4,5,7,9,22),中位数为4,而平均值是(1 + 7 + 2 + 2 + 1 + 9 + 22 + 4 + 5)/ 9 = 53/9 - > 5.8。

简而言之:中值滤波器不是线性的。

在想要移除尖峰的地方首选中位数过滤器。

答案 2 :(得分:-1)

这里有一个简单的:

void MedianFilter()
{
    Mat image= imread("C:\\Users\\User\\Desktop\\10.jpg", 1);
    Mat image1;
    cvtColor(image, image1, COLOR_BGR2GRAY);
    imshow("testx", image1);
    uchar * data = image1.data;
    vector<int> values;
    for (auto index = 0; index < (image1.rows*image1.cols); index++)
    {
        for (size_t i = 0; i < 13; i++) \\ 13 is the element to get the median from...
        {
            values.push_back(data[index + i]);

        }
        std::sort(values.begin(), values.end());

        image1.data[index] = values[6]; // 6 is the median  of 13 plus the index number (0-6) ...
        values.clear();
    }


    imshow("test", image1);
    waitKey(0);
}