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

标签 c++ matlab opencv3.0

我看过相关问题,但我不明白为什么 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 )。所以有区别。

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

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

关于c++ - OpenCV col-wise 标准偏差结果与 MATLAB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50754864/

相关文章:

matlab - 分桶算法

image - 在 MATLAB 中反转旋转图像的问题

matlab - 查找唯一值的索引时 "unique"函数的替代方案(Matlab)

c++ - 流网络摄像头速度慢 "detectMultiScale"

c++ - 如何复制 ifstream 的状态?

C++ - 多线程 - 线程之间的通信

c++ - 为什么在这种情况下使用 vector<>.push_back() 时不使用动态内存?

compiler-errors - 如何从opencv gpumat创建推力device_vector

c++ - 如何提取现有码本对应的BOW描述符?

c++ - 如何在 Visual Studio C++ 11 运行时定义二维数组?