Стандартное отклонение по столбцам в OpenCV

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

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

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


person Armin Meisterhirn    schedule 18.05.2015    source источник
comment
docs.opencv.org/modules/core/doc/ ? Гугл помогает;)   -  person mprat    schedule 18.05.2015


Ответы (2)


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

    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);
    }
person CV_User    schedule 18.05.2015
comment
Это именно то, чем я сейчас занимаюсь. Я искал однострочное заявление. Думаю, я мог бы передать это на аутсорсинг в функцию, а затем сделать из нее однострочную вещь. - person Armin Meisterhirn; 19.05.2015
comment
это похоже на среднее и стандартное отклонение каждого элемента столбца. - person Abc; 09.11.2017

Следующее не находится в одной строке, но это другая версия без циклов:

    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
person Eagle    schedule 18.10.2016