我看过相关问题,但我不明白为什么 MATLAB 和 OpenCV 会给出不同的结果。
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
使用 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/