2015-05-18 2 views
4

Есть ли прямой способ вычислить стандартное отклонение по столбцу для матрицы в opencv? Подобно std в Matlab. Я нашел один для среднего значения:Стандартное отклонение по столбцу в OpenCV

cv::Mat col_mean; 
reduce(A, col_mean, 1, CV_REDUCE_AVG); 

, но я не могу найти такую ​​функцию для стандартного отклонения.

+1

http://docs.opencv.org/modules/core/doc/operations_on_arrays.html# meanstddev? Google помогает;) – mprat

ответ

5

Вот быстрый ответ на то, что вы ищете. Я добавил как стандартное отклонение, так и среднее значение для каждого столбца. Код может быть легко изменен для строк.

cv::Mat A = ...; // FILL IN THE DATA FOR YOUR INPUT MATRIX 
    cv::Mat meanValue, stdValue; 
    cv::Mat colSTD(1, A.cols, CV_64FC1); 
    cv::Mat colMEAN(1, A.cols, CV_64FC1);  

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

Это именно то, что я сейчас делаю. Я искал однострочное заявление. Думаю, я мог бы передать это в функцию, а затем превратить ее в однострочное. –

+0

Это похоже на среднее и стандартное отклонение каждого элемента столбца. – Abc

2

Ниже не в одной строке, но это другая версия без петель:

reduce(A, meanOfEachCol, 0, CV_REDUCE_AVG); // produces single row of columnar means 
    Mat repColMean; 
    cv::repeat(meanOfEachCol, rows, 1, repColMean); // repeat mean vector 'rows' times 

    Mat diffMean = A - repColMean; // get difference 
    Mat diffMean2 = diffMean.mul(diffMean); // per element square 

    Mat varMeanF; 
    cv::reduce(diffMean2, varMeanF, 0, CV_REDUCE_AVG); // sum each column's elements to get single row 
    Mat stdMeanF; 
    cv::sqrt(varMeanF, stdMeanF); // get standard deviation 
Смежные вопросы