OpenCV的标准偏差结果与MATLAB相比较

时间:2018-06-08 06:44:26

标签: c++ matlab opencv3.0

我看过链接的问题,但我无法理解为什么MATLAB和OpenCV会给出不同的结果。

  1. MATLAB代码

    double getColWiseStd(cv::Mat in)
    {
        CV_Assert( in.type() == CV_64F );
    
        cv::Mat meanValue, stdValue, m2, std2;
        cv::Mat colSTD(1, A.cols, CV_64F);
        cv::Mat colMEAN(1, A.cols, CV_64F);       
    
        for (int i = 0; i < A.cols; i++)
        {           
            cv::meanStdDev(A.col(i), meanValue, stdValue);
            colSTD.at<double>(i) = stdValue.at<double>(0);
            colMEAN.at<double>(i) = meanValue.at<double>(0);
        }
    
        std::cout<<"\nCOLstd:\n"<<colSTD<<std::endl;
        cv::meanStdDev(colSTD, m2, std2);
        std::cout<<"\nCOLstd_f:\n"<<std2<<std::endl;
    
    
        return std2.at<double>(0,0);
    }
    
  2. 使用OpenCV和此功能:

    Matrix: 
    [6,   4, 23, -3;
     9, -10,  4, 11;
     2,   8, -5,  1]
    
    COLstd:
    [2.867441755680876, 7.71722460186015, 11.67142760000773, 5.887840577551898]
    
    COLstd_f:
    [3.187726614989861]
    

    应用于相同的矩阵会产生以下结果:

    std
  3. 我很确定OpenCV和MATLAB {{1}}函数是正确的,因此找不到我做错了什么,我错过了类型转换吗?还有别的吗?

1 个答案:

答案 0 :(得分:1)

您在OpenCV中计算的标准偏差通过观察次数(io_related)进行归一化,而您正在计算由N归一化的MATLAB中的标准差(这也是默认的归一化因子) MATLAB,被称为 Bessel's correction )。因此存在差异。

您可以通过选择第二个输入参数N-1在MATLAB中按N进行标准化:

1