A.albin
A.albin

Reputation: 274

OpenCV col-wise standard deviation result vs MATLAB

I've seen linked questions but I can't understand why MATLAB and OpenCV give different results.

  1. MATLAB Code

    >> 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. Using OpenCV and this function:

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

    Applied to the same matrix yields the following:

    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]
    

I'm pretty sure that the OpenCV and MATLAB std function are correct, and thus can't find what I'm doing wrong, am I missing a type conversion? Something else?

Upvotes: 1

Views: 255

Answers (1)

Sardar Usama
Sardar Usama

Reputation: 19689

The standard deviation you're calculating in OpenCV is normalised by number of observations (N) whereas you're calculating standard deviation in MATLAB normalised by N-1 (which is also the default normalisation factor in MATLAB and is known as Bessel's correction). Hence there is the difference.

You can normalise by N in MATLAB by selecting the second input argument as 1:

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

Upvotes: 2

Related Questions