Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

you can try this:

double medianMat(cv::Mat Input, int nVals){
    // COMPUTE HISTOGRAM OF SINGLE CHANNEL MATRIX
    float range[] = { 0, nVals };
    const float* histRange = { range };
    bool uniform = true; bool accumulate = false;
    cv::Mat hist;
    calcHist(&Input, 1, 0, cv::Mat(), hist, 1, &nVals, &histRange, uniform, accumulate);

    // COMPUTE CUMULATIVE DISTRIBUTION FUNCTION (CDF)
    cv::Mat cdf;
    hist.copyTo(cdf);
    for (int i = 1; i <= nVals-1; i++){
        cdf.at<float>(i) += cdf.at<float>(i - 1);
    }
    cdf /= Input.total();

     // COMPUTE MEDIAN
     double medianVal;
     for (int i = 0; i <= nVals-1; i++){
         if (cdf.at<float>(i) >= 0.5) { medianVal = i;  break; }
     }
     return medianVal/nVals; 
}

this great and fast solution was found at (see last answer): https://stackoverflow.com/questions/30078756/super-fast-median-of-matrix-in-opencv-as-fast-as-matlab