OpenCV col-wise 标准偏差结果与 MATLAB

OpenCV col-wise standard deviation result vs MATLAB

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

  1. MATLAB 代码

    >> A = [6 4 23 -3; 9 -10 4 11; 2 8 -5 1]
    A =
     6     4    23    -3
     9   -10     4    11
     2     8    -5     1
    
    >> Col_step_1 = std(A, 0, 1)
    Col_step_1 =
     3.5119    9.4516   14.2945    7.2111
    
    >> Col_final = std(Col_step_1)
    Col_final =
     4.5081
    
  2. 使用 OpenCV 和这个函数:

    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);
    }
    

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

    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]
    

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

您在 OpenCV 中计算的标准偏差按观察次数 (N) 归一化,而您在 MATLAB 中计算的标准偏差按 N-1 归一化(这也是默认归一化) MATLAB 中的因子,称为 Bessel's correction)。所以有区别。

您可以在 MATLAB 中通过 N 进行归一化,方法是将第二个输入参数选择为 1:

Col_step_1 = std(A, 1, 1); 
Col_final = std(Col_step_1, 1);