OpenCV по отношению к стандартному отклонению по сравнению с MATLAB - PullRequest
0 голосов
/ 08 июня 2018

Я видел связанные вопросы, но не могу понять, почему 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 правильная, и поэтому не может найти то, что я делаю неправильно, я пропускаю преобразование типов?Что-то еще?

1 Ответ

0 голосов
/ 08 июня 2018

Стандартное отклонение, которое вы вычисляете в OpenCV, нормировано на количество наблюдений (N), тогда как вы рассчитываете стандартное отклонение в MATLAB, нормализованное на N-1 (которое также является коэффициентом нормализации по умолчанию в MATLAB и известнокак коррекция Бесселя ).Следовательно, есть разница.

Вы можете нормализовать на N в MATLAB, выбрав второй входной аргумент как 1:

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